瑞萨单片机论坛
直播中

VR小杰

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

【RA-Eco-RA4E2-64PIN-V1.0开发板试用】06、PWM输出实验+给LCD屏幕PWM调光

0 前言

本次实验要实现使用瑞萨 R7FA4E2B93CFM 进行PWM输出,并对之前TFT-LCD屏幕实验中的屏幕进行亮度调节测试。

1 硬件部分

之前是将TFT屏幕的BL引脚接在了P014上,调节P014输出高电平实现屏幕背光常亮。该屏幕BL引脚的输入电压在0~VCC之间都可以使得背光亮度随输入电压变化,因此可以使用PWM进行精确控制该引脚的电压,从而实现调光。

我们只需要把BL引脚接到支持PWM输出的IO口即可,通过e2s内的配置可以得知,我们能使用GPT5的P206实现这一操作。

2 软件部分

2.1 新建工程

将先前创建的04_SPI_TFT文件夹复制一份,并将文件夹重命名为06_PWM_Dimming。TFT文件的前去论坛该帖子中的末尾附件处下载。

在e2s里面,选择菜单栏的文件--导入--常规--现有项目到工作空间中--选择根目录"浏览"--完成。

2.2 配置工程

2.2.1 配置GPT5

GPT即General PWM Timer,是 RA MCU 的其中一种 32/16 位的定时器外设。

如下图所示找到GPT5,并把通道B配置为P206。
GPT5配置.jpg

2.2.2 新建并设置模块属性

点击Stacks,New Stack--Timers--Timer General PWM(r_gpt)。点击刚生成的模块-属性,我们只需要改动下图所示的地方。
timer属性设置.jpg

2.2.3 生成代码

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

2.3 编写代码

修改hal_entry.c文件,在hal_entry函数之前,添加如下内容:

void GPT_PWM_SetDuty(uint8_t duty);
void GPT_PWM_SetDuty(uint8_t duty)
{
    timer_info_t info;
    uint32_t current_period_counts;
    uint32_t duty_cycle_counts;

    if (duty > 100)
        duty = 100; //限制占空比范围:0~100

    /* 获得GPT的信息 */
    R_GPT_InfoGet(&g_timer5_ctrl, &info);

    /* 获得计时器一个周期需要的计数次数 */
    current_period_counts = info.period_counts;

    /* 根据占空比和一个周期的计数次数计算GTCCR寄存器的值 */
    duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);

    /* 最后调用FSP库函数设置占空比 */
    R_GPT_DutyCycleSet(&g_timer5_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB);
}

上面是加了个设置PWM占空比的函数

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);

LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
LCD_ShowString(32,20,(uint8_t *)"RA4E2",RED,BLACK,24,0);
LCD_ShowString(8,50,(uint8_t *)"SPI-LCD",BLUE,BLACK,32,0);
LCD_ShowString(4,80,(uint8_t *)"brightness",GREEN,BLACK,24,0);
while(1){
    GPT_PWM_SetDuty(brightness);
    LCD_ShowIntNum(48,110,brightness,2,GREEN,BLACK,32);
    brightness--;
    if(brightness <1)
        brightness = 100;
    R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS);
}

这段内容是每隔50ms就降低1%的占空比,从0~100循环,并把占空比实时显示在屏幕上。

3 下载测试

编译、下载,将屏幕的BL线接到P206上面去。
观察屏幕,可以看到屏幕亮度逐步降低,即将为0时被重置为最高亮度。如结尾视频所示

4 附件

*附件:06_PWM_Dimming.zip

PWM调光

更多回帖

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