0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:凌云物联网实验室 作者:郭工 2022-12-19 09:23 次阅读

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
    led
    +关注

    关注

    242

    文章

    23455

    浏览量

    665346
  • 单片机
    +关注

    关注

    6047

    文章

    44677

    浏览量

    640858
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5209

    浏览量

    215693
  • 定时器
    +关注

    关注

    23

    文章

    3258

    浏览量

    115816
  • 呼吸灯
    +关注

    关注

    10

    文章

    111

    浏览量

    42870
收藏 人收藏

    相关推荐

    怎么样去设计基于单片机PWM呼吸

    51单片机(呼吸)C语言版基于单片机PWM呼吸
    发表于 07-15 06:02

    定时器中断模拟PWM实现呼吸

    STM32F4XX 学习日志:定时器中断模拟PWM实现呼吸前言任务目标解决办法过程定时器配置
    发表于 08-09 09:38

    采用定时器PWM功能实现呼吸的功能

    功能实现:采用定时器PWM功能实现呼吸的功能,PWM
    发表于 08-12 08:06

    51单片机如何利用PWM定时器实现呼吸

    51单片机如何利用PWM定时器实现呼吸
    发表于 10-15 09:24

    如何利用定时器实现呼吸

    没有硬件PWM,只能软件模拟,但是发现都是在闪烁,没有做出呼吸的效果。 使用软件延时的方法可以做出来,但是运行效率太慢了。 我想用定时器中断实现呼吸
    发表于 10-25 06:14

    使用定时器功能实现呼吸亮暗过程

    呼吸就是LED的亮度从暗到亮,再从亮到暗的一个过程。它好像人呼吸一样,所以叫它“呼吸”。我是在网友的帮助下通过
    的头像 发表于 06-11 16:11 1.2w次阅读
    使用<b class='flag-5'>定时器</b>功能<b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>亮暗过程

    利用定时器实现呼吸亮暗过程

    所谓的呼吸,就是一亮一灭有个过度反应到电压上就是电压的变化 由于看起来跟人的呼吸一样,所以由此名。 呼吸主要用到了 中断 和
    的头像 发表于 06-14 07:13 1.6w次阅读
    利用<b class='flag-5'>定时器</b><b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>亮暗过程

    使用单片机定时器模拟PWM输出实现呼吸的程序免费下载

    本文档的主要内容详细介绍的是使用单片机定时器模拟PWM输出实现呼吸的程序免费下载。
    发表于 09-06 17:27 20次下载
    使用<b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>模拟<b class='flag-5'>PWM</b>输出<b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>的程序免费下载

    如何不使用定时器制作简易的51单片机呼吸程序免费下载

    本文档的主要内容详细介绍的是不使用定时器制作简易的51单片机呼吸程序免费下载
    发表于 07-08 17:41 3次下载
    如何不使用<b class='flag-5'>定时器</b>制作简易的51<b class='flag-5'>单片机</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>程序免费下载

    基于51单片机的LED呼吸设计(定时器

    定时器实现led呼吸实验原理: 在高速闪烁时,光信号传入大 脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失。每次循
    发表于 11-04 20:36 51次下载
    基于51<b class='flag-5'>单片机</b>的LED<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>设计(<b class='flag-5'>定时器</b>)

    51单片机利用PWM定时器实现呼吸

    PWM周期:20ms;占空比:0~100;定时器定时时间:200us(即占空比每一份时间:20ms/100);一次呼吸效果(暗->亮->暗
    发表于 11-10 18:50 1次下载
    51<b class='flag-5'>单片机</b>利用<b class='flag-5'>PWM</b>、<b class='flag-5'>定时器</b><b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    51单片机基于定时器的精准呼吸

    51单片机基于定时器的精准呼吸设计目的:实现LED小从最暗到最亮再到最暗的循环显示最暗——最
    发表于 11-21 09:51 50次下载
    51<b class='flag-5'>单片机</b>基于<b class='flag-5'>定时器</b>的精准<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    STM32 使用PWM实现呼吸

    STM32 PWM实现呼吸使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在
    发表于 12-24 19:41 55次下载
    STM32 使用<b class='flag-5'>PWM</b><b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    基于定时器PWM呼吸实例

    本文将介绍通过定时器的输出比较功能实现脉宽可调的输出波形来控制LED等,实现呼吸的效果。
    的头像 发表于 05-01 09:03 1323次阅读
    基于<b class='flag-5'>定时器</b>的<b class='flag-5'>PWM</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>实例

    51单片机呼吸频率怎么调节

    51单片机呼吸频率的调节方法可以通过改变PWM(脉冲宽度调制)的工作周期和占空比来实现。在下面的文章中,我将详细介绍如何使用51
    的头像 发表于 12-19 10:39 2869次阅读