这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » 瑞萨RA0单片机连载之十——ADC

共5条 1/1 1 跳转至

瑞萨RA0单片机连载之十——ADC

助工
2024-06-05 17:01:29     打赏

【目的】

本篇主要实现面向对象的对驱ADC,使用电位容调节电压,采集实时电压并在OLED屏上实时展示。

【实验器材】

1、瑞萨生态社区RA0E1开发板:

image.png2、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:

image.png

3、新建stack,添加g_adc0_ADC,并按下图置为通道6,软件触发转换,开启转换结果中断触发,参考电压为MCU的VSS与VCC,即3.3V

image.png

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,可以实时测量到电压:

image.png

附工程源码:

RA0E1_ADC.zip






关键词: 刘工爱评测之瑞萨RA0单片机     ADC     OLED    

专家
2024-06-05 19:23:16     打赏
2楼

感谢分享


专家
2024-06-05 19:40:33     打赏
3楼

感谢分享


专家
2024-06-06 07:23:16     打赏
4楼

很好,值得推荐


助工
2024-10-06 17:44:22     打赏
5楼

谢谢分享。


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]