来看文章的都是想快速学会使用的,咱们挑重点的说
(舵机有多种,本文仅介绍固定180度舵机)
?舵机有3根线:红、 ? 黄、 ? 棕
???????????????????????? ↓?????? ? ↓?????? ? ↓
分别对应????? :vcc、信号、接地
2.怎么让舵机转动起来?
舵机的转动角度跟输入脉冲有关,详细看下表
? ? ? ? ? ? ?? 总周期为20ms
?? 角度????????? ?? 高电平???????? ?? 低电平
? ? 0度?????????? ?? 0.5ms?????? ? ?? 19.5ms??????????????????? 可以发现一个规律:角度每次增加45 度
? 45度????????????? 1ms???????????? ? 19ms??????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 高电平时间增加0.5ms
? 90度????????????? 1.5ms??????????? 18.5ms????????????????????????
135度??????????? ? 2ms?????????????? 18ms????????????????????????????? 总周期-高电平脉冲=低电平脉冲
180度????????????? 2.5ms??????????? 17.5ms
?
知道了规律,这下子我们可以来写代码了↓?
#include <regx51.h>
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--);
}
sbit PWM=P1^1; //定义给信号线脉冲输入I/O口
/*
总周期20ms
通过调节占空比实现舵机需要转动的角度
*/
void zero(void) //0度 子程序
{
PWM=1;
Delay(1); //高电平 Delay(1)=0.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) //如果按键按下
{
/* Delay(5); //按键消抖,
if(P3_1==0) // 可删,看需要添加。
*/
two(); //如果按键按下,舵机转动90度
}
else //否则
zero(); //为0度
}
}
PS:建议写代码时先写一个0度的程序,先确定舵机0度位置,方便确定舵机转动的方向和角度
|