熱門資訊> 正文
2025-06-29 15:24
本文引用地址:
1 目的
本篇主要實現面向對象的對驅ADC,使用電位容調節電壓,採集實時電壓並在OLED屏上實時展示。
2 實驗器材
1.瑞薩生態社區RA0E1開發板:
2.OLED 顯示屏
3.電位器
3 軟件環境
1.MDK5.39
2.FSP 5.3.0
3.RASC
4 實現步驟
1.打開RASC,選擇FSP 5.3.0(最少選擇5.2.0版本以上)。
2.配置P014為ADC Analog mode 為通道6即ADC0_AN006:
3.新建stack,添加g_adc0_ADC,並按下圖置為通道6,軟件觸發轉換,開啟轉換結果中斷觸發,參考電壓為MCU的VSS與VCC,即3.3V
4.向工程中添加drv_adc函數。
view plaincopy to clipboardprint?
1.#include 「drv_adc.h」
2.#include 「hal_data.h」
3.#include
4.
5.#defi ne LOG(FUNC, LINE) printf(「Function:%stLine:%drn」, FUNC, LINE)
6.
7.static void ADCWaitConvCplt(void);
8.static int ADCDrvInit(struct ADCDev *ptDev);
9.static int ADCDrvRead(struct ADCDev *ptDev);
10.
11. static struct ADCDev gAdcDev = {
12. .name = 「ADC0」,
13. .channel = 6,
14. .Init = ADCDrvInit,
15. .Read = ADCDrvRead,
16. .value = 0
17. };
18.
19.volatile bool adc_sample_cplt = false;
20.
21.struct ADCDev *ADCGetDevice(void)
22.{
23.return &gAdcDev;
24.}
25.
26.static int ADCDrvInit(struct ADCDev *ptDev)
27.{
28.if(NULL == ptDev) return -1;
29.
30./* 打開ADC 設備完成通用初始化 */
31.fsp_err_t err = R_ADC_D_Open(&g_adc0_ctrl, &g_adc0_cfg);
32.assert(FSP_SUCCESS == err);
33.err = R_ADC_D_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
34.assert(FSP_SUCCESS == err);
35.
36.return 0;
37.}
38.
39.static int ADCDrvRead(struct ADCDev *ptDev)
40.{
41.
42.if(NULL == ptDev ) return -1;
43.
44.adc_sample_cplt = false;
45. R_ADC_D_ScanStart(&g_adc0_ctrl);
46. ADCWaitConvCplt();
47. fsp_err_t err = R_ADC_D_Read(&g_
adc0_ctrl, ptDev->channel, &ptDev->value);
48. assert(FSP_SUCCESS == err);
49.
50.
51. return 0;
52. }
53.
54. static void ADCWaitConvCplt(void)
55. {
56. while(!adc_sample_cplt);
57. adc_sample_cplt = false;
58. }
59.
60. void adc_callback (adc_callback_args_t * p_
args)
61. {
62. FSP_PARAMETER_NOT_USED(p_args);
63. adc_sample_cplt = true;
64. }
此函數中主要是把adc0_CHANNEL_6配置成ptDev,對外開放的接口。我們只需要初始化ADCDev后,就可以通過他的init、read、value來做接口訪問就行了。
4.在主函數中我們初始化ADC並讀取ADC值,顯示於OLED屏上:
view plaincopy to clipboardprint?
1.ADCDevTypeDef *ptAdcDev = ADCGetDevice(); // 生成ADC對象
2.if(NULL == ptAdcDev)
3.{
4.printf(「Error. Not found ADC device!rn」);
5.return;
6.}
7.ptAdcDev->Init(ptAdcDev); // 初始化
8.//在while循環中讀取,並顯示
9.if(!ptAdcDev->Read(ptAdcDev))
10.{
11.a0=(ptAdcDev->value/4095.0)*3.3;
12.sprintf(sprintfbuff ,」ADC:%d, %d.%d」,ptAdcDev->value, (int)a0, (int)(a0*1000)%1000);
13.ptDispDev->GUI_ShowString(ptDispDev,0,48, sprintfbuff ,16,1);
}
5 實現效果
將P014接於可變電位器的輸出IO,可以實時測量到電壓: