hackei 发表于 2009-6-20 14:20:56

关于用定时器模拟PWM的问题

我用51的定时器1产生PWM波
用示波器测得周期以及高电平时间总是不对
给定时器1赋得初值如下:
        EA=1;
        ET1=1;
TMOD=0x10;
TH1=(int) (65536-t*1000)/256;
TL1=(int) (65536-t*1000)%256;
        TR1=1;
        p20=1;          //输出高电平
定时器中断之后再次给TH1赋值如下:
        p20=~p20;       //输出低电平
        TH1=(int) (65536-(20-t)*1000)/256;
   TL1=(int) (65536-(20-t)*1000)%256;
但是这个算法出来的周期只有5ms多
不知道哪里错了,望各位指教

sz_xdy 发表于 2009-6-22 09:07:43

data_TH1= (65536-t*1000)/256;
data_TL1= (65536-t*1000)/256;         

timer1() interrupt 1 using 0
{
TR1 = 0;
TL1 = data_TL1;
TH1 = data_TH1;
TR1 = 1;
       

        TR0        = 0;
                TH0 = 0xff ;
                TL0 = 0x00 ;   
                TR0 = 1;          
                COUNT++;
                if(COUNT== C_T_data){
                        P34 =1;
               }
                if(COUNT==0xff){
                        COUNT=0;
                        P34 =0;               
                }
}

sz_xdy 发表于 2009-6-22 09:27:21

定时器中断函数里:不能在给TH1,TL1赋值时做计算!
运算只能放在主函数里或定时器启动之后。
      
timer1() interrupt 1 using 0
{
TR1 = 0;
TL1 = data_TL1;
TH1 = data_TH1;
TR1 = 1;      
p20=~p20;       


//计算可以放在这里或主函数里 //
data_TH1=(int) (65536-(20-t)*1000)/256;
data_TL1=(int) (65536-(20-t)*1000)%256;
   


}

hackei 发表于 2009-6-23 12:35:16

谢谢楼上,我明白了
页: [1]
查看完整版本: 关于用定时器模拟PWM的问题