【目的】
本篇主要实现面向对象的对驱ADC,使用电位容调节电压,采集实时电压并在OLED屏上实时展示。
【实验器材】
1、瑞萨生态社区RA0E1开发板:
2、OLED显示屏
3、电位器
【软件环境】
1、MDK5.39
2、FSP 5.3.0
3、RASC
【实现步骤】
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函数。
#include "drv_adc.h" #include "hal_data.h" #include <stdio.h> #define LOG(FUNC, LINE) printf("Function:%s\tLine:%d\r\n", FUNC, LINE) static void ADCWaitConvCplt(void); static int ADCDrvInit(struct ADCDev *ptDev); static int ADCDrvRead(struct ADCDev *ptDev); static struct ADCDev gAdcDev = { .name = "ADC0", .channel = 6, .Init = ADCDrvInit, .Read = ADCDrvRead, .value = 0 }; volatile bool adc_sample_cplt = false; struct ADCDev *ADCGetDevice(void) { return &gAdcDev; } static int ADCDrvInit(struct ADCDev *ptDev) { if(NULL == ptDev) return -1; /* 打开ADC设备完成通用初始化 */ fsp_err_t err = R_ADC_D_Open(&g_adc0_ctrl, &g_adc0_cfg); assert(FSP_SUCCESS == err); err = R_ADC_D_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg); assert(FSP_SUCCESS == err); return 0; } static int ADCDrvRead(struct ADCDev *ptDev) { if(NULL == ptDev ) return -1; adc_sample_cplt = false; R_ADC_D_ScanStart(&g_adc0_ctrl); ADCWaitConvCplt(); fsp_err_t err = R_ADC_D_Read(&g_adc0_ctrl, ptDev->channel, &ptDev->value); assert(FSP_SUCCESS == err); return 0; } static void ADCWaitConvCplt(void) { while(!adc_sample_cplt); adc_sample_cplt = false; } void adc_callback (adc_callback_args_t * p_args) { FSP_PARAMETER_NOT_USED(p_args); adc_sample_cplt = true; }
此函数中主要是把adc0_CHANNEL_6配置成ptDev,对外开放的接口。我们只需要初始化ADCDev后,就可以通过他的init、read、value来做接口访问就行了。
4、在主函数中我们初始化ADC并读取ADC值,显示于OLED屏上:
ADCDevTypeDef *ptAdcDev = ADCGetDevice(); //生成ADC对象 if(NULL == ptAdcDev) { printf("Error. Not found ADC device!\r\n"); return; } ptAdcDev->Init(ptAdcDev); //初始化 //在while循环中读取,并显示 if(!ptAdcDev->Read(ptAdcDev)) { a0=(ptAdcDev->value/4095.0)*3.3; sprintf(sprintfbuff,"ADC:%d, %d.%d",ptAdcDev->value, (int)a0, (int)(a0*1000)%1000); ptDispDev->GUI_ShowString(ptDispDev,0,48, sprintfbuff,16,1); }
【实现效果】
将P014接于可变电位器的输出IO,可以实时测量到电压:
附工程源码: