找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5445|回复: 18
打印 上一主题 下一主题
收起左侧

使用单片机PWM调制呼吸灯的时候,低亮度时会发生抖动,怎么处理

  [复制链接]
跳转到指定楼层
楼主
ID:586048 发表于 2020-8-18 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,请问一下各位大佬,在呼吸灯慢慢亮起来的时候,在低亮度区,会发生抖动,有没有办法不降低频率且不增加硬件的情况下解决这个问题?

有人说可以提高PWM的精度,但是我看不懂,有没有大佬能解答一下的?
或者说大佬们有更好的解决方法?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:586048 发表于 2020-8-18 15:15 | 只看该作者
  1. U16 PWMD;//PWM占空比
  2. U8   PWMD_H;//占空比整数
  3. U8   PWMD_L;//占空比余数
  4. U8   PWM_COUNT;//PWM脉冲数
  5. void isr(void) interrupt//PWM中断
  6. {
  7. u8 i;
  8.     if(T8P1IF)
  9.     {
  10.         T8P1IF=0;
  11.         if(++PWM_COUNT>15)
  12.         {
  13.             PWM_COUNT=0;
  14.             PWMD_H= PWMD/16;//求PWM的整数
  15.             PWMD_L=PWMD%16;//求PWM的余数
  16.         }
  17.         i= PWMD_H;
  18.         if( PWMD_L>0)
  19.         {
  20.             i+=1;
  21.             PWMD_L-=1;
  22.         }     
  23.          T8P1RL=i;//每次更新占空比
  24.     }

  25. }[b][/b]
复制代码

看不懂是什么意思,硬件是8位的,他扩展到12位,但是硬件没有的分了,多出来的4位 硬件8位不支持,那他多出来的4位怎么会提高他的精度呢
回复

使用道具 举报

板凳
ID:809311 发表于 2020-8-18 15:58 | 只看该作者
都是这样子的。pwm波总会有抖动的。程序也不好解决。
回复

使用道具 举报

地板
ID:213173 发表于 2020-8-18 16:51 | 只看该作者
hzw854025403 发表于 2020-8-18 15:15
看不懂是什么意思,硬件是8位的,他扩展到12位,但是硬件没有的分了,多出来的4位 硬件8位不支持,那他多 ...

PWM周期大于20ms就会闪烁。
回复

使用道具 举报

5#
ID:586048 发表于 2020-8-18 18:48 | 只看该作者
wulin 发表于 2020-8-18 16:51
PWM周期大于20ms就会闪烁。

不是常亮的时候闪烁,是呼吸的时候会有一点抖动,从暗到亮的时候抖动,我现在的频率是22K,1000的精度,如果是4千的精度就不会出现抖动,但是频率就下降了。
回复

使用道具 举报

6#
ID:401564 发表于 2020-8-19 08:37 | 只看该作者
1KHZ以上的PWM频率,LED灯就不会抖动了,不管是大功率的LED手电还是LED指示灯,都不会抖动,我们这的手电筒统一用的就是1024HZ的PWM频率
你的抖动,要么是程序的问题,要么是电路的问题
C语言我不会,你的程序是不是调节的时候只调节PWMD_L,而PWMD_H没有调节?
正常的是:高电平时间加1,低电平时间就减1,保持PWM频率不变
回复

使用道具 举报

7#
ID:235954 发表于 2020-8-19 11:10 | 只看该作者
抖动,刚启动的时候是有一些
回复

使用道具 举报

8#
ID:800832 发表于 2020-8-19 11:40 | 只看该作者
扫描平率问题吧。
回复

使用道具 举报

9#
ID:89515 发表于 2020-8-23 21:31 | 只看该作者
频率太低,精度不够,就会出现这样的情况,硬件PWM位数不够,就模拟PWM,但是会占用资源。这个没有更好的方法,要么就更换芯片。
回复

使用道具 举报

10#
ID:748646 发表于 2020-8-23 22:03 来自手机 | 只看该作者
最好的办法串联电感或并联电容
回复

使用道具 举报

11#
ID:739727 发表于 2020-8-23 22:51 | 只看该作者
换stm32 ,使用高级定时器
回复

使用道具 举报

