咱們接下來要解鎖嵌入式開發中“連接模擬與數字世界”的關鍵技能——ADC/DAC專題。
這次,瑞薩嵌入式小百科將和大家一起聚焦【瑞薩RA2L1】開發板,一步步玩轉DAC電壓輸出與ADC電壓采集:從12位DAC的引腳配置、ADC的單通道掃描設置,到代碼中實現電壓值的動態調整與串口打印,一起感受“數字信號轉模擬電壓”“模擬電壓變數字數據”的奇妙過程。
開啟寶典
1
前言
本次實驗內容是先用DAC做電壓輸出,再用ADC進行電壓采集,最后在串口打印查看。
2
硬件部分
2.1
DAC
DAC為數字/模擬轉換模塊,顧名思議,它的作用就是把輸入的數字編碼,轉換成對應的模擬電壓輸出,它的功能與ADC相反。
在常見的數字信號系統中,大部分傳感器信號被化成電壓信號,而ADC把電壓模擬信號轉換成易于計算機存儲、處理的數字編碼,由計算機處理完成后,再由DAC輸出電壓模擬信號,該電壓模擬信號常常用來驅動某些執行器件,使人類易于感知。如音頻信號的采集及還原就是這樣一個過程。
RA2L1開發板搭載的R7FA2L1AB2DFL芯片擁有12位的DAC。
2.2
ADC
ADC即模擬-數字轉換器(Analog-to-digital converter),是一種用于將連續的模擬信號轉換為離散的數字信號的器件。就比如我們可以將我們生活中的溫度、壓力、聲音這樣的模擬信號通過ADC轉化為可以通過單片機處理的數字信號。
RA2L1開發板搭載的R7FA2L1AB2DFL芯片擁有12位的ADC。
3
軟件部分
將先前的P項目模板復制一份,重命名為02_DAC-ADC-Voltage
3.1
配置DAC
先進入Pins頁面。


左右滑動查看全部
再來到Stacks頁面。


左右滑動查看全部
最后配置DAC的屬性。


左右滑動查看全部
3.1
配置ADC
進入Pins頁面。


左右滑動查看全部
進入Stacks頁面。








左右滑動查看全部
配置完成后,生成項目代碼。
3.3
編寫代碼
3.3.1新建adc.h
新建文件adc.h,加入以下代碼
左右滑動查看完整內容
#ifndefADC_H_#defineADC_H_voidadc0_waitComplete();#endif
3.3.2 新建adc.c
這段代碼中實現了adc的回調函數adc0_callback,當ADC掃描完成時會自動調用。在回調函數中將標志位scan_complete_flag設為true,以便adc0_waitComplete函數退出死循環。
新建文件adc.c,加入以下代碼
左右滑動查看完整內容
#include"adc.h"#include"hal_data.h"
volatilestaticbool scan_complete_flag =true;voidadc0_callback(adc_callback_args_t*p_args){ FSP_PARAMETER_NOT_USED(p_args); scan_complete_flag =true;}
voidadc0_waitComplete(){ scan_complete_flag =false; while(!scan_complete_flag) { /* Wait for callback to*/ }}
3.3.3修改hal_entry.c
在這里要實現用DAC輸出電壓,ADC采集電壓,每隔200ms遞增或遞減一次DAC輸出的電壓值,同時打印到串口。
在hal_entry.c的文件開頭加入:
左右滑動查看完整內容
#include"adc.h"uint16_tadc_data =0;
在hal_entry函數中加入:
左右滑動查看完整內容
typedefenum { up, down } Direction; Direction d = up; uint16_t dac_value =0; Debug_UART9_Init();//SCI9 UART 調試串口初始化 g_dac0.p_api->open(&g_dac0_ctrl, &g_dac0_cfg); g_dac0.p_api->start(&g_dac0_ctrl);
g_adc0.p_api->open(&g_adc0_ctrl, &g_adc0_cfg); g_adc0.p_api->scanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg); while(1) { g_dac0.p_api->write(&g_dac0_ctrl, dac_value); g_adc0.p_api->scanStart(&g_adc0_ctrl); adc0_waitComplete(); g_adc0.p_api->read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data); double volt = (double)(adc_data /4095.0) *3.3; printf("adc_data:%d, 電壓:%.3lf V\n", adc_data, volt); if(d == up) { dac_value +=500; } else { dac_value -=500; } if(dac_value >=4000) { d = down; } if(dac_value ==0) { d = up; } R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS); }
注意,這里是用了面向對象的編程方法,參考教程為:《ARM嵌入式系統中面向對象的模塊編程方法》基于DShanMCU-RA6M5(瑞薩MCU)。
也可以用瑞薩FSP庫的函數編程,一樣的。例如:
左右滑動查看完整內容
g_dac0.p_api->write(&g_dac0_ctrl, dac_value);
就可以用FSP庫代替。
左右滑動查看完整內容
R_DAC_Write(&g_dac0_ctrl, dac_value);
4
下載測試
把編譯好的程序下載到開發板并復位,將P000引腳與P014引腳短接,打開串口助手,可觀察到輸出的adc值與算得的電壓值。

點擊可查看大圖
5
工程附件

工程附件鏈接
https://ramcu.cn/uploads/02_DAC-ADC-Voltage_1751363208.zip

完成【RA2L1】開發板的ADC/DAC實驗,是不是對“模擬與數字信號的轉換”有了更直觀的認知?
從DAC輸出電壓的遞增遞減,到ADC精準采集后換算成具體電壓值并打印,每一步都讓我們掌握了嵌入式系統處理模擬信號的核心方法。這些在后續做傳感器項目(比如溫感、光敏采集)時都能用得上。
下一個新專題“IIC”已經安排上了——接下來咱們要解鎖“嵌入式多設備協同通信”的技能,比如通過IIC連接溫濕度傳感器、OLED顯示屏,實現多模塊的數據交互。關注瑞薩嵌入式小百科,咱們馬上開啟“設備組網通信”的新學習之旅!
-
mcu
+關注
關注
147文章
18923瀏覽量
397972 -
adc
+關注
關注
100文章
7511瀏覽量
555898 -
電壓
+關注
關注
45文章
5773瀏覽量
121815 -
dac
+關注
關注
44文章
2713瀏覽量
197064
發布評論請先 登錄
RA MCU眾測寶典 | ADC/DAC之【RA2L1】DAC電壓輸出及ADC電壓采集實驗
評論