首页 > 行业资讯 > 正文

5.1 原理图分析

查看EK-RA6M4的原理图,如下图所示,该开发板上有3个Led指示灯。

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm

另外,这三个Led灯所使用的GPIO引脚可以作为定时器的PWM输出使用,其定义如下:

Led灯 LED3 LED2 LED1 颜色 红色 绿色 蓝色 引脚 P400 P404 P415 定时器 GPT6(GTIOC6A) GPT3(GTIOC3B) GPT0(GTIOC0A)

在该例程中,我们将通过定时器PWM控制:

蓝色Led将作为心跳灯使用(每隔3.4s,快闪2次200ms); 绿色Led将作为呼吸灯使用(100%~0%占空比);

5.2 PWM配置

首先,在FSP配置中将 BlueLed 和 GreenLed 所用的两个GPIO口配置成PWM输出模式。

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm1

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm2

接着选择 Stacks ,点击 “New Stack” -> “Timers” -> “Timer, General PWM(r_gpt)” 添加两个Timer PWM协议栈。

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm3

接下来设置 PWM 的相关配置,并重新生成代码。

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm4

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm5

在绿色的Led配置中,我们设置定时器的频率为10ms,并设置占空比为100%。接下来将会在主函数的循环里修改它的占空比,这样灯的亮度将由强到弱,再由弱到强; 在蓝色的Led配置中,我们设置定时器端的频率为400ms,并设置占空比为50%(高电平200ms)。接下来我们将会在其中断回调函数中来调整它的频率,让它快闪2下之后再灭掉。

5.3 源码修改

创建PWM定时器操作相关的头文件 src/bsp_pwm.h 如下。

复制#ifndef BSP_PWM_H_ #define BSP_PWM_H_ fsp_err_t pwm_init(void); #endif /* BSP_PWM_H_ */

创建PWM定时器操作相关的c文件 src/bsp_pwm.c 如下。

复制#include #include “bsp_api.h” #include “hal_data.h” #include “bsp_pwm.h” #include “bsp_led.h” fsp_err_t pwm_init(void) { fsp_err_t fsp_err = FSP_SUCCESS; fsp_err = R_GPT_Open(&g_pwm_ledgreen_ctrl, &g_pwm_ledgreen_cfg); if(FSP_SUCCESS != fsp_err) return fsp_err; fsp_err = R_GPT_Start(&g_pwm_ledgreen_ctrl); if(FSP_SUCCESS != fsp_err) { R_GPT_Close(&g_pwm_ledgreen_ctrl); return fsp_err; } fsp_err = R_GPT_Open(&g_pwm_ledblue_ctrl, &g_pwm_ledblue_cfg); if(FSP_SUCCESS != fsp_err) return fsp_err; fsp_err = R_GPT_Start(&g_pwm_ledblue_ctrl); if(FSP_SUCCESS != fsp_err) { R_GPT_Close(&g_pwm_ledblue_ctrl); return fsp_err; } return fsp_err; } /* Blue Led work as heart beat mode */ void pwm_ledblue_callback(timer_callback_args_t *p_args) { static uint8_t mode = 0; static uint32_t period_400ms = 0x2625a00; static uint32_t period_3s = 0x11e1a300; FSP_PARAMETER_NOT_USED(p_args); if( 0 == mode%2 ) { R_GPT_PeriodSet(&g_pwm_ledblue_ctrl, period_400ms); } else { R_GPT_PeriodSet(&g_pwm_ledblue_ctrl, period_3s); } mode ++; }

修改 src/hal_entry.c 源文件,在里面修改绿色灯作为呼吸灯工作的的代码如下。

复制… … #include “bsp_pwm.h” … … void hal_entry(void) { timer_info_t info; uint32_t period_counts; uint32_t duty = 0; … … pwm_init(); R_GPT_InfoGet(&g_pwm_ledgreen_ctrl, &info); period_counts = info.period_counts; /* Green Led work as breathe mode */ while (1) { duty ++; if( duty <= 100 ) { R_GPT_DutyCycleSet(&g_pwm_ledgreen_ctrl, (duty*period_counts)/100, GPT_IO_PIN_GTIOCB); } else if( duty>100 && duty<= 200 ) { R_GPT_DutyCycleSet(&g_pwm_ledgreen_ctrl, ((200-duty)*period_counts)/100, GPT_IO_PIN_GTIOCB); } else { duty = 0; R_GPT_DutyCycleSet(&g_pwm_ledgreen_ctrl, 0, GPT_IO_PIN_GTIOCB); } R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS); } … … }

5.4 编译运行

代码修改完成后,在开发板上编译运行。这时可以看到蓝色Led每隔3.4秒将快闪两次,而绿色Led灯则亮度由弱到强,再由强到弱。

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm6

下面是测量蓝色Led的波形图:

基于单片机的定时器PWM呼吸灯和心跳灯实现-单片机定时器输出pwm7

猜你喜欢