打印

串口接收引起的模拟PWM调光闪烁,请高手帮帮忙

[复制链接]
楼主: xiaomuhong26
手机看帖
扫描二维码
随时随地手机跟帖
21
lhbdyx1| | 2010-11-9 15:17 | 只看该作者 回帖奖励 |倒序浏览
PWM调光的频率被串口打断。尝试找个pwm调光最大的抗干扰时间(隔了多久,让定时器在此工作不会出现闪闪)

使用特权

评论回复
22
xiaomuhong26|  楼主 | 2010-11-9 15:18 | 只看该作者
全调光范围都闪吗?会不会PWM频率太低了?
SmartEnergy 发表于 2010-11-9 14:55

不是,因为是两块单片机,我和队友,一个用STC12C5608单片机写数码显示和按键之类的,我则用STC90C52单片机写12路模拟PWM效果,单块效果都是可行的,但是在加入串口接收程序(用于更新数据)后,才会闪烁的

使用特权

评论回复
23
xiaomuhong26|  楼主 | 2010-11-9 15:19 | 只看该作者
:dizzy:优化中断程序
wkfuye 发表于 2010-11-9 15:08

不知如何优化呢?

使用特权

评论回复
24
believe0815| | 2010-11-9 15:31 | 只看该作者
大哥,您就换个单片机吧,像AVR,STM系列的,硬件PWM,多好呀!!!

使用特权

评论回复
25
xiaomuhong26|  楼主 | 2010-11-9 15:54 | 只看该作者
大哥,您就换个单片机吧,像AVR,STM系列的,硬件PWM,多好呀!!!
believe0815 发表于 2010-11-9 15:31

大哥,12路PWM啊,不是4路,如果是4路,我己解早就解决了,关键是我们以前看过客户的一个产品,人家都做得到,为什么我就做不到呢?所以更加要找出原因,解决他,望 各位大侠出出主意啊

使用特权

评论回复
26
chunfeng12| | 2010-11-9 15:59 | 只看该作者
看了以上的讨论,有个疑问
PWM调光,PWM周期最多也就20ms,这段时间分了多少个等级呢?
PWM优先级最高时串口接不到数据时什么原因?1中断间隔时间短,也就是上面说的20ms分了多少个等级。2中断服务程序冗余。
或许能帮到你!!

使用特权

评论回复
27
xiaomuhong26|  楼主 | 2010-11-9 16:09 | 只看该作者
上传一段实现12路PWM功能的定时程序,望大家提个见议
注:T0_delay:定时时间   R_PWM_1:第一路红色LED占用的高电平时间(0~100)
CYCLE :PWM周期(100) G_PWM_1:  第一路绿色LED占用的高电平时间(0~100)

void tim(void) interrupt 1 using 1
{
unsigned char R1_Count;
unsigned char R2_Count;
unsigned char R3_Count;
unsigned char R4_Count;
unsigned char G1_Count;
unsigned char G2_Count;
unsigned char G3_Count;
unsigned char G4_Count;
unsigned char B1_Count;
unsigned char B2_Count;
unsigned char B3_Count;
unsigned char B4_Count;
TH0=(65536-T0_delay)/256;
TL0=(65536-T0_delay)%256;     
R1_Count++;
G1_Count++;
B1_Count++;
R2_Count++;
G2_Count++;
B2_Count++;
R3_Count++;
G3_Count++;
B3_Count++;
R4_Count++;
G4_Count++;
B4_Count++;
/////////////////////////////////////////
if(!R_PWM_1 || !R1_Count)
{
  R1_Led = LED_OFF;
}   
if (R1_Count <= R_PWM_1)
  {
     R1_Led = LED_ON;            
  }
else if(R1_Count <= CYCLE)
  {
    R1_Led = LED_OFF;
  }
else
  R1_Count=0;  
////////
if(!R_PWM_2 || !R2_Count)
{
  R2_Led = LED_OFF;
}   
if (R2_Count <= R_PWM_2)
  {
     R2_Led = LED_ON;            
  }
else if(R2_Count <= CYCLE)
  {
    R2_Led = LED_OFF;
  }
else
  R2_Count=0;
////////
if(!R_PWM_3 || !R1_Count)
{
  R3_Led = LED_OFF;
}   
if (R3_Count <= R_PWM_3)
  {
     R3_Led = LED_ON;            
  }
else if(R3_Count <= CYCLE)
  {
    R3_Led = LED_OFF;
  }
else
  R3_Count=0;
///////
if(!R_PWM_4 || !R4_Count)
{
  R4_Led = LED_OFF;
}   
if (R4_Count <= R_PWM_4)
  {
     R4_Led = LED_ON;            
  }
else if(R4_Count <= CYCLE)
  {
    R4_Led = LED_OFF;
  }
else
  R4_Count=0;
/////////////////////////////////////
if(!G_PWM_1 || !G1_Count)
{
  G1_Led = LED_OFF;
}   
if (G1_Count <= G_PWM_1)
  {
     G1_Led = LED_ON;            
  }
else if(G1_Count <= CYCLE)
  {
    G1_Led = LED_OFF;
  }
else
  G1_Count=0;
//////
if(!G_PWM_2 || !G2_Count)
{
  G2_Led = LED_OFF;
}   
if (G2_Count <= G_PWM_2)
  {
     G2_Led = LED_ON;            
  }
else if(G2_Count <= CYCLE)
  {
    G2_Led = LED_OFF;
  }
else
  G2_Count=0;
/////
if(!G_PWM_3 || !G1_Count)
{
  G3_Led = LED_OFF;
}   
if (G3_Count <= G_PWM_3)
  {
     G3_Led = LED_ON;            
  }
else if(G3_Count <= CYCLE)
  {
    G3_Led = LED_OFF;
  }
else
  G3_Count=0;
///////
if(!G_PWM_4 || !G4_Count)
{
  G4_Led = LED_OFF;
}   
if (G4_Count <= G_PWM_4)
  {
     G4_Led = LED_ON;            
  }
else if(G4_Count <= CYCLE)
  {
    G4_Led = LED_OFF;
  }
else
  G4_Count=0;
///////////////////////////////
if(!B_PWM_1 || !B1_Count)
{
  B1_Led = LED_OFF;
}   
if (B1_Count <= B_PWM_1)
  {
     B1_Led = LED_ON;            
  }
else if(B1_Count <= CYCLE)
  {
    B1_Led = LED_OFF;
  }
else
  B1_Count=0;
//////
if(!B_PWM_2 || !B2_Count)
{
  B2_Led = LED_OFF;
}   
if (B2_Count <= B_PWM_2)
  {
     B2_Led = LED_ON;            
  }
else if(B2_Count <= CYCLE)
  {
    B2_Led = LED_OFF;
  }
else
  B2_Count=0;
//////
if(!B_PWM_3 || !B1_Count)
{
  B3_Led = LED_OFF;
}   
if (B3_Count <= B_PWM_3)
  {
     B3_Led = LED_ON;            
  }
else if(B3_Count <= CYCLE)
  {
    B3_Led = LED_OFF;
  }
else
  B3_Count=0;
//////
if(!B_PWM_4 || !B4_Count)
{
  B4_Led = LED_OFF;
}   
if (B4_Count <= B_PWM_4)
  {
     B4_Led = LED_ON;            
  }
else if(B4_Count <= CYCLE)
  {
    B4_Led = LED_OFF;
  }
else
  B4_Count=0;
}