12#
ID:586048 发表于 2020-8-27 20:45 | 只看该作者
mengzhixinheng 发表于 2020-8-23 21:31
频率太低,精度不够,就会出现这样的情况,硬件PWM位数不够,就模拟PWM,但是会占用资源。这个没有更好的方 ...

现在用软件模拟增加了精度
回复

使用道具 举报

13#
ID:586048 发表于 2020-8-27 20:46 | 只看该作者
Y_G_G 发表于 2020-8-19 08:37
1KHZ以上的PWM频率,LED灯就不会抖动了,不管是大功率的LED手电还是LED指示灯,都不会抖动,我们这的手电筒统一 ...

这个抖动是精度不够引起的,和芯片也有点关系,现在用软件的方法增加了精度
回复

使用道具 举报

14#
ID:586048 发表于 2020-8-27 20:50 | 只看该作者
谢谢各位,现在解决了,这是我增加了一位的精度
  1. void PWM_CH5_LED_huxi(unsigned int PWM5_huxi2_c)
  2. {
  3.         if(LED_Low_P_huxi_f == 0)
  4.         {
  5.                 PWMD_HuXi = PWM5_huxi2_c*Light_first_gear<<1;
  6.                 TK_Debug_UartPutChar('B');
  7.         }
  8.         if(LED_PWM5_F == 0)
  9.         {                                               
  10.                 PWM_COUNT++;                                                                //这个是用来增加精度的
  11.                 if(PWM_COUNT >= 2)                                                                //2是扩展了1位的精度,和下面的右移一位对应
  12.         {
  13.             PWM_COUNT = 0;
  14.             PWMD_HuXi   = PWMD_HuXi - PWM5_huxi2_c;
  15.             TK_Debug_UartPutChar('L');
  16.         }
  17.         LED_light_Hz_c = (PWMD_HuXi + PWM_COUNT)>>1;        //必须和扩展位数保持一直                
  18.         
  19.                 if(LED_light_Hz_c <= PWM5_huxi2_c)
  20.                 {       
  21.                         LED_PWM5_F = 1;                                                                //呼吸到最亮调到下面
  22.                         PWMD_HuXi = 0;
  23.                         TK_Debug_UartPutChar('L');
  24.                 }
  25.         }
  26.         else
  27.         {
  28.                 PWM_COUNT++;
  29.                 if(PWM_COUNT >= 2)
  30.         {
  31.             PWM_COUNT = 0;
  32.             PWMD_HuXi   = PWMD_HuXi + PWM5_huxi2_c;
  33.             TK_Debug_UartPutChar('H');
  34.         }
  35.         LED_light_Hz_c = (PWMD_HuXi + PWM_COUNT)>>1;
  36.                 if(LED_light_Hz_c >= LED_light_gear*Light_first_gear)
  37.                 {
  38.                         LED_PWM5_F = 0;
  39.                         Huxi_end_f = 1;
  40.                 }
  41.         }

  42. }
复制代码
回复

使用道具 举报

15#
ID:815969 发表于 2020-8-27 22:50 | 只看该作者
抖动是无法避免的,在程序中增加一个延时多少毫秒的指令就可以了,即
回复

使用道具 举报

16#
ID:815969 发表于 2020-8-27 22:52 | 只看该作者
抖动是无法避免的,在i模块的最后加一个延时多少毫秒/秒/微秒就可以了
回复

使用道具 举报

17#
ID:420836 发表于 2020-8-29 07:53 | 只看该作者
感谢楼主,这确实很有帮助。 我将使用这方法来解决我的问题。
回复

使用道具 举报

18#
ID:382454 发表于 2020-8-29 22:22 来自手机 | 只看该作者
频率快点就不抖了,很简单。
回复

使用道具 举报

19#
ID:808485 发表于 2020-8-31 14:56 | 只看该作者
亮度高的时候,人眼的视觉暂留效果强,所以感觉不到闪烁,强光手电来一下,眼前能亮半分钟:)。
所以无论怎样,同样软硬件的条件下,暗的肯定比亮的闪烁厉害。

不过楼主也可能说的不是闪烁,而是说亮度升降时出现梯度,不平滑,没实现无级调光,那这是分辨率低造成的。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表