本文仅介绍固定180度舵机(MG996R舵机、SG90舵机、MG90S舵机等
引脚功能:
舵机的转动角度跟输入脉冲有关,详细看下表:
可以发现一个规律:角度每次增加45度,高电平时间相应增加0.5ms
总周期 - 高电平脉冲 = 低电平脉冲
舵机角度的转动就是通过高、低脉冲的变化实现的
例代码:
#include <regx51.h>
sbit PWM=P1^1; //定义给舵机信号线接的I/O口
void Delay(unsigned char i) //12MHz 延时函数
{
unsigned char a,b; //该段延时函数Delay(1)=0.5ms
for(;i>0;i--)
for(b=71;b>0;b--)
for(a=2;a>0;a--);
}
/****************************************************************
总周期20ms
通过调节占空比实现舵机需要转动的角度
舵机代码用定时器控制更方便稳定,本文方便读者了解使用,使用延时计算
*****************************************************************/
void zero(void) {//0度
PWM=1;
Delay(1); //高电平 Delay(1)=0.5ms。因为周期为20ms,所以低电平就是19.5ms
PWM=0;
Delay(39); //低电平 Delay(39)=19.5ms
}
void one(void) {//45度
PWM=1;
Delay(2); //高电平 Delay(2)=1ms
PWM=0;
Delay(38); //低电平 Delay(38)=19ms
}
void two(void) {//90度
PWM=1;
Delay(3); //高电平 Delay(3)=1.5ms
PWM=0;
Delay(37); //低电平 18.5ms
}
void three(void) {//135度
PWM=1;
Delay(4); //高电平 Delay(4)=2ms
PWM=0;
Delay(36); //低电平 18ms
}
void four(void) {//180度
PWM=1;
Delay(5); //高电平 Delay(5)=2.5ms
PWM=0;
Delay(35); //低电平 17.5ms
}
void main() //主程序
{
while(1){
two(); //调用90度的子程序,实现舵机转动90度
}
}
注·:建议先写一个0度的程序,方便确定舵机转动的方向和角度