单片机/MCU论坛
直播中

李超

7年用户 1307经验值
私信 关注
[问答]

如何利用定时器中断实现呼吸灯的效果

由于芯片没有硬件的PWM,所以只能软件模拟,但是测下来发现都是在闪烁,没有做出呼吸的效果。
如果是使用延时的方法确实可以做出来,但是对于运行效率来说太慢了。

我的目标是利用定时器中断实现呼吸灯,请问应该怎么做?

回帖(23)

杨万富

2019-3-8 09:43:23
软件打开一个40US的中断,每一格加40US就可以了,
举报

刘涛

2019-3-8 09:43:37
定时器模拟PWM,只有起始段差一点
举报

李燕

2019-3-8 09:43:46
软件模拟,放中断里就可以了。
举报

李超

2019-3-8 09:44:15
可以说一下具体的逻辑怎么实现吗?我现在的问题是出在不知道如何在程序上调整占空比。谢谢了  
举报

李燕

2019-3-8 09:44:47
        for(i = 0; i < 100; i++) { for(j = 0; j < 100; j++)//亮到灭 { if(j > i) led1(ON); else led1(OFF;) } } 参考下吧
1 举报

李超

2019-3-8 09:45:04
你这种延时的方法我知道,就是用定时中断做,我不知道如何才能改变占空比  
举报

李燕

2019-3-8 09:45:18
那就这样, 取一个变量,范围给定到0-10,然后放中断,小于2 灯亮,否则 灯灭,溢出清零。然后在灯的状态反过来,看看亮度是否变化了。这个判断条件就是类似于占空比。  
举报

李涛

2019-3-8 09:45:31
定时器中断里,定时一个1ms的中断,计数到100ms翻转一次。这个就是PWM周期, 如果你要调占空比30%,就计数到30ms翻转一次,周期到了再翻转一次,这就是一个PWM波形了。然后就是调占空比变量,慢慢加占空比,加到95%开始减少,减小到20%左右开始增加。就是呼吸效果了
举报

李超

2019-3-8 09:45:47
我试了下,还是有问题。我的问题应该出在怎么占空比上面。如果PWM周期为100ms的话,30%的占空比就应该是亮30ms灭70ms? 那我程序上在何时调整我的占空比呢?
举报

李涛

2019-3-8 09:52:17
所以你就用一个更小的时间去判断占空比,比如100ms周期,你的定时器就定为1ms,计数到30,就灭led,计数到100(一个PWM周期),就亮led,这样led就亮了30ms,就是30%的亮度。觉得有闪烁的话,可以把定时器时间再缩短,修改闪烁频率。这是通用做法,当然会频繁进中断,如果你用stm32的话,可以用它的比较捕获定时器。CP1设占空比,CP2设为周期.  
举报

李涛

2019-3-8 09:52:30
看问题错了,调整占空比的时间是可以算的,比如你要一个呼吸周期3s,那么从最暗到最亮需要1.5s,你假如从20%亮度调节到100%,需要调节80个,那么调节周期就是1500/80 = 15ms,就是每15ms改变一次占空比,当然最好这个时间要大于一个PWM的周期的。
举报

王鹏

2019-3-8 09:52:40
一般的实现方法是调制脉宽,主要实现思路是,频率要求一定,在一个周期内对高电平以及低电平的持续的时间进行控制,这样就可以实现PWM调光了
举报

王刚

2019-3-8 09:52:49
可以开2个定时值呀,一个调频率,一个调占空比
举报

李丽

2019-3-8 09:53:05
  1.         if(++r_pwmctrl==254)
  2.           r_pwmctrl=0;
  3.         r_p3buf=0x0f;
  4.         if(r_pwmctrl
  5.           r_p3buf&=0xfe;
  6.         if(r_pwmctrl
  7.           r_p3buf&=0xfd;
  8.         if(r_pwmctrl
  9.           r_p3buf&=0xfb;
  10.         if(r_pwmctrl
  11.           r_p3buf&=0xf7;

  12.         P3=r_p3buf
举报

刘艳

2019-3-8 09:53:19
可以给发光二极管并联电容,利用io口控制电容电路通断呗
举报

李勇

2019-3-8 09:53:36
定义一个最小定时刻度,
最定不一个周期,周期是前面最小定时刻度的倍数。

周期种,同样电平的多个最小定时刻度穿插。


目的是,连续高电平或者低电平,最好不要太长,
人眼的反应时间据说是24ms.
举报

李超

2019-3-8 09:54:47
现在呼吸的现象是有了,但是效果不太理想,估计是我占空比的曲线没有设定好,这个有没有好的方法呢?
举报

李秀兰

2019-3-8 09:55:13
估计是曲线问题,你可以调整呼吸曲线的,比如达到100%了,就延时一会再开始变暗,呼吸效果就不会显得太急促。可以多试试,自己觉得呼吸效果舒服就可以了
举报

李超

2019-3-8 09:55:24
感谢楼上各位的回复,找到问题了,模拟的PWM周期控制在10ms,呼吸周期3s,效果比较好。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分