amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 791|回复: 7

定时器的溢出作为PWM计数出现奇怪问题

[复制链接]
发表于 2014-12-30 20:53:03 | 显示全部楼层 |阅读模式
10莫元
利用定时器的溢出作为PWM计数,理论上应该是50%占空比的方波却发现不是,一晚上调试无果,特来请教
先看程序,相当简短:
[code]

//********************************************单片机红外发射*******************************************
#include "reg51.h"
sbit ir=P3^2;//红外发射管控制脚

unsigned int count, set_count; //中断计数,设定中断次数
sfr AUXR   = 0x8E;

//---------------------------------------------------------------------------
void timer0_init()    //定时器初始化
{
EA=1;
TMOD=0x02;     //定时0 8位自动重装模式
ET0=1;
TH0=0xf3;//0xf3;   //定时13us,38K红外矩形波, 12M
TL0=0xf3;   

}
//---------------------------------------------------------------------------
void timer0() interrupt 1 //定时器0中断
{
TH0=0xf3;//0xf3;   //定时13us,38K红外矩形波, 12M
TL0=0xf3;
count++;
}
//---------------------------------------------------------------------------
void main()
{

//AUXR = AUXR|0x80;  // T0, 1T Mode  这里我没有使用1T
timer0_init(); //定时0初始化
count=0;     //中断计数先清0

ir=1;         //红外默认不发射


while(1)
                {
        set_count=430;//计数430次
        ir=1;//连接P32引脚
        count=0;    //中断计数清0
        TR0=1; //计数开始了
        while(count<set_count); //等待计数完毕,在此期间P32是高电平
        TR0=0;
       
        set_count=430;
        ir=0;
        count=0;
        TR0=1;
        while(count<set_count); //在此期间P32是低电平
        TR0=0;
}
}

波形很奇怪:
QQ图片20141230205007.jpg

最佳答案

查看完整内容

用定时器来输出软件PWM不推荐这样写程序,你这样写是有问题的,输出的PWM波是不精确的。 while(1)开头产生上升沿,定时器定430次后再执行了一些程序才产生下降沿,之后又定430次,又是执行了一些程序才产生上升沿,理论周期是38KHZ,实际肯定比这个低 建议把把控制PWM的程序全放到中断里去执行。 void Time0_Int() interrupt 1 { TH0 = 0xFF; TL0 = 0x7B; if(count< jd) pwm=1; ...
发表于 2014-12-30 20:53:04 | 显示全部楼层
用定时器来输出软件PWM不推荐这样写程序,你这样写是有问题的,输出的PWM波是不精确的。
while(1)开头产生上升沿,定时器定430次后再执行了一些程序才产生下降沿,之后又定430次,又是执行了一些程序才产生上升沿,理论周期是38KHZ,实际肯定比这个低
建议把把控制PWM的程序全放到中断里去执行。
void Time0_Int() interrupt 1  
{
TH0  = 0xFF;            
TL0  = 0x7B;
    if(count< jd)         
      pwm=1;               
    else
      pwm=0;               
    count++;         
    count=count%200;   
}
count决定PWM周期,jd决定占空比。这样才是较为精确地用定时器输出PWM
 楼主| 发表于 2014-12-30 20:55:32 | 显示全部楼层
高电平  低电平的计数都是430次。理论上应该是50%的方波才对啊
波形相差太多,本来是做红外遥控发射的,一直出现问题
发表于 2014-12-30 22:58:12 | 显示全部楼层
哪个星号的?应该都不会有问题的,类似的应用我比较常用,比如产生一些可调频率脉冲,1H~100KHZ。
另外,红外发射你用 Timer0做PCA时钟是基于什么考虑?我都是直接用系统时钟。
 楼主| 发表于 2014-12-30 23:32:40 | 显示全部楼层
小李非刀 发表于 2014-12-30 22:58
哪个星号的?应该都不会有问题的,类似的应用我比较常用,比如产生一些可调频率脉冲,1H~100KHZ。
另外,红 ...

STC15F104E
也没用PCA,就是普通的定时器1作为38K作为红外载波的
我晚上又编写了纯延时做载波的程序,明天再试试看
最近老是看到您给我回帖,谢谢你了~
发表于 2014-12-31 14:46:54 | 显示全部楼层
既然定时器0设置成自动重装,就不用在中断函数中设初值。

void timer0() interrupt 1 //定时器0中断
{
TH0=0xf3;//0xf3;   //定时13us,38K红外矩形波, 12M
TL0=0xf3;
count++;
}
改成
void timer0() interrupt 1 //定时器0中断
{
count++;
}
发表于 2015-1-6 18:13:14 | 显示全部楼层
tim4146 发表于 2014-12-30 23:32
STC15F104E
也没用PCA,就是普通的定时器1作为38K作为红外载波的
我晚上又编写了纯延时做载波的程序,明 ...

用可编程时钟输出作38K载波不是更好吗,不需要中断耗CPU
 楼主| 发表于 2015-1-7 15:38:49 | 显示全部楼层
makeflyeasy 发表于 2014-12-30 20:53
用定时器来输出软件PWM不推荐这样写程序,你这样写是有问题的,输出的PWM波是不精确的。
while(1)开头产 ...

谢谢大家给的程序,这是前些天做的小硬件,后来用延时还是做出来了
当时用定时器0做的时候编程欠考虑,后期慢慢改进一下
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-20 14:34

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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