单片机控制舵机
1.简述
我这里用的是SG90舵机
总共三根线,控制好了三根线其实也就控制好了舵机
接线方法
红------------------------VCC-- 5V电压
暗棕色----------------------GND
橙色----------------------信号线
由此,我们可以知道,其实我们只要控制一根信号线就可以了
2.具体
原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
重点:作为一个单片机编写者,具体的原理,我们不必要搞清楚,我们只需知道如何控制它即可,以下将讲解如何控制舵机运转。
T为20ms
第一步 :我们需要使用单片机产生周期为20ms,高电平t等于0.5ms-2.5ms之间的这样一个方波。定时器+中断产生这样的方波。
占空比 = t / T 相关参数如下:
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180
第二步:简单讲一下编程思想吧,我所使用的是方法是定时器+中断,定时器每0.1ms中断一次,需要中断200次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到200次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下(1–0度,2–45度,3–90度,4–135度,5–180度)。
第三步:着重讲程序中一个语句的含义
//我定时器产生的100us
void pwm_Servomoto(void)
{
if(time_count<=set_value)//如果计数值小于设定值,就输出高电平
Sevro_moto_pwm=1; //Sevro_moto_pwm为接信号线的那个引脚
else
Sevro_moto_pwm=0;
if(time_count>=200)//如果计数值大于200,就清0重新开始
time_count=0;
}
附完整代码
#include<AT89x52.H>
#include <intrins.h>
#define Sevro_moto_pwm P2_3 //信号线的引脚
unsigned char pwm_val_left = 0;
unsigned char push_val_left =20;
void pwm_Servomoto(void)
{
if(pwm_val_left<=push_val_left)
Sevro_moto_pwm=1;
else
Sevro_moto_pwm=0;
if(pwm_val_left>=200)
{
pwm_val_left=0;
}
}
/***************************************************/
///*TIMER1中断服务子函数产生pwm信号*/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US
TL1=(65536-100)%256;
pwm_val_left++;
pwm_Servomoto();
}
void main(void)
{
TMOD=0X11;
TH1=(65536-100)/256; //100US
TL1=(65536-100)%256;
TR1= 1;
ET1= 1;
EA = 1;
push_val_left=20;
while(1)
{
push_val_left=25-push_val_left;//使舵机来回摆动
}
}