跳到主要内容

模拟外设

RA4M1 内部集成了模数转换器(ADC)、数模转换器(DAC)和运算放大器。板上把这三部分都引到了模拟排针:A0~A5 作模拟输入,A0 兼作 DAC 输出,A1、A2、A3 分别是运算放大器的同相输入、反相输入与输出。

外设引脚分辨率
ADCA0~A5默认 10 位,可设为 12 位或 14 位
DACA0最高 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

运算放大器的输出上限约为 4.7 V。放大后的信号超过这个值会被削顶,同时可能损坏芯片。放大倍数和被放大的输入幅度要一起核算。

接线前先断电

改变电阻接法时先拔掉电源。带电插拔模拟排针容易把输出端短接到地,造成过流。

更完整的电路与实测波形见 Arduino 官方教程 Arduino UNO R4 Minima OPAMP。