单片机控制 舵机 参考程序
51单片机的资源都差不多,这里采用STC89C52作为控制芯片,上位机的输出控制信号,利用串口接收控制舵机。理论上,只用一个定时器就可以产生无限多路PWM波输出,但事实上,PWM输出越多,定时器中断里面操作的语句就越多,很繁杂,单片机的运行速度会变得很慢,以致于输出PWM波周期大于一般舵机的控制周期20ms,或者频率产生误差,导致舵机的颤抖。所以,只利用一个定时器输出PWM有一定限制,路数不能太多,如果需要控制的舵机数量太多,建议更换带有PWM输出的单片机。下面是单片机控制三路舵机的程序。
#include
sbit duoji1=P3^2;//PWM输出口1
sbit duoji2=P2^4;//PWM输出口2
sbit duoji3=P2^5;//PWM输出口3
intt,xinhao[3],flag;//xinhao[3]是上位机传来的三个控制信号
void main()
{
EA=1;
flag=0;
for(t=0;t<3;t++)
xinhao[t]=15;//初始化控制信号
t=0;
TMOD=0x21;//设置定时器1的工作方式为3,用于产生波特率, //接收串口的数据,设置定时器0的工作方式为1, //用于控制舵机的PWM波输出
TH1=0xfd;//设置串口波特率为9600
TL1=0xfd;
TR1=1;
ES=1;
REN=1;
SM0=0;
SM1=1;
PCON=0x00;
TH0=(65536-40)/256;//定时器0每40微妙产生一次中断,注意: //中断产生的频率越高,单片机运行速度也//会越慢,但控制信号宽度会变宽,控制也//越精准,需要各位自己权衡
TL0=(65536-40)%256;
ET0=1;
TR0=1;
while(1);
}
void timer0() interrupt 1//PWM波输出控制
{
TH0=(65536-40)/256;
TL0=(65536-40)%256;
t++;
if(t==xinhao[0])
duoji1=0;
if(t==xinhao[1])
duoji2=0;
if(t==xinhao[2])
duoji3=0;
if(t==500)//
{
t=0;
duoji1=1;
duoji2=1;
duoji3=1;
}
}
void serial() interrupt 4//接收上位机的控制数据
{
if(flag==0)
{
xinhao[0]=SBUF;
flag=1;
RI=0;
}
else if(flag==1)
{
xinhao[1]=SBUF;
flag=2;
RI=0;
}
else if(flag==2)
{
xinhao[2]=SBUF;
flag=0;
RI=0;
}
}
单片机控制舵 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)