来看文章的都是想快速学会使用的,咱们挑重点的说
【舵机有多种,本文仅介绍固定180度舵机(MG996R舵机、SG90舵机、MG90S舵机等)】
红色 棕色 黄色
VCC GND 信号线
2.如何让舵机转动起来?
舵机的转动角度跟输入脉冲有关,详细看下表:
脉冲总周期20ms
角度 高电平 低电平
0 0.5ms 19.5ms
45 1ms 19ms
90 1.5ms 18.5ms
135 2ms 18ms
180 2.5ms 17.5ms
可以发现一个规律:角度每次增加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度
}
}
//end
如果需要按键控制,可以通过改变主程序代码实现,如↓
void main()
{
while(1)
{
if(P3_1==0) //按键接P3^1口。如果按键按下
{
/* Delay(20); //10ms的按键消抖,可删,看需要添加。
if(P3_1==0) */
two(); //如果按键按下,调用舵机90度子程序,实现转动90度。
}
else //否则
zero(); //舵机为0度
}
}
PS:建议写代码时先写一个0度的程序,先确定舵机0度位置,方便确定舵机转动的方向和角度