基于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
                       
                   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值