“RA MCU眾測(cè)寶典”ADC/DAC通信專題上線啦!
咱們接下來要解鎖嵌入式開發(fā)中“連接模擬與數(shù)字世界”的關(guān)鍵技能——ADC/DAC 專題。
這次,瑞薩嵌入式小百科將和大家一起聚焦【瑞薩RA2L1】開發(fā)板,一步步玩轉(zhuǎn)DAC電壓輸出與ADC電壓采集:從12位DAC的引腳配置、ADC的單通道掃描設(shè)置,到代碼中實(shí)現(xiàn)電壓值的動(dòng)態(tài)調(diào)整與串口打印,一起感受“數(shù)字信號(hào)轉(zhuǎn)模擬電壓”“模擬電壓變數(shù)字?jǐn)?shù)據(jù)”的奇妙過程。

前言

硬件部分

DAC為數(shù)字/模擬轉(zhuǎn)換模塊,顧名思議,它的作用就是把輸入的數(shù)字編碼,轉(zhuǎn)換成對(duì)應(yīng)的模擬電壓輸出,它的功能與ADC相反。
在常見的數(shù)字信號(hào)系統(tǒng)中,大部分傳感器信號(hào)被化成電壓信號(hào),而ADC把電壓模擬信號(hào)轉(zhuǎn)換成易于計(jì)算機(jī)存儲(chǔ)、處理的數(shù)字編碼,由計(jì)算機(jī)處理完成后,再由DAC輸出電壓模擬信號(hào),該電壓模擬信號(hào)常常用來驅(qū)動(dòng)某些執(zhí)行器件,使人類易于感知。如音頻信號(hào)的采集及還原就是這樣一個(gè)過程。
RA2L1開發(fā)板搭載的R7FA2L1AB2DFL芯片擁有12位的DAC。
ADC即模擬-數(shù)字轉(zhuǎn)換器(Analog-to-digital converter),是一種用于將連續(xù)的模擬信號(hào)轉(zhuǎn)換為離散的數(shù)字信號(hào)的器件。就比如我們可以將我們生活中的溫度、壓力、聲音這樣的模擬信號(hào)通過ADC轉(zhuǎn)化為可以通過單片機(jī)處理的數(shù)字信號(hào)。
RA2L1開發(fā)板搭載的R7FA2L1AB2DFL芯片擁有12位的ADC。
軟件部分

將先前的P項(xiàng)目模板復(fù)制一份,重命名為02_DAC-ADC-Voltage
先進(jìn)入Pins頁(yè)面。
左右滑動(dòng)查看全部
再來到Stacks頁(yè)面。
左右滑動(dòng)查看全部
最后配置DAC的屬性。
左右滑動(dòng)查看全部
進(jìn)入Pins頁(yè)面。
左右滑動(dòng)查看全部
進(jìn)入Stacks頁(yè)面。
左右滑動(dòng)查看全部
配置完成后,生成項(xiàng)目代碼。
3.3.1 新建adc.h
新建文件adc.h,加入以下代碼
voidadc0_waitComplete();
3.3.2 新建adc.c
這段代碼中實(shí)現(xiàn)了adc的回調(diào)函數(shù)adc0_callback,當(dāng)ADC掃描完成時(shí)會(huì)自動(dòng)調(diào)用。在回調(diào)函數(shù)中將標(biāo)志位scan_complete_flag設(shè)為true,以便adc0_waitComplete函數(shù)退出死循環(huán)。
新建文件adc.c,加入以下代碼
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
在這里要實(shí)現(xiàn)用DAC輸出電壓,ADC采集電壓,每隔200ms遞增或遞減一次DAC輸出的電壓值,同時(shí)打印到串口。
在hal_entry.c的文件開頭加入:
uint16_t adc_data = 0;
在hal_entry函數(shù)中加入:
typedefenum{up,down} Direction;Direction d = up;uint16_t dac_value = 0;Debug_UART9_Init(); // SCI9 UART 調(diào)試串口初始化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);}
注意,這里是用了面向?qū)ο蟮木幊谭椒ǎ瑓⒖冀坛虨椋骸禔RM嵌入式系統(tǒng)中面向?qū)ο蟮哪K編程方法》基于DShanMCU-RA6M5(瑞薩MCU)。
也可以用瑞薩FSP庫(kù)的函數(shù)編程,一樣的。例如:
g_dac0.p_api->write(&g_dac0_ctrl, dac_value);就可以用FSP庫(kù)代替。
R_DAC_Write(&g_dac0_ctrl, dac_value);下載測(cè)試

把編譯好的程序下載到開發(fā)板并復(fù)位,將P000引腳與P014引腳短接,打開串口助手,可觀察到輸出的adc值與算得的電壓值。

點(diǎn)擊可查看大圖
工程附件

https://ramcu.cn/uploads/02_DAC-ADC-Voltage_1751363208.zip

完成【RA2L1】開發(fā)板的ADC/DAC實(shí)驗(yàn),是不是對(duì)“模擬與數(shù)字信號(hào)的轉(zhuǎn)換”有了更直觀的認(rèn)知?
下一個(gè)新專題“IIC”已經(jīng)安排上了——接下來咱們要解鎖“嵌入式多設(shè)備協(xié)同通信”的技能,比如通過IIC連接溫濕度傳感器、OLED顯示屏,實(shí)現(xiàn)多模塊的數(shù)據(jù)交互。關(guān)注瑞薩嵌入式小百科,咱們馬上開啟“設(shè)備組網(wǎng)通信”的新學(xué)習(xí)之旅!

瑞薩樣品/開發(fā)板申請(qǐng)入口如下,可掃描二維碼或復(fù)制鏈接到瀏覽器獲得 ??
瑞薩樣品/開發(fā)板申請(qǐng)入口:
https://jsj.top/f/AgUyYV

如您在使用瑞薩MCU/MPU產(chǎn)品中有任何問題,可識(shí)別下方二維碼或復(fù)制網(wǎng)址到瀏覽器中打開,進(jìn)入瑞薩技術(shù)論壇尋找答案或獲取在線技術(shù)支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
1
END
1
推薦閱讀
瑞薩e2studio(12)—DAC
RA MCU眾測(cè)寶典 | 串口之【RA2L1】開發(fā)板開箱及串口輸出實(shí)現(xiàn)
RA MCU眾測(cè)寶典 | PWM之【RA2L1】呼吸燈

