打印
[国产单片机]

如何使用IO口模拟呼吸灯的效果

[复制链接]
4728|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
布丁奶茶|  楼主 | 2018-12-18 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于芯片没有硬件的PWM,所以只能软件模拟,但是测下来发现都是在闪烁,没有做出呼吸的效果。
如果是使用延时的方法确实可以做出来,但是对于运行效率来说太慢了。

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

相关帖子

沙发
ayb_ice| | 2018-12-19 08:31 | 只看该作者
定时中断里做

使用特权

评论回复
板凳
mcu51hi2c| | 2018-12-19 09:47 | 只看该作者
软件打开一个40US的中断,每一格加40US就可以了,我前上个月刚写了一个呼吸灯,现在出货了

使用特权

评论回复
地板
coody| | 2018-12-19 10:18 | 只看该作者
使用PWM。至少8位的PWM。

使用特权

评论回复
5
mcu5i51| | 2018-12-19 15:11 | 只看该作者
定时器模拟PWM,只有起始段差一点

使用特权

评论回复
评论
布丁奶茶 2018-12-20 20:07 回复TA
可以详细说下吗? 
6
hhxs0216| | 2018-12-19 16:52 | 只看该作者
软件模拟,放中断里就可以了。

使用特权

评论回复
评论
hhxs0216 2018-12-21 09:34 回复TA
@布丁奶茶 :...那就这样, 取一个变量,范围给定到0-10,然后放中断,小于2 灯亮,否则 灯灭,溢出清零。然后在灯的状态反过来,看看亮度是否变化了。这个判断条件就是类似于占空比。 
布丁奶茶 2018-12-21 09:23 回复TA
@hhxs0216 :你这种延时的方法我知道,就是用定时中断做,我不知道如何才能改变占空比 
hhxs0216 2018-12-21 09:15 回复TA
@hhxs0216 :100改成1000,打错了 
hhxs0216 2018-12-21 09:14 回复TA
@布丁奶茶 : for(i = 0; i < 100; i++) { for(j = 0; j < 100; j++)//亮到灭 { if(j > i) led1(ON); else led1(OFF;) } } 参考下吧,其实楼下@追夜说的很明白了 
布丁奶茶 2018-12-20 20:07 回复TA
可以说一下具体的逻辑怎么实现吗?我现在的问题是出在不知道如何在程序上调整占空比。谢谢了 
7
追夜| | 2018-12-19 20:41 | 只看该作者
定时器中断里,定时一个1ms的中断,计数到100ms翻转一次。这个就是PWM周期, 如果你要调占空比30%,就计数到30ms翻转一次,周期到了再翻转一次,这就是一个PWM波形了。然后就是调占空比变量,慢慢加占空比,加到95%开始减少,减小到20%左右开始增加。就是呼吸效果了

使用特权

评论回复
评论
追夜 2018-12-24 14:26 回复TA
@布丁奶茶 :看问题错了,调整占空比的时间是可以算的,比如你要一个呼吸周期3s,那么从最暗到最亮需要1.5s,你假如从20%亮度调节到100%,需要调节80个,那么调节周期就是1500/80 = 15ms,就是每15ms改变一次占空比,当然最好这个时间要大于一个PWM的周期的。 
追夜 2018-12-24 14:17 回复TA
@布丁奶茶 :所以你就用一个更小的时间去判断占空比,比如100ms周期,你的定时器就定为1ms,计数到30,就灭led,计数到100(一个PWM周期),就亮led,这样led就亮了30ms,就是30%的亮度。觉得有闪烁的话,可以把定时器时间再缩短,修改闪烁频率。这是通用做法,当然会频繁进中断,如果你用stm32的话,可以用它的比较捕获定时器。CP1设占空比,CP2设为周期. 
布丁奶茶 2018-12-20 20:06 回复TA
我试了下,还是有问题。我的问题应该出在怎么占空比上面。如果PWM周期为100ms的话,30%的占空比就应该是亮30ms灭70ms? 那我程序上在何时调整我的占空比呢? 
8
摸摸| | 2018-12-19 21:34 | 只看该作者
定时器的没做,拿延时做了一个.

使用特权

评论回复
9
布丁奶茶|  楼主 | 2018-12-20 17:58 | 只看该作者
追夜 发表于 2018-12-19 20:41
定时器中断里,定时一个1ms的中断,计数到100ms翻转一次。这个就是PWM周期, 如果你要调占空比30%,就计数到3 ...

谢谢,我试试看

使用特权

评论回复
10
布丁奶茶|  楼主 | 2018-12-20 17:59 | 只看该作者
mcu51hi2c 发表于 2018-12-19 09:47
软件打开一个40US的中断,每一格加40US就可以了,我前上个月刚写了一个呼吸灯,现在出货了[e ...

能说一下逻辑吗?

使用特权

评论回复
11
enderman1| | 2018-12-21 08:44 | 只看该作者
一般的实现方法是调制脉宽,主要实现思路是,频率要求一定,在一个周期内对高电平以及低电平的持续的时间进行控制,这样就可以实现PWM调光了

使用特权

评论回复
12
hjl2832| | 2018-12-21 10:25 | 只看该作者
可以开2个定时值呀,一个调频率,一个调占空比。

使用特权

评论回复
13
zryblog| | 2018-12-21 10:59 | 只看该作者
本帖最后由 zryblog 于 2018-12-21 11:01 编辑
        if(++r_pwmctrl==254)
          r_pwmctrl=0;
        r_p3buf=0x0f;
        if(r_pwmctrl<r_pwmbuf[0])
          r_p3buf&=0xfe;
        if(r_pwmctrl<r_pwmbuf[1])
          r_p3buf&=0xfd;
        if(r_pwmctrl<r_pwmbuf[2])
          r_p3buf&=0xfb;
        if(r_pwmctrl<r_pwmbuf[3])
          r_p3buf&=0xf7;

        P3=r_p3buf


中断里面这么做。

使用特权

评论回复
14
布丁奶茶|  楼主 | 2018-12-21 13:39 | 只看该作者
现在呼吸的现象是有了,但是效果不太理想,估计是我占空比的曲线没有设定好,这个有没有好的方法呢?

使用特权

评论回复
15
syx纸飞机| | 2018-12-21 14:38 | 只看该作者
可以给发光二极管并联电容,利用io口控制电容电路通断呗

使用特权

评论回复
16
mcu51hi2c| | 2018-12-21 14:39 | 只看该作者

每40US进一次中断,第一次进中断,设定高电平为40US,周期为1MS,工作30MS,然后再调整高电平为80US,周期依然是1MS,再工作30ms,依此类推就可以了

使用特权

评论回复
17
syx纸飞机| | 2018-12-21 14:39 | 只看该作者
syx纸飞机 发表于 2018-12-21 14:38
可以给发光二极管并联电容,利用io口控制电容电路通断呗

电容不是有充放电嘛

使用特权

评论回复
18
千岁寒| | 2018-12-21 17:02 | 只看该作者
设置一个 PWM 控制 查找表,在中断中不断的 查边设置 PWM波、

使用特权

评论回复
19
gnaijnaoul| | 2018-12-21 18:51 | 只看该作者
这个利用人眼的视觉暂留效应,pwm的周期不能太大了,小于40mS才会得到比较好的效果。

使用特权

评论回复
20
9pin| | 2018-12-22 14:48 | 只看该作者
定义一个最小定时刻度,
最定不一个周期,周期是前面最小定时刻度的倍数。

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


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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

180

帖子

1

粉丝