瑞萨单片机论坛
直播中

VR小杰

未满1年用户 37经验值
擅长:控制/MCU
私信 关注
[经验]

【RA-Eco-RA4E2-64PIN-V1.0开发板试用】07、ADC采集PWM输出的电压值

0 前言

本次实验要实现使用瑞萨 R7FA4E2B93CFM 进行ADC转换实验,要对之前PWM输出实验中的PWM输出进行电压采集,并在LCD屏幕上输出实时电压值。

1 硬件部分

在e2s中查看支持ADC的引脚,发现P0这个端口的引脚基本上都支持ADC采集。
本次使用P000作为ADC采集输入引脚,将P000与P206(PWM输出的引脚)从外部接到一块。

2 软件部分

2.1 新建工程

将先前创建的06_PWM_Dimming文件夹复制一份,并将文件夹重命名为07_ADC。生成PWM的工程文件可前去论坛06、PWM输出实验+给LCD屏幕PWM调光中的末尾附件处下载。

2.2 配置工程

2.2.1 配置ADC

在下图所示的地方,Peripherals -- Analog:ADC --ADC0 ,将AN000所指的pin改为P000
配置ADCpin.jpg

2.2.2 新建并设置模块属性

点击Stacks,New Stack--Analog--ADC(r_adc)。
点击刚生成的模块-属性,我们只需要改动下图所示的地方。
adc属性1.jpg

adc属性2.jpg

2.2.3 生成代码

保存配置文件,并点击Generate Project Content让其自动为我们生成代码。

2.3 编写代码

注意,这里是在之前实验06_PWM的基础上修改的。
修改hal_entry.c文件,在hal_entry函数之前,添加如下内容:

//ADC转换完成标志位
volatile bool scan_complete_flag = false;

void adc_callback(adc_callback_args_t * p_args)
{
   FSP_PARAMETER_NOT_USED(p_args);
   scan_complete_flag = true;
}

double Read_ADC_Voltage_Value(void);
double Read_ADC_Voltage_Value(void)
{
    uint16_t adc_data;
    double a0;
    (void)R_ADC_ScanStart(&g_adc0_ctrl);
    while (!scan_complete_flag) //等待转换完成标志
    {
     ;
    }
    scan_complete_flag = false; //重新清除标志位

    /* 读取通道0数据 */
    R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data);
    /* ADC原始数据转换为电压值(ADC参考电压为3.3V) */
    a0 = (double)(adc_data*3.3/4095);

    return a0;
}

hal_entry函数内让用户编写的部分改为如下内容

uint8_t brightness = 100;
fsp_err_t err = R_SPI_Open(&g_spi1_ctrl, &g_spi1_cfg);
assert(FSP_SUCCESS == err);
R_IOPORT_PinWrite(&g_ioport_ctrl, RST, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, RST, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(150, BSP_DELAY_UNITS_MILLISECONDS);
LCD_Init();
LED_ON();

R_GPT_Open(&g_timer5_ctrl, &g_timer5_cfg);
R_GPT_Start(&g_timer5_ctrl);
GPT_PWM_SetDuty(brightness);

R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);

LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
LCD_ShowString(4,10,(uint8_t *)"brightness",GREEN,BLACK,24,0);
LCD_ShowString(22,60,(uint8_t *)"voltage",RED,BLACK,24,0);
while(1){
    GPT_PWM_SetDuty(brightness);
    LCD_ShowIntNum(48,35,brightness,2,GREEN,BLACK,32);
    float sum=0;
    for(uint16_t i=0;i<500;i++){
        sum+=(float)Read_ADC_Voltage_Value();
    }
    LCD_ShowFloatNum1(30,85,(float)(sum/500.0),3,RED,BLACK,32);
    brightness--;
    if(brightness <1)
        brightness = 100;
    R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS);
}

3 下载测试

编译、下载,将P206和P000在外部相接。
观察屏幕,可以看到屏幕亮度等待变化,同时也能看到实时电压值,如结尾视频所示。

4 附件

*附件:07_ADC.zip

更多回帖

发帖
×
20
完善资料,
赚取积分