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:
參考資料: