如何利用8051单片机控制舵机
我们知道伺服电机常被称为舵机,它是一种用于精确控制旋转角度的电气装置。适用于一些需要精确控制角度的场合,如机械手的控制。舵机由一个直流电机和控制电路组成,控制电路用于控制电机轴的旋转位置。舵机机的旋转角度值是由PWM信号控制的,通过改变PWM信号的宽度,可以改变电机的旋转角度和旋转方向。 有关舵机和如何使用它的更多信息,请参阅:舵机角度的控制原理 和 什么是舵机。

8051单片机
在百度百科中8051单片机的介绍如下:
8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔公司于1981年制造。INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,如Atmel、飞利浦、深联华等公司,相继开发了功能更多、更强大的兼容产品。
(引自百度百科)
8051单片机引脚图

使用8051(H1)产生PWM
在实际使用中,我们发现SG90舵机的实际占空比,从-90°到+90°的旋转时间与理想值存在差异。在约~0.54ms(2.7%的占空比)时,我们得到了轴在-90°时的位置;在约~1.4ms(7%占空比)时,我们得到了轴在0°(中性)的位置;在约~2.4ms(12%占空比),我们得到轴+90°的位置。要控制舵机在-90°至+90°旋转。我们需要产生50Hz的PWM波形,占空比变化从~0.54ms到~2.4ms。这样我们可以使用8051中的定时器来产生PWM信号。
SG90舵机与8051单片机的连接

本例采用的是AT89S52单片机,现在我们用AT89S52编程生成50Hz PWM来控制舵机在-90°到+90°的角度旋转,并在AT89S52的P2.0引脚上产生PWM信号,用于控制舵机。
C程序代码
#include <reg52.h> #include <intrins.h> /* 定义值加载在计时器上的PWM周期为20毫秒 */ #define PWM_Period 0xB7FE sbit Servo_Motor_Pin = P2^0; unsigned int ON_Period, OFF_Period, DutyCycle; /* 函数在11.0592MHZ提供1ms的延迟 */ void delay(unsigned int count) { int i,j; for(i=0; i<count; i++) for(j=0; j<112; j++); } void Timer_init() { TMOD = 0x01; /* Timer0 mode1 */ TH0 = (PWM_Period >> 8);/* 20ms timer value */ TL0 = PWM_Period; TR0 = 1; /* Start timer0 */ } /* Timer0 中断服务程序 (ISR) */ void Timer0_ISR() interrupt 1 { Servo_Motor_Pin = !Servo_Motor_Pin; if(Servo_Motor_Pin) { TH0 = (ON_Period >> 8); TL0 = ON_Period; } else { TH0 = (OFF_Period >> 8); TL0 = OFF_Period; } } /* 从占空比中计算开关周期 */ void Set_DutyCycle_To(float duty_cycle) { float period = 65535 - PWM_Period; ON_Period = ((period/100.0) * duty_cycle); OFF_Period = (period - ON_Period); ON_Period = 65535 - ON_Period; OFF_Period = 65535 - OFF_Period; } int main() { EA = 1; /* 启用全局中断 */ ET0 = 1; /* 启用 timer0 中断 */ Timer_init(); while(1) { Set_DutyCycle_To(2.7); /* 0.54ms 占20ms周期的 2.7% */ delay(1000); Set_DutyCycle_To(7); /* 1.4ms 占20ms周期的 7% */ delay(1000); Set_DutyCycle_To(12); /* 2.4ms 占20ms周期的 12%*/ delay(1000); } }
8051控制舵机的源码下载
链接:https://pan.baidu.com/s/1Of-Y36sUk_guiAHL_auaUA
提取码:p3gd