之前有介绍过,ESP32 没有 DAC 引脚,但是可以通过 PWM 来进行模拟,这次入手了 MCP4922 这款双通道 DAC 芯片。它使用 SPI 接口,提供12Bit 的输出精度。芯片引脚定义如下:

引脚编号 | 名称 | 介绍 |
1 | Vdd | 供电 2.7-5.5V |
2 | NC | 空 |
3 | CS# | SPI CS 引脚 |
4 | SCK | SPI Clock |
5 | SDI | SPI MOSI |
6 | NC | 空 |
7 | NC | 空 |
8 | LDAC# | 锁存,只有为低时,芯片才会从 Vouta和Voutb 输出电压 |
9 | SHDN# | 关闭,为低芯片停止工作 |
10 | Voutb | 输出B电压引脚 |
11 | Vrefb | 输出B 的参考电压,可以接入Vss到Vdd 以内的电压.这次测试接入了Vdd(3.3V) |
12 | Vss | 地 |
13 | Vrefa | 输出A 的参考电压,,可以接入Vss到Vdd 以内的电压.这次测试接入了Vdd(3.3V) |
14 | Vouta | 输出A的电压引脚 |
这次测试基于 https://github.com/michd/Arduino-MCP492X 提供的库文件,代码如下:
#include <MCP492X.h> // Include the library
#define PIN_SPI_CHIP_SELECT_DAC 25 // Or any pin you'd like to use
MCP492X myDac(PIN_SPI_CHIP_SELECT_DAC);
void setup() {
// put your setup code here, to run once:
myDac.begin();
}
void loop() {
for (int i=0;i<4096;i++) {
myDac.analogWrite(0, i);
myDac.analogWrite(1, 4095-i);
delay(1);
}
代码运行后使用示波器进行测试,结果如下:

修改代码,loop如下:
void loop() {
myDac.analogWrite(0, 0);
myDac.analogWrite(0, 4095);
}
可以看到波形如下:

参考:
- https://www.microchip.com/en-us/product/MCP4922#
- https://ua726.co.uk/2012/12/22/testing-the-mcp4922-with-an-arduino/
本文使用的库:
MCP492X Datasheet