呼吸灯
这几天我在调整一下,大概一个初稿,一些瑕疵没有解决,
没有调整好:
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