【目的】
本篇主要实现面向对象的对驱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,可以实时测量到电压:

附工程源码:
我要赚赏金
