[国产单片机] 如何使用IO口模拟呼吸灯的效果

[复制链接]
5301|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。
mcu5i51 发表于 2018-12-19 15:11 | 显示全部楼层
定时器模拟PWM,只有起始段差一点

评论

可以详细说下吗?  发表于 2018-12-20 20:07
hhxs0216 发表于 2018-12-19 16:52 | 显示全部楼层
软件模拟,放中断里就可以了。

评论

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

评论

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

谢谢,我试试看
 楼主| 布丁奶茶 发表于 2018-12-20 17:59 | 显示全部楼层
mcu51hi2c 发表于 2018-12-19 09:47
软件打开一个40US的中断,每一格加40US就可以了,我前上个月刚写了一个呼吸灯,现在出货了[e ...

能说一下逻辑吗?
enderman1 发表于 2018-12-21 08:44 | 显示全部楼层
一般的实现方法是调制脉宽,主要实现思路是,频率要求一定,在一个周期内对高电平以及低电平的持续的时间进行控制,这样就可以实现PWM调光了
hjl2832 发表于 2018-12-21 10:25 | 显示全部楼层
可以开2个定时值呀,一个调频率,一个调占空比。
zryblog 发表于 2018-12-21 10:59 | 显示全部楼层
本帖最后由 zryblog 于 2018-12-21 11:01 编辑
  1.         if(++r_pwmctrl==254)
  2.           r_pwmctrl=0;
  3.         r_p3buf=0x0f;
  4.         if(r_pwmctrl<r_pwmbuf[0])
  5.           r_p3buf&=0xfe;
  6.         if(r_pwmctrl<r_pwmbuf[1])
  7.           r_p3buf&=0xfd;
  8.         if(r_pwmctrl<r_pwmbuf[2])
  9.           r_p3buf&=0xfb;
  10.         if(r_pwmctrl<r_pwmbuf[3])
  11.           r_p3buf&=0xf7;

  12.         P3=r_p3buf


中断里面这么做。
 楼主| 布丁奶茶 发表于 2018-12-21 13:39 | 显示全部楼层
现在呼吸的现象是有了,但是效果不太理想,估计是我占空比的曲线没有设定好,这个有没有好的方法呢?
syx纸飞机 发表于 2018-12-21 14:38 | 显示全部楼层
可以给发光二极管并联电容,利用io口控制电容电路通断呗
mcu51hi2c 发表于 2018-12-21 14:39 | 显示全部楼层

每40US进一次中断,第一次进中断,设定高电平为40US,周期为1MS,工作30MS,然后再调整高电平为80US,周期依然是1MS,再工作30ms,依此类推就可以了
syx纸飞机 发表于 2018-12-21 14:39 | 显示全部楼层
syx纸飞机 发表于 2018-12-21 14:38
可以给发光二极管并联电容,利用io口控制电容电路通断呗

电容不是有充放电嘛
千岁寒 发表于 2018-12-21 17:02 | 显示全部楼层
设置一个 PWM 控制 查找表,在中断中不断的 查边设置 PWM波、
gnaijnaoul 发表于 2018-12-21 18:51 来自手机 | 显示全部楼层
这个利用人眼的视觉暂留效应,pwm的周期不能太大了,小于40mS才会得到比较好的效果。
9pin 发表于 2018-12-22 14:48 | 显示全部楼层
定义一个最小定时刻度,
最定不一个周期,周期是前面最小定时刻度的倍数。

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


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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

180

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部