标题: 使用单片机PWM调制呼吸灯的时候,低亮度时会发生抖动,怎么处理 [打印本页]

作者: hzw854025403    时间: 2020-8-18 15:04
标题: 使用单片机PWM调制呼吸灯的时候,低亮度时会发生抖动,怎么处理
如题,请问一下各位大佬,在呼吸灯慢慢亮起来的时候,在低亮度区,会发生抖动,有没有办法不降低频率且不增加硬件的情况下解决这个问题?

有人说可以提高PWM的精度,但是我看不懂,有没有大佬能解答一下的?
或者说大佬们有更好的解决方法?

作者: hzw854025403    时间: 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位怎么会提高他的精度呢
作者: Roy-2010    时间: 2020-8-18 15:58
都是这样子的。pwm波总会有抖动的。程序也不好解决。
作者: wulin    时间: 2020-8-18 16:51
hzw854025403 发表于 2020-8-18 15:15
看不懂是什么意思,硬件是8位的,他扩展到12位,但是硬件没有的分了,多出来的4位 硬件8位不支持,那他多 ...

PWM周期大于20ms就会闪烁。
作者: hzw854025403    时间: 2020-8-18 18:48
wulin 发表于 2020-8-18 16:51
PWM周期大于20ms就会闪烁。

不是常亮的时候闪烁,是呼吸的时候会有一点抖动,从暗到亮的时候抖动,我现在的频率是22K,1000的精度,如果是4千的精度就不会出现抖动,但是频率就下降了。
作者: Y_G_G    时间: 2020-8-19 08:37
1KHZ以上的PWM频率,LED灯就不会抖动了,不管是大功率的LED手电还是LED指示灯,都不会抖动,我们这的手电筒统一用的就是1024HZ的PWM频率
你的抖动,要么是程序的问题,要么是电路的问题
C语言我不会,你的程序是不是调节的时候只调节PWMD_L,而PWMD_H没有调节?
正常的是:高电平时间加1,低电平时间就减1,保持PWM频率不变
作者: 梁廷明    时间: 2020-8-19 11:10
抖动,刚启动的时候是有一些

作者: quentin83    时间: 2020-8-19 11:40
扫描平率问题吧。
作者: mengzhixinheng    时间: 2020-8-23 21:31
频率太低,精度不够,就会出现这样的情况,硬件PWM位数不够,就模拟PWM,但是会占用资源。这个没有更好的方法,要么就更换芯片。
作者: 海兴晶锐    时间: 2020-8-23 22:03
最好的办法串联电感或并联电容
作者: AAA_MCU    时间: 2020-8-23 22:51
换stm32 ,使用高级定时器

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

现在用软件模拟增加了精度
作者: hzw854025403    时间: 2020-8-27 20:46
Y_G_G 发表于 2020-8-19 08:37
1KHZ以上的PWM频率,LED灯就不会抖动了,不管是大功率的LED手电还是LED指示灯,都不会抖动,我们这的手电筒统一 ...

这个抖动是精度不够引起的,和芯片也有点关系,现在用软件的方法增加了精度
作者: hzw854025403    时间: 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. }
复制代码

作者: wewillglow    时间: 2020-8-27 22:50
抖动是无法避免的,在程序中增加一个延时多少毫秒的指令就可以了,即
作者: wewillglow    时间: 2020-8-27 22:52
抖动是无法避免的,在i模块的最后加一个延时多少毫秒/秒/微秒就可以了
作者: TTQ001    时间: 2020-8-29 07:53
感谢楼主,这确实很有帮助。 我将使用这方法来解决我的问题。
作者: univers    时间: 2020-8-29 22:22
频率快点就不抖了,很简单。
作者: gbchang    时间: 2020-8-31 14:56
亮度高的时候,人眼的视觉暂留效果强,所以感觉不到闪烁,强光手电来一下,眼前能亮半分钟:)。
所以无论怎样,同样软硬件的条件下,暗的肯定比亮的闪烁厉害。

不过楼主也可能说的不是闪烁,而是说亮度升降时出现梯度,不平滑,没实现无级调光,那这是分辨率低造成的。
作者: cy009    时间: 2024-11-21 08:10
占空比保持,增加频率
作者: univers    时间: 2024-11-28 16:06
看看我写的吧,在实用中的代码。http://www.51hei.com/bbs/dpj-172214-1.html
作者: univers    时间: 2024-11-28 16:06
看看我写的吧,实用中的代码。
http://www.51hei.com/bbs/dpj-172214-1.html




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1