之前有介绍过,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 提供的库文件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #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如下:
1 2 3 4 | 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