Arduino项目中如何实现模拟量输出
PWM引脚是标记“~”的数字I/O引脚,包括:D3、D5、D6、D9、D10、D11,这些引脚可以输出PWM信号,实现“伪模拟”输出,用于:LED调光、电机调速、简单音频信号等对精度要求不高的场景。通过快速切换高低电平(PWM)并配合滤波电路,生成近似模拟电压。选择PWM引脚。使用输出PWM信号。value范围:0(0V)到255(5V或3.3V,取决于板卡电压)。
总所周知,Arduino的D0 ~ D13是数字I/O引脚,既可以读取,也可以输出高低电平(0V/5V)。
但是Arduino的模拟引脚(A0-A5)却是纯纯的输入引脚,可读取外部模拟信号(0 ~ 5V连续电压),对应相应的模拟量,如温度、压力、光强等多种物理量。内部的处理方式是内置了10位ADC(模数转换器),可将 0 ~ 5V 的模拟电压 转换为 0 ~ 1023 的数字值。
不幸的是,这些模拟引脚却无法直接输出模拟量,即输出模拟电压。那么Arduino项目中,该如何输出模拟电压呢?
介绍几种方法:
方法1:使用PWM引脚模拟输出
Arduino Uno的PWM引脚是标记“~”的数字I/O引脚,包括:D3、D5、D6、D9、D10、D11,这些引脚可以输出PWM信号。
PWM(Pulse width modulation)即“脉冲宽度调制”,PWM技术应用的领域很多,在Arduino项目中,一般通过调整PWM的“占空比”而达到控制电压的功能,实现“伪模拟”输出。用于:LED调光、电机调速、简单音频信号等对精度要求不高的场景。
关于精度:
Arduino支持8为PWN,所以可以0 ~ 255,分别对应(0V ~ 5V)或(0V ~ 3.3V) 。
为提供更高分辨率PWM,可以使用其他处理器,如ESP32支持16位PWM。
关于PWM频率:
UNO默认490Hz(引脚5、6为980Hz),可通过定时器调整(但需复杂代码)。
关于电压范围:
PWM和DAC输出受板卡供电电压限制(如5V或3.3V)。
案例1:
选择一个PWM引脚。
使用analogWrite(pin, value)函数输出在D9引脚输出PWM信号。
value范围:0 ~ 255(对应0V ~ 5V或3.3V压)。
假设VCC=5V,如需输出1.25V,value=255*1.25/5=64。示例代码:
void setup() {
pinMode(9, OUTPUT); // PWM引脚
analogWrite(9, 64); // 64/256 ≈ 25%占空比,D9引脚此时输出约1.25V电压
}
void loop() {}
案例2:
本案例要求先读取模拟信号(电压),再输出模拟量。步骤如下:
Arduino的A0读取点位器电压信号(模拟信号),微处理板首先处理数字值(0 ~ 1023),然后换算对应的PWM值(0 ~ 255),然后根据(0 ~ 255 和 0V ~ 5V)对应关系,输出响应伪模拟电压信号,调节LED亮度。
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //串口通讯初始化(9600 bps)
pinMode(9,OUTPUT); //设置9号引脚为输出模式
}
void loop() {
// put your main code here, to run repeatedly:
int analogInputVal = analogRead(A0); //读取模拟输入值,返回0~1023的数字值
Serial.println(analogInputVal); // 将数字值发送到串口监视器(波特率需设为 9600)
delay(100);
int brightness = map(analogInputVal,0,1023,0,255); //将模拟输入数值(0~1023)等比映射到PWM模拟输出(0~255)
analogWrite(9,brightness); //根据模拟输入值调节LED亮度
}
}
方法2:使用外接DAC模块(真模拟输出)
适用场景:需要高精度模拟信号(如音频合成、精密控制)。
常见DAC模块:
MCP4725(12位分辨率,I²C接口)
ADS1115(16位分辨率,需配置为DAC模式)
连接与代码示例(MCP4725):
接线:
SDA → A4(Uno)
SCL → A5(Uno)
VCC → 5V
GND → GND
安装库:Adafruit MCP4725 (通过库管理器安装)。
代码:
#include <Wire.h>
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
void setup() {
dac.begin(0x60); // 默认I2C地址
dac.setVoltage(2048, false); // 输出2.5V(12位分辨率,2048/4096×5V)
}
void loop() {}
其他方法
R-2R电阻网络:
用多个电阻搭建简易DAC(成本低但精度较差)。
PWM + 运算放大器:
放大滤波后的PWM信号以提高驱动能力。
各方法比较
| 方法 | 精度 | 复杂度 | 适用场景 |
|---|---|---|---|
| PWM + 滤波 | 低(8位) | 简单 | LED、电机等简单控制 |
| 外接DAC模块 | 高(12-16位) | 中等 | 音频、精密仪器 |
| R-2R网络 | 中低 | 复杂 | 实验性项目 |
根据需求选择合适方案,优先推荐外接DAC模块实现高质量模拟输出!
更多推荐



所有评论(0)