打印

定时器模拟pwm控制舵机问题(代码+proteus仿真)

[复制链接]
4122|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
onlylgb|  楼主 | 2012-7-11 11:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己写了一个定时器模拟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)

相关帖子

沙发
xj1985426| | 2012-7-11 11:28 | 只看该作者
看看看看

使用特权

评论回复
板凳
跳跳龙123| | 2013-1-22 14:53 | 只看该作者
谢谢 学习下

使用特权

评论回复
地板
1240539881| | 2017-2-15 20:35 | 只看该作者

使用特权

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

本版积分规则

0

主题

5

帖子

1

粉丝