RA4M2开发涂鸦模块CBU(3)----定时器GPT-PWM调光
RA4M2开发涂鸦模块CBU.3--定时器GPT-PWM调光
- 概述
- 视频教学
- 样品申请
- 硬件准备
- 参考程序
- 选择计时器
- GPIO口配置
- GPT定时器
- GPT定时器属性配置
- 初始化GPT
- 启动GPT PWM模块
- 时钟源
- PWM(脉冲宽度调制)
- R_GPT_PeriodSet()函数说明
- R_GPT_DutyCycleSet()函数说明
- 呼吸效果
概述
本实验基于 Renesas RA4M2 的 GPT(General PWM Timer) 外设,通过改变 PWM 占空比来调节 LED 亮度,实现软硬件结合的“无级调光”。
最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。
视频教学
https://www.bilibili.com/video/BV1mFMHz3EcM
RA4M2开发涂鸦模块CBU(3)----定时器GPT-PWM调光
样品申请
https://www.wjx.top/vm/rCrkUrz.aspx
硬件准备
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA4M2AD3CFL#AA0
参考程序
https://github.com/CoreMaker-lab/RA4M2_TUYA_CBU
https://gitee.com/CoreMaker/RA4M2_TUYA_CBU
选择计时器
RA MCU 有两个定时器外设:通用 PWM 定时器 (GPT) 和异步通用定时器 (AGT)。
GPIO口配置
由下图我们可以得知,板子上有3个LED灯,P103可以配置为PWM端口进行调光。
GPT定时器
操作 “New Stack > Timers >Timer, General PWM (r_gpt)” 在项目中添加GPT定时器的多通道操作功能,特别是用于生成PWM信号或单次脉冲信号。
GPT定时器属性配置
● Pin Output Support:设为 Enabled,允许 PWM 信号输出到外部引脚。
● Name:设置为 g_timer2,这是模块的唯一标识符,用于代码中引用此定时器实例。
● Channel:设定为 2,表示该定时器使用通道 2 进行计数和控制。
● Mode:设为 Periodic,表示该定时器工作在周期模式,将在设定周期内重复运行。
● Period:周期值设置为 1,即每个完整计数周期的时间间隔。
● Period Unit:单位选择为 Kilohertz(千赫兹),表示输出信号的频率为 1 kHz。
● Duty Cycle Percent:设置为 50%,表示 PWM 输出信号的高电平时间占周期的 50%。
● GTIOCA Output Enabled:设置为 True,启用 GTIOCA(P103)引脚的输出功能。
● GTIOCA Stop Level:设为 Pin Level Low,表示定时器停止时 GTIOCA 输出低电平。
GTIOCA & GTIOCB 输出: 同时启用了 GTIOCA(P103) 两个引脚进行 PWM 输出。
初始化GPT
R_GPT_Open() 函数用于初始化通用PWM定时器(GPT)模块,并应用相应的配置。它的主要作用是启动定时器,使其按照设定的模式工作,例如周期模式(Periodic Mode)或PWM模式(Pulse Width Modulation Mode)。
/* Initializes the module. */err = R_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);
启动GPT PWM模块
R_GPT_Start() 用于启动GPT(General PWM Timer)定时器,使其开始按照之前的配置运行。
必须先调用 R_GPT_Open(),否则 R_GPT_Start() 会返回 FSP_ERR_NOT_OPEN 错误。
在PWM模式下,启动定时器后会按照设定的周期和占空比输出PWM波形。
/* Start the timer. */(void) R_GPT_Start(&g_timer2_ctrl);
时钟源
GPT 使用 PCLKD(外设时钟D) 作为主时钟源。该时钟可以通过 可配置的分频器 进行调整,最大分频因子为 1024。
● 主 PLL
● XTAL 12 MHz → ÷2 → ×30 = 180 MHz
● PCLKD 分频
● 在 Clocks 视图中将 PCLKD 选为 Div/2,于是
● PCLKD = 180 MHz ÷ 2 = 90 MHz
PWM(脉冲宽度调制)
脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
在瑞萨RA系列MCU中有两种定时器,一种是通用PWM定时器GPT,另外一种是异步通用定时器AGT。
频率=主频/period
+占空比=cycle/period
下图中展示的 PWM 输出信号,在周期开始时为高电平,周期结束时为低电平。通过调整占空比(duty cycle)和周期(timer period),可以调节 PWM 信号的行为。
● duty_cycle_counts:表示占空比部分的持续时间。占空比决定了信号高电平的时间比例。
● timer_period_counts:这是一个周期的时间,单位是 PCLKD 计数(即时钟频率的周期数)。
更新周期和占空比:周期和占空比在下次定时器溢出后会更新,更新由 R_GPT_PeriodSet() 或 R_GPT_DutyCycleSet() 函数触发。如果需要在下次溢出之前强制更新这些值,可以调用 R_GPT_Reset(),这样定时器会被重置并开始计数。
R_GPT_PeriodSet()函数说明
R_GPT_PeriodSet 该函数用于设置定时器的周期值。若定时器正在运行,则在下次溢出时更新周期;如果定时器已停止,该函数将重置计数器并更新周期。
频率=时钟源/period,若设置频率为10K,则period=90M/10K=9000
err = R_GPT_PeriodSet(&g_timer2_ctrl, 9000);//频率assert(FSP_SUCCESS == err);
完整的函数定义如下所示。
/** @brief PWM 呼吸灯当前占空比计数(0-1000) */
static uint32_t s_pwm_count = 0;
/** @brief PWM 呼吸灯占空比变化方向:true=递增,false=递减 */
static bool s_pwm_increasing = true;/*** @brief 初始化 GPT2 作为 PWM 呼吸灯** 配置定时器周期、启动并默认占空比 0。* @return FSP_SUCCESS 成功,否则返回错误码*/
static fsp_err_t pwm_breathe_init(void)
{fsp_err_t err = R_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg);if (FSP_SUCCESS != err) return err;err = R_GPT_PeriodSet(&g_timer2_ctrl, 9000);if (FSP_SUCCESS != err) return err;/* 启动定时器产生 PWM */err = R_GPT_Start(&g_timer2_ctrl);if (FSP_SUCCESS != err) return err;/* 初始占空比设置为 0(熄灭) */return R_GPT_DutyCycleSet(&g_timer2_ctrl, 0, GPT_IO_PIN_GTIOCA);
}
在主程序中添加初始化。
/* 初始化 PWM 呼吸灯 */err = pwm_breathe_init();assert(FSP_SUCCESS == err);
R_GPT_DutyCycleSet()函数说明
R_GPT_DutyCycleSet 此函数用于设置请求引脚的占空比。占空比在缓冲寄存器中更新,更新后的占空比将在下一个计数溢出时反映出来。
+占空比=cycle/period,若设置GTIOCA-占空比为25%,所以+占空比为75%,则cycle= -占空比* period=25%*9000=2250
err = R_GPT_DutyCycleSet(&g_timer2_ctrl, 2250, GPT_IO_PIN_GTIOCA);//占空比assert(FSP_SUCCESS == err);
更新 PWM 占空比实现呼吸效果代码如下。
利用 RA4M2 的 GPT2 定时器产生 PWM,按 1 ms 步进在 0 ~ 100 % 占空比之间往返,实现 LED 的“呼吸”渐亮渐灭。
/*** @brief 更新 PWM 占空比实现呼吸效果** 根据当前计数和方向计算新占空比并写入 GPT。*/
static void pwm_breathe_update(void)
{/* 调整占空比计数 */if (s_pwm_increasing){s_pwm_count++;if (s_pwm_count >= 1000){s_pwm_count = 1000;s_pwm_increasing = false;}}else{s_pwm_count--;if (s_pwm_count == 0){s_pwm_increasing = true;}}/* 设置新的比较值:周期 9000 -> 1% = 90 */(void)R_GPT_DutyCycleSet(&g_timer2_ctrl,s_pwm_count * 9,GPT_IO_PIN_GTIOCA);
}
呼吸效果
利用 RA4M2 的 GPT2 定时器产生 PWM,按 1 ms 步进在 0 ~ 100 % 占空比之间往返,实现 LED 的“呼吸”渐亮渐灭。
/* 主循环:更新 LED 状态与呼吸效果 */while (true){led_update(); /* 切换普通 LED */pwm_breathe_update(); /* 呼吸灯效果 */R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);}