5.1 原理图分析
查看EK-RA6M4的原理图,如下图所示,该开发板上有3个Led指示灯。
另外,这三个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输出模式。
接着选择 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.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灯则亮度由弱到强,再由强到弱。
下面是测量蓝色Led的波形图:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
led
+关注
关注
237文章
22350浏览量
645540 -
单片机
+关注
关注
5991文章
43904浏览量
619614 -
PWM
+关注
关注
114文章
4820浏览量
209559 -
定时器
+关注
关注
23文章
3124浏览量
111898 -
呼吸灯
+关注
关注
9文章
106浏览量
42457
发布评论请先 登录
相关推荐
如何利用定时器中断实现呼吸灯的效果
由于芯片没有硬件的PWM,所以只能软件模拟,但是测下来发现都是在闪烁,没有做出呼吸的效果。 如果是使用延时的方法确实可以做出来,但是对于运行效率来说太慢了。 我的目标是利用定时器中断实现
发表于 03-08 09:43
51单片机是如何实现呼吸灯的
PWM周期:20ms;占空比:0~100;定时器定时时间:200us(即占空比每一份时间:20ms/100);一次呼吸灯效果(暗->亮->暗
发表于 07-14 07:32
定时器实现led呼吸灯的设计资料分享
定时器实现led呼吸灯实验原理:灯在高速闪烁时,光信号传入大 脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失。每次循环时
发表于 11-10 06:43
如何利用定时器实现呼吸灯?
没有硬件PWM,只能软件模拟,但是发现都是在闪烁,没有做出呼吸的效果。
使用软件延时的方法可以做出来,但是运行效率太慢了。
我想用定时器中断实现呼吸
发表于 10-25 06:14
评论