调整占空比
要控制舵机,就要向舵机信号线输入PWM信号,信号频率大约50HZ,即周期=1/频率=1/50=0.02s,也就是20ms左右。通过调节不同的占空比来控制舵机旋转不同角度。
这里可以通过中断来改变占空比。首先设置定时器,定时0.5毫秒触发一次中断。
void timerInit()
{
TMOD = 0x01;
TL0 = 0x33;
TH0 = 0xFE; //0.5毫秒爆表
TF0 = 0;
TR0 = 1;
ET0 = 1; //开启定时器中断
EA = 1;
}
0.5毫秒一到,让cnt+1。当cnt累计到40时,刚好就是一个周期的时间,也就是20ms。然后在这个周期当中,我们需要修改占空比。所以,在中断里面加入判断,在一个周期内的某个时间断输出高点平,其余时间段输出低电平。
void timeInterrupt() interrupt 1 //中断开始
{
cnt++;
TL0 = 0x33; //重置定时器
TH0 = 0xFE;
if(cnt < jd){ //改变占空比
sg_con = 1;
}else{
sg_con = 0;
}
if(cnt == 40){ //一个周期的时间,即20ms
cnt = 0;
sg_con = 1;
}
}
完整代码:
#include "reg52.h"
int cnt;
int jd;
sbit sg_con = P1^1;
void Delay1000ms() //延时1秒
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void timerInit()
{
TMOD = 0x01;
TL0 = 0x33;
TH0 = 0xFE; //定时0.5ms
TF0 = 0;
TR0 = 1; //开启定时器
ET0 = 1; //开启定时器中断
EA = 1;
}
void timeInterrupt() interrupt 1 //中断开始
{
cnt++;
TL0 = 0x33;
TH0 = 0xFE;
if(cnt < jd){ //改变占空比
sg_con = 1;
}else{
sg_con = 0;
}
if(cnt == 40){
cnt = 0;
sg_con = 1;
}
}
void main()
{
sg_con = 1;
cnt = 0;
timerInit(); //初始化定时器
while(1){ //每隔一秒切换一次角度
jd = 1; //舵机转0度
Delay1000ms();
jd = 3; //舵机转90度
Delay1000ms();
}
}