找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机用定时器输出PWM、红外按键控制。按键按下灯就会抖动?什么原因。怎么处理

[复制链接]
跳转到指定楼层
楼主
ID:919834 发表于 2021-5-15 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题。请问一下各位大佬。只要按键按下,灯就会发生抖动。定时器模拟PWM输出设置频率为200hz。灯在最亮时不抖动。
有没有解决方法?

单片机源程序如下:
  1. /*****************************************************
  2. * Timer1中断服务函数
  3. *****************************************************/
  4. void Timer1_isr (void) interrupt 3  
  5. {
  6.     /* set Tim_Br1 as mode0 (13-bit) */
  7.     TL1 = 0x1d;       //初始值低字节,TL0 的高 3 位是无效的
  8.     TH1 = 0xfd;         //初始值高字节(50us@16MHz)
  9.         // todo ...
  10.         Tim_B++;                                        //占空比设置80
  11.         Tim_R++;
  12.         Tim_G++;
  13.         count++;
  14.         //Diy_Cnt++;
  15.         cnt_Grad++;
  16.         if(Tim_B >= 80)                        //占空比80
  17.         {
  18.                 Tim_B = 0;
  19.         }
  20.         if(Tim_B < Bout)                //设置占空比值
  21.                 P35 = 1;
  22.         else
  23.                 P35 = 0;
  24.         if(Tim_G >= 80)                        //占空比80
  25.         {
  26.                 Tim_G = 0;
  27.         }
  28.         if(Tim_G < Gout)                //设置占空比值
  29.                 P11 = 1;
  30.         else
  31.                 P11 = 0;
  32.         if(Tim_R >= 80)                        //占空比80
  33.         {
  34.                 Tim_R = 0;
  35.         }
  36.         if(Tim_R < Rout)                //设置占空比值
  37.                 P10 = 1;
  38.         else
  39.                 P10 = 0;
  40.         
  41.         Timer0_Way = 1;
  42. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:921764 发表于 2021-5-15 16:05 | 只看该作者
按键有消抖吗?
回复

使用道具 举报

板凳
ID:919834 发表于 2021-5-15 16:44 | 只看该作者

红外遥控。我用定时7.9ms去过滤杂波了。而且红外接收我用了外部中断去接收。
  1. /*****************************************************
  2. * 外设中断0服务函数
  3. *****************************************************/
  4. void Int_0(void) interrupt 0
  5. {
  6.         InFrared_Way = 1;

  7. }
复制代码

回复

使用道具 举报

地板
ID:921764 发表于 2021-5-15 16:57 | 只看该作者
zikanggong 发表于 2021-5-15 16:44
红外遥控。我用定时7.9ms去过滤杂波了。而且红外接收我用了外部中断去接收。

抱歉,由于控制逻辑我不清楚,所以没法给出具体建议。
但是我觉得既然是闪烁,那需要考虑的就是实际给灯的三个输出的PWM是否符合你的设置了,可以拿示波器测试看看。
回复

使用道具 举报

5#
ID:919834 发表于 2021-5-15 17:01 | 只看该作者
本帖最后由 zikanggong 于 2021-5-15 17:05 编辑
使弓弦 发表于 2021-5-15 16:57
抱歉,由于控制逻辑我不清楚,所以没法给出具体建议。
但是我觉得既然是闪烁,那需要考虑的就是实际给灯 ...

我用示波器看过了。波形正常。但是按键一按会有低电平产生。肉眼能看得到。所以导致的一闪现象
这个红外遥控器采用了nec协议。
回复

使用道具 举报

6#
ID:919834 发表于 2021-5-16 16:55 来自手机 | 只看该作者
有没有大佬解惑
回复

使用道具 举报

7#
ID:160500 发表于 2021-5-17 19:11 | 只看该作者
灯抖动是怎么抖?是抖动还是闪烁?
如果闪烁就是灯控制部分被打断了,造成控制时间过长,也就是刷新率降低或者说频率太低造成
回复

使用道具 举报

8#
ID:919834 发表于 2021-5-17 21:54 | 只看该作者
本帖最后由 zikanggong 于 2021-5-17 22:01 编辑
liuzx66 发表于 2021-5-17 19:11
灯抖动是怎么抖?是抖动还是闪烁?
如果闪烁就是灯控制部分被打断了,造成控制时间过长,也就是刷新率降低 ...

按一下就灭一下才亮。
回复

使用道具 举报

9#
ID:919834 发表于 2021-5-17 21:59 | 只看该作者
  1. //红外接收
  2. void IRC_read(void)
  3. {
  4.         unsigned char t,i,j;  
  5.         WDTFLG = 0x5A;
  6.         //EINT0 = 0;                        //关闭中断
  7.         t = 10;                     // 0.793ms延时,运行10次,处理无效红外信号,防止干扰
  8.     while(--t)  
  9.     {  
  10.         // 定时0.793*10ms 处理无效红外信号
  11.         TH0 = 0xfb;
  12.         TL0 = 0xdf;
  13.         TR0 = 1;
  14.         while(!TF0);
  15.         TF0 = 0;
  16.         TR0 = 0;
  17.          
  18.         //P32变高电平,无效红外信号,跳出函数  
  19.         if(P32)  
  20.         {  
  21.             EINT0 = 1;            //中断开启
  22.             return ;  
  23.         }  
  24.     }  
  25.       
  26.     while(!P32);                           // 等待9ms低电平过去  
  27.    
  28.         //刷新最后2ms左右的低电平        处理长按的
  29.     TH0 = 0xf3;                          //3072/FFFF-C00 (16m@hz)
  30.     TL0 = 0xff;                          //
  31.     TR0 = 1;  
  32.     while(!TF0);  
  33.     TF0 = 0;  
  34.     TR0 = 0;                    //延时2.305ms  即3072/FFFF-C00 (16m@hz)
  35.       
  36.     //处理长按
  37.     if(!P32)  
  38.     {         
  39.                 EINT0=1;                        //中断0打开       
  40.                 return;  
  41.     }

  42.     //等待4.5ms高电平的过去  
  43.     while(P32);     
  44.    
  45.     //开始接收用户码  
  46.     for(i=0; i<4; i++)  
  47.     {  
  48.         for(j=0; j<8; j++)  
  49.         {  
  50.             while(!P32);                   //等待低电平过去 低电平相同不用计时
  51.             Data[i] >>= 1;             //把上次的数据位右移一位  
  52.                        
  53.                        
  54.         //延时0.793ms (>0.56ms)
  55.             TH0 = 0xfb;  
  56.             TL0 = 0xdf;
  57.             TR0 = 1;  
  58.             while(!TF0);  
  59.             TR0=0;  
  60.             TF0=0;              
  61.               
  62.             // 若为数据"1",则延时后P32为高电平  
  63.             if(P32)   
  64.             {  
  65.                 Data[i] |= 0x80;    // 所有数据位1放最高位  
  66.                 while(P32);                    // 等待高电平过去  
  67.             }  
  68.         }
  69.         }               
  70.     return;
  71. }


  72. 这是搬大佬的红外接收代码使用
复制代码
回复

使用道具 举报

10#
ID:919834 发表于 2021-5-17 22:00 | 只看该作者

谢谢大佬鼎力相助
回复

使用道具 举报

11#
ID:919834 发表于 2021-5-17 22:04 | 只看该作者
liuzx66 发表于 2021-5-17 19:11
灯抖动是怎么抖?是抖动还是闪烁?
如果闪烁就是灯控制部分被打断了,造成控制时间过长,也就是刷新率降低 ...

刷新率指的是程序在某段运行时间有点长导致刷新率低吗
回复

使用道具 举报

12#
ID:919834 发表于 2021-5-18 19:35 | 只看该作者
重写一遍,每个功能尝试,已查出原因:我在写时操作了e2prom,单片机就停止了。导致定时器模拟PWM停止,要么rgb处于高电平要么低电平。希望各位如我一样的新手。好好读读厂商提供的手册和最好能找对应的技术支持
回复

使用道具 举报

13#
ID:956872 发表于 2021-9-4 18:23 | 只看该作者
zikanggong 发表于 2021-5-18 19:35
重写一遍,每个功能尝试,已查出原因:我在写时操作了e2prom,单片机就停止了。导致定时器模拟PWM停止,要 ...

你的EEPROM存储是不是跟PWM的定时器用的同一个定时中断
回复

使用道具 举报

14#
ID:624769 发表于 2021-9-4 21:28 | 只看该作者
PEB188 发表于 2021-9-4 18:23
你的EEPROM存储是不是跟PWM的定时器用的同一个定时中断

Eeprom 操作时,发送完 TRIG 指令之后,新的STC系列 单片机会停止一切其他工作,直到Eeprom 操作完成为止,此时就算有中断产生,只作标志不会触发。所以之前你的程序不停的擦除Eeprom(需要耗时21ms) 我才说不合理。但是你说无所谓我也就不多说了。
回复

使用道具 举报

15#
ID:491577 发表于 2021-9-5 13:22 | 只看该作者
为什么用定时器模拟PWM,用STC单片机PWM模块不好吗?PWM模块是独立的,运行时是不受cpu影响到,擦除Eeprom(需要耗时21ms)也不会影响。
回复

使用道具 举报

16#
ID:964308 发表于 2021-9-7 11:24 来自手机 | 只看该作者
按键按下不是有声音吗,其实那段声音就是按键不完全接触导致的,内部再通断交替,时间大约20ms。消抖的话要么定义一个30ms延时函数,要么做按键的电路
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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