用c语言写一个51单片机通过pwm波控制舵机的代码
时间: 2023-05-21 13:04:30 浏览: 254
以下代码为使用C语言对51单片机进行PWM波控制舵机的程序:
#include <REG52.h>
sbit PWM_Out = P1^0; //PWM输出口为P1.0口
sbit Servo_Out = P2^0; //舵机输出口为P2.0口
void PWM_Init(void) //PWM初始化函数
{
TMOD |= 0x01; //使用定时器0的模式1
TH0 = 0xFF; //定时器初值,使PWM频率为50Hz
TL0 = 0x9C; //定时器初值,使PWM频率为50Hz
ET0 = 1; //使能定时器0中断
EA = 1; //总中断使能
}
void PWM_SetDuty(unsigned char Duty) //定义PWM脉宽占空比的值
{
unsigned int highTime = 0;
highTime = (unsigned int)(Duty/256.0*5000/20);
TH0 = (65536 - highTime) / 256;
TL0 = (65536 - highTime) % 256;
}
void Servo_Control(unsigned char angle) //定义控制舵机转动角度的函数
{
PWM_SetDuty(500 + 11 * angle);
Servo_Out = 1;
delay_us(1000);
Servo_Out = 0;
delay_ms(18);
}
void main(void)
{
PWM_Init(); //调用PWM初始化函数
while(1)
{
Servo_Control(0); //让舵机转动到初始位置
delay_ms(1000); //延时1秒
Servo_Control(90); //让舵机转动到中间位置
delay_ms(1000); //延时1秒
Servo_Control(180); //让舵机转动到结束位置
delay_ms(1000); //延时1秒
}
}
在此代码中,使用定时器0的模式1来形成PWM波,通过改变PWM波的脉宽占空比来控制舵机的转动角度。其中,计算脉宽占空比的公式为:PWMDuty = Duty / 256.0 * 5000 / 20,其中Duty为脉宽占空比的值(0~255),5000为定时器的时钟频率,20为PWM的频率。根据舵机的工作原理可知,舵机总共可转动180度,脉宽占空比的值控制舵机转动到的具体角度,脉宽占空比的最小值为500,最大值为2500。
请注意:此代码是供给您参考的样例代码,如果您的51单片机的型号不同,具体实现可能会有所不同。
阅读全文