繁體
  • 简体中文
  • 繁體中文

熱門資訊> 正文

瑞薩RA0單片機連載⸺ADC

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,可以實時測量到電壓:

風險及免責提示:以上內容僅代表作者的個人立場和觀點,不代表華盛的任何立場,華盛亦無法證實上述內容的真實性、準確性和原創性。投資者在做出任何投資決定前,應結合自身情況,考慮投資產品的風險。必要時,請諮詢專業投資顧問的意見。華盛不提供任何投資建議,對此亦不做任何承諾和保證。