一、实验原理
1、舵机转动的原理(如下图所示)
1,根据上图我们可以得知,要想控制舵机转动指定的角度,必须要让它在一定的周期(20ms)中,获得一定时间(分别是0.5ms、1ms、1.5ms、2ms、2.5sm)的高电平,具体对应关系,上图中已给出。
1,现在我们要做的就是生成一个周期为20ms的PWM波,通过设定一个比较值(最大为20ms),用来控制我们的高电平时间,进而控制舵机转动指定角度。
2、生成PWM波的原理
(1)用定时来实现,设定一个初始值,使其溢出时间为500us,再设定一个计数值,控制PWM波的周期,该值最大为40(500us*40=20 000us),如此便设定了周期为20ms;计数值会一直和比较值做比较,这样就可以实现高电平时间的控制。
(2)通过上述三个值的调节,就可以实现舵机不同角度的转动。
二、关键代码
主函数:(注释紊乱是编码的问题,复制到Keil5里选择ANSI编码就没问题了)
/*
Ä£Äâ¶æ»ú¿ØÖÆÔÀí£º0~180¡ã
0.5ms-----0¶È
1.0ms-----45¶È
1.5ms-----90¶È
2.0ms-----135¶È
2.5ms-----180¶È
*/
#include <REGX52.H>
#include "timer0.h"
#include "delay.h"
sbit SG_PWM=P2^0; //ÐźſØÖÆÒý½Å ºì¡ª¡ªVCC ר¡ª¡ªGND »Æ¡ª¡ªÐźÅÏß
unsigned char count=0; //¼Æ´Î ¸³³õֵΪ0
unsigned char PWM_count=0; //0--0¶È£¬2--45¶È£¬4--90¶È£¬6--135¶È£¬8--180¶È
void main()
{
Timer0_Init();
while(1)
{
PWM_count=1; //¶æ»úת¶¯0¶È(0.5ms)
Delay(1000);
PWM_count=2; //¶æ»úת¶¯45¶È(1ms)
Delay(1000);
PWM_count=3; //¶æ»úת¶¯90¶È(1.5ms)
Delay(1000);
PWM_count=4; //¶æ»úת¶¯135¶È(2ms)
Delay(1000);
PWM_count=5; //¶æ»úת¶¯180¶È(2.5ms)
Delay(1000);
}
}
void Timer0() interrupt 1 //ÌØ±ð×¢Òâ´Ë´¦£¬0--ÍⲿÖжÏ0£¬1--¶¨Ê±Æ÷ÖжÏ0£¬2--ÍⲿÖжÏ1£¬3--¶¨Ê±Æ÷ÖжÏ1£¬4--´®ÐпÚÖжÏ1
{
TL0 = 0x33;
TH0 = 0xFE; //ÖØÐ¸³¼ÆÊ±Æ÷³õֵΪ0.5ms
count++; //¼Æ´Î£¬Ã¿500us¼ÇÒ»´Î count+1
count%=40; //ÿ¸öÖÜÆÚΪ20ms
if(count<PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
}
定时器0
#include <REGX52.H>
void Timer0_Init()
{
TMOD &= 0xF0; //ÉèÖö¨Ê±Æ÷ģʽ
TMOD |= 0x01; //ÉèÖö¨Ê±Æ÷ģʽ
TL0 = 0x33; //ÉèÖö¨Ê±³õʼֵ
TH0 = 0xFE; //ÉèÖö¨Ê±³õʼֵ
ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0µÄÖжÏ
TF0 = 0; //Çå³ýÒç³öÖжϱê־λ
TR0 = 1; //¶¨Ê±Æ÷0¿ªÊ¼¼ÆÊ±
EA = 1; //¿ª×ÜÖжÏ
}
延时函数:
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
注:若要实现不同角度的控制,只需要改变 PWM_count的值就好。