目录
介绍
伺服电动机是用于精确控制角度旋转的电动装置。它用于需要精确控制的地方,例如控制机械臂的情况。
它由一个合适的电机和控制电路组成,用于精确控制电机轴。
这是一个闭环系统。
通过向其施加PWM信号来控制伺服电动机的旋转角度。
通过改变PWM信号的宽度,我们可以改变电机的旋转角度和方向。 使用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中使用Timer生成PWM。
SG90微伺服电机与8051连接
伺服电机接口8051
例
现在让我们编写AT89S52生成50Hz PWM的程序,以控制伺服电机在-90°到+ 90°的旋转角度。 这里我们在AT89S52的P2.0引脚上产生了PWM。
程序
#include <reg52.h>
#include <intrins.h>
/* Define value to be loaded in timer for PWM period of 20 milli second */
#define PWM_Period 0xB7FE
sbit Servo_Motor_Pin = P2^0;
unsigned int ON_Period, OFF_Period, DutyCycle;
/* Function to provide delay of 1ms at 11.0592 MHz */
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 interrupt service routine (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;
}
}
/* Calculate ON & OFF period from duty cycle */
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; /* Enable global interrupt */
ET0 = 1; /* Enable timer0 interrupt */
Timer_init();while(1)
{
Set_DutyCycle_To(2.7);/* 0.54ms(2.7%) of 20ms(100%) period */
delay(1000);
Set_DutyCycle_To(7);/* 1.4ms(7%) of 20ms(100%) period */
delay(1000);
Set_DutyCycle_To(12);/* 2.4ms(12%) of 20ms(100%) period */
delay(1000);
}
}
本教程完整项目工程下载: