模拟外设
RA4M1 内部集成了模数转换器(ADC)、数模转换器(DAC)和运算放大器。板上把这三部分都引到了模拟排针:A0~A5 作模拟输入,A0 兼作 DAC 输出,A1、A2、A3 分别是运算放大器的同相输入、反相输入与输出。
| 外设 | 引脚 | 分辨率 |
|---|---|---|
| ADC | A0~A5 | 默认 10 位,可设为 12 位或 14 位 |
| DAC | A0 | 最高 12 位 |
| 运算放大器 | 输入 A1、A2,输出 A3 | 模拟,输出范围 0~4.7 V |
提高 ADC 分辨率
默认情况下,analogRead() 返回 10 位结果。在 setup() 中调用 analogReadResolution() 可以把分辨率提高到 12 位或 14 位,适合读取变化很小的传感器信号。
void setup() {
analogReadResolution(14); // 改为 14 位分辨率
}
void loop() {
int reading = analogRead(A3); // 返回 0~16383
}
| 分辨率 | 满量程读数 |
|---|---|
| 10 位(默认) | 0~1023 |
| 12 位 | 0~4095 |
| 14 位 | 0~16383 |
改动分辨率后,同一段代码里以 1023 为上限的阈值、map() 区间和电压换算系数都要按新的满量程同步修改,否则读数会整体偏大。
用 DAC 输出模拟电压
A0 后面接的是真正的数模转换器,输出的是连续电压,不是 PWM 的方波。需要输出波形(音频、函数发生器信号)时用它,避免 PWM 滤波带来的纹波。
官方 DAC 教程使用板包自带的 AnalogWave 库,下面的程序在 A0 上生成正弦波,频率由接在 A5 的电位器调节。
#include "analogWave.h" // 引入波形生成库
analogWave wave(DAC); // 用 DAC 引脚创建 analogWave 对象
int freq = 10; // 单位 Hz,按需修改
void setup() {
Serial.begin(115200); // 串口波特率 115200
wave.sine(freq); // 生成初始频率的正弦波
}
void loop() {
// 读取 A5 的电压并映射到频率范围
freq = map(analogRead(A5), 0, 1024, 0, 10000);
Serial.println("Frequency is now " + String(freq) + " hz");
wave.freq(freq); // 更新波形频率
delay(1000); // 每秒更新一次
}
把 wave.sine(freq); 换成 wave.square(freq); 或 wave.saw(freq);,可以改输出方波或锯齿波。
- DAC 占用 A0。程序启用 DAC 输出后,A0 不能再作为模拟输入使用。
- 直接接压电蜂鸣器时声音很小,这是正常现象。要获得足够音量,用 4 Ω 或 8 Ω 扬声器配合功放模块,功放输入端接 A0。
- 输出波形接到示波器或功放前,先确认后级输入阻抗与耦合方式,避免直流分量灌入功放。
使用片内运算放大器
运算放大器可以做电压跟随、放大和比较。板包自带 OPAMP 库,初始化时选择速度模式:
#include <OPAMP.h>
void setup() {
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
void loop() {}
| 参数 | 说明 |
|---|---|
OPAMP_SPEED_LOWSPEED | 低速模式,功耗更低 |
OPAMP_SPEED_HIGHSPEED | 高速模式,功耗更高 |
初始化之后,放大器就按硬件接法工作,不需要在代码里再配置增益。
电压跟随器
把 A2 与 A3 短接。此时 A1 上的电压会原样出现在 A3 上,可用于给高阻抗信号提供驱动能力。A1 接地,A3 应接近 0 V;A1 接 3.3 V,A3 应接近 3.3 V。
同相放大
A2 与地之间接一只电阻 R1,A3 与 A2 之间接反馈电阻 R2,放大倍数为 1 + R2 / R1。取两只 10 kΩ 电阻时放大倍数为 2,A1 上 2 V 的信号在 A3 上输出约 4 V。
运算放大器的输出上限约为 4.7 V。放大后的信号超过这个值会被削顶,同时可能损坏芯片。放大倍数和被放大的输入幅度要一起核算。
改变电阻接法时先拔掉电源。带电插拔模拟排针容易把输出端短接到地,造成过流。
更完整的电路与实测波形见 Arduino 官方教程 Arduino UNO R4 Minima OPAMP。