ESP32支持两路8bit DAC输出:
- VDD3P3_RTC为电压参考源(一般为3.3V)
- 专用管脚GPIO25(channel1)和GPIO26(channel2)
- 需包含头文件: driver/include/driver/dac.h
- 函数调用:
- dac某通道输出使能:dac_output_enable(DAC_CHANNEL_1)
- dac选定通道输出设定电压值:dac_output_voltage(DAC_CHANNEL_1, 200)
对于ESP32,由于其DAC为8bit。设定输出参数为200,则输出电压值为:
3.3*(200/255) = 2.5882V 。
获取输出正弦波的DAC数据:
- 通过改变MCU的DAC输出电压,可以得到特定的波形。我们以正弦波为例。首先,需要知道一个正弦波周期内有多少个采样点uPoints(点数越多波形越细腻)
- ESP32的DAC为八位,则传递给DAC的最大参数值为uMaxValue,(即255,其对应最大输出电压3.3V)
- 采样点uPoints将一个正弦波360度,分割为许多份,每一份的角度为360/uPoints,转换为弧度为:x = (360/uPoints)*(π/180)
- 由于ESP32的DAC输出电压范围为[0~3.3V],故设置正弦波的偏置电压为3.3/2
- 数组 sin_tab[i] 用于存储DAC数据,则计算公式如下sin_tab[i]=(uMaxValue/2)*sin(x)+(uMaxValue/2)
定义 getsin() 函数如下:
void getsin()
{
float x, uAng;
uAng=360.000/uPoints;
for(int i=0;i<uPoints;i++){
x=uAng*i;
x=x*(uPi/180); // 弧度=角度*(π/180)
sin_tab[i]=(uMaxValue/2)*sin(x)+(uMaxValue/2);
//printf("sin tab[%d]: %f\n", i, sin_tab[i]);
}
}
正弦波数据通过DAC输出:
for(int i=0; i<uPoints; i++){
dac_output_voltage(DAC_CHANNEL_1, sin_tab[i]);
}
测试结果:
50Hz:
参考资料: