搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2009-6-20 14:20:56 | 显示全部楼层 |阅读模式
我用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多
不知道哪里错了,望各位指教

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

发表于 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;               
                }
}

出0入0汤圆

发表于 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;
   


}

出0入0汤圆

 楼主| 发表于 2009-6-23 12:35:16 | 显示全部楼层
谢谢楼上,我明白了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 22:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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