总所周知,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模块实现高质量模拟输出!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