自己写了一个定时器模拟20msPWM控制舵机的程序,用proteus仿真示波器观察波形是正确的0.5ms -2.5ms脉宽都是正确的,但是舵机在1.0ms和2.0ms时偏转角度就是不对是怎么回事啊?谁帮分析一下#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar num=0;
//定时器计数
uchar cont=5;
//定义脉冲时间 ,0.5ms 即偏转-90
sbit KEY1=P2^0;
// 定义按键更改脉宽
void delayms(uint i);
void delayms(uint i) //延时函数1ms
{
uint a,b;
for(a=i;a>0;a--)
for(b=122;b>0;b--);
}
void time_init()
//定时器初始化函数
{
TMOD=0x02;
//定时器0工作模式2,8bit重装
TH0=256-100;
//设定时初值
定时0.1ms
TL0=256-100;
ET0=1;
//开定时器0中断
EA=1;
//开全局中断
TR0=1;
//启动定时器0
}
void time0()interrupt 1
//定时器0中断
{
num++;
if(num==cont)
P1=0x00;
//高电平时间结束,低电平开始
if(num==200)
//低电平时间结束,脉冲周期20ms结束
{
P1=0xff;
//低电平时间结束
num=0;
//计数归零
}
}
void KeyScan(void)
//按键改变脉宽+0.5ms
{
if(!KEY1)
{
delayms(20);
while(!KEY1);
if(cont==25)
cont=0;
cont+=5;
num=0;
//重新计时
}
}
void main()
{
time_init();
//定时器初始化
while(1)
{
KeyScan();
}
}
SERVO.rar
(13.15 KB)
|