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

5.1 原理图分析查看ek-ra6m4的原理图,如下图所示,该开发板上有3个led指示灯。
另外,这三个led灯所使用的gpio引脚可以作为定时器的pwm输出使用,其定义如下:
led灯led3led2led1
颜色 红色 绿色 蓝色
引脚 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输出模式。
接着选择 stacks ,点击 new stack -> timers -> timer, general pwm(r_gpt) 添加两个timer pwm协议栈。
接下来设置 pwm 的相关配置,并重新生成代码。
在绿色的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.hfsp_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 && 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灯则亮度由弱到强,再由强到弱。
下面是测量蓝色led的波形图:

季丰电子IC运营工程技术快问快答
美国各机构对加密货币和区块链技术表现出了浓厚的兴趣
5G中分布式基带单元功能的授时精度影响
PCB细线路生产条件与方法
MQTT 5协议你知道多少?
基于单片机的定时器PWM呼吸灯和心跳灯实现
Acrel-5000建筑能耗分析管理系统解决方案
新品推荐| NÜVE FR系列低温冰箱
如何实现电池低温也不减少里程,有什么方法吗
比率差动制动系数计算
GitHubflow你真的了解吗?真正的敏捷工作流
红米pro2携小米平板3或于月底发布,依旧为双摄像头?
5G商用已经箭在弦上 终端RF前端市场新风口起飞
君鉴副总由立斌接受讯石专访:布局光通信领域,为客户提供可租赁的测试整套方案
机器人加速向家电业渗透 服务机器人性价比待提高
小米6虽好,但这三台手机也许是小米最保值的手机,只因价格
pcb基板是什么材料
电气设备接地方式
关于智慧能源的未来的发展分析
Celestica表彰安森美半导体,授予2012 TCOOTM奖