因为要实现12路的PWM,所以感觉在定时器里面做了很多的事情,我想请问一下,这样行吗?如果不行,有什么办法可以解决这个问题?我试过用这种方法只实现四路PWM也会有闪烁,请问有别的方法吗?

使用特权

评论回复
28
ji_dan| | 2010-11-9 16:13 | 只看该作者
定时器用中断,串口用查询!

使用特权

评论回复
29
xiaomuhong26|  楼主 | 2010-11-9 16:15 | 只看该作者
补充:T0_delay=100    CYCLE=100   R_PWM_X   G_PWM_X    B_PWM_X   是由单片机A发送来的数据,按键可改变的

使用特权

评论回复
30
xiaomuhong26|  楼主 | 2010-11-9 16:35 | 只看该作者
定时器用中断,串口用查询!
ji_dan 发表于 2010-11-9 16:13

如何串口用查询?如何,我只知当RI=1时则收中断触发啊,TI=1时则发中断触发,定时器还有中断查询,但串口的请问如何解决啊

使用特权

评论回复
31
gunaining123| | 2010-11-9 17:06 | 只看该作者
程序问题

使用特权

评论回复
32
ewq_022| | 2010-11-9 17:12 | 只看该作者
你程序里那么多  count++干什么   这12个count的数值不是一样的吗,

使用特权

评论回复
33
xiaomuhong26|  楼主 | 2010-11-9 17:29 | 只看该作者
本帖最后由 xiaomuhong26 于 2010-11-9 17:32 编辑

那个count己经修改成一个了,可是还是闪烁,后来我把单片机A发送时,里面加了一个短暂的延时后,他就没有那么闪烁了,但数码管有点闪烁了,新手哈,写程序有点冗余

使用特权

评论回复
34
ewq_022| | 2010-11-9 18:01 | 只看该作者
中断函数执行频率很高,能精简就精简吧,而且定时器可以使用自动重载模式3 ,这样并不一定能解决闪烁的问题,精简还是有好处的。

使用特权

评论回复
35
xiaomuhong26|  楼主 | 2010-11-9 18:47 | 只看该作者
自动重装不知为啥更加闪烁,郁闷啊。。。不知是什么原因造成的闪烁。。。这种情况最让人无语了

使用特权

评论回复
36
coody| | 2010-11-9 18:50 | 只看该作者
PWM要优化一下哦

使用特权

评论回复
37
魔鬼小漫| | 2010-11-9 20:03 | 只看该作者
建议先调试一路,再增加路数

使用特权

评论回复
38
baud8o8| | 2010-11-9 20:10 | 只看该作者
:victory:

使用特权

评论回复
39
xiaomuhong26|  楼主 | 2010-11-9 20:17 | 只看该作者
我现在调试了一路,在单片机A发送中,加入了一点延时后,现在单片机B收到数据后处理PWM只有一点闪烁了,但由于加入的一点延时却造 成了数码管显示有点闪,但感觉效果好了一些,不知各位大侠还有更加好的主意吗?望各位大侠指教一下

使用特权

评论回复
40
波波来了哦| | 2010-11-9 21:15 | 只看该作者
双机通信应该用SPI接口,这么快的串口,怎么还用异步串口。还有现在都有LQFP48脚封装的单片机了,按键加12路PWM足够了,不需要用两块单片机了,做出来的效果会更好

使用特权

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

本版积分规则