基于ST8位——定时器轮训中断做的呼吸灯(软件模拟PWM)

呼吸灯

这几天我在调整一下,大概一个初稿,一些瑕疵没有解决,

没有调整好:

1.因为我感觉我灭灯时候没有让cnt++慢慢回去,而是瞬间拉回高电平亮灯

2.占空比的时间和mcu频率之间和闪烁的矛盾点,(容我在思考怎么处理,请大佬多多指教),主要是人家duty写的少的,会存在闪烁,但是一般给到duty50左右的数值呼吸灯就很正常,但我的理解duty是占空比高电平存活时间,也就是呼-熄-呼才是一个完整周期,那就是我的定时器轮巡200ms,整个完整周期应该是400ms才对么?

正文来了哈!代码现象有,但是细节不好,还望赐教

        首先配置好TIME定时器的的频率(此处看别的文章,无非就是mcu分频几次到定时器给到的时间,值得我们注意到是ST8位是2的8次方256)

其次注意呼吸灯不要有闪烁,这个跟肉眼可见的hz相关,笔者在这发现闪烁效果问题:

1.hz没有调整后

2.没有对pwm_duty和pwm_time_Cnt做初始化置0(极为重要,我发型做各种diy小玩意的代码初始化函数很重要,不然程序跑飞都不知道怎么处理)

3.如果定时器本身配置的很低,可以通过额外加定时器计时延长if(time_cnt++ < 100),值得注意的地方一定要看自己本身定时器的时间!

        呼吸灯原理 通过改变duty值大小,高电平duty越大,呼吸效果越明显;

案例代码(定时器中断)

TIME.C

#define _TIMER_C_
#include "timer.h"

if (Analog_PWM.EN == 0)
     {
            if(Analog_PWM.CNT > SIM_PWM_LED_CYCLE)
            {
                Analog_PWM.CNT = 0; 
             }
            if (Analog_PWM.DUTY > SIM_PWM_LED_CYCLE)
             {
                 Analog_PWM.DUTY = 0;
               }
            if ( Analog_PWM.DUTY++ < SIM_PWM_LED_CYCLE )
              {     
                   if(Analog_PWM.CNT++ < Analog_PWM.DUTY)
                    {
                        
LED_W_ON(); //自己改一下你们的灯
                      }
               }
             else if(Analog_PWM.DUTY == SIM_PWM_LED_CYCLE )
               {
                   if(Analog_PWM.CNT-- < Analog_PWM.DUTY)
                    {
                            LED_W_OFF();
                     }

                }

TIME.h

#ifndef _TIMER_H_
#define _TIMER_H_

#include "config.h"              //我的文件,你们不要写
#include "pwm.h"                //我的文件,你们不要写
#include "operation.h"        //我的文件,你们不要写
#ifdef _TIMER_C_
#define TIMER_EXT
#else
#define TIMER_EXT extern
#endif

// 软件模拟PWM使用的周期
#define SIM_PWM_LED_CYCLE  130   //这里改变duty大小值
#define SIM_LED_PWM_MAX_DUTY SIM_PWM_LED_CYCLE
#define SIM_LED_PWM_MIN_DUTY 0

// 软件模拟PWM
typedef struct 
{
       uint8_t EN  :1;                      //LED_PWM 使能位 1:enable
       uint8_t DUTY;                           //LED_PWM 占空比
    uint8_t CNT;                         //占空比计数
}STRUCT_ANALOG_PWM ;
TIMER_EXT STRUCT_ANALOG_PWM Analog_PWM;

#endif
                       
                   

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用定时器中断呼吸灯功能的原理是通过定时器产生中断来控制LED的亮度变化,从而实现呼吸灯效果。首先,我们可以使用定时器PWM功能来控制LED的亮度。定时器可以设置一个重装值和一个计数值,当计数值达到重装值时,定时器会触发一个中断。在中断服务函数中,我们可以改变LED的亮度。具体步骤如下: 1. 配置定时器的时钟使能和初始化参数,包括重装值、分频系数和计数方式等。 2. 编写中断服务函数,在函数中改变LED的亮度。可以使用GPIO的翻转功能来改变LED的状态。 3. 启动定时器并开启中断功能。 4. 在主函数中调用定时器的开启函数。 通过以上步骤,我们就可以使用定时器中断来实现呼吸灯的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [零基础入门STM32编程(九)——定时器PWM呼吸灯(CUBEMX)](https://blog.csdn.net/oHaoEr/article/details/123632491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32 CubeMx(二)定时器中断PWM呼吸灯](https://blog.csdn.net/weixin_45751396/article/details/119378784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值