51单片机PWM控制舵机
接线
注意,图中SG90只是一种型号,还有其他型号,且对应不同的角度,接线和控制方法一致

PWM
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.
- 脉冲宽度调制
- 通过占空比编码模拟信号
- 占空比 一个周期内,高电平占据时长的百分比

舵机工作原理

向黄色信号线“灌入”PWM信号。
PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右
数据:
0.5ms-------------0度; 2.5% 对应函数中占空比为250
1.0ms------------45度; 5.0% 对应函数中占空比为500
1.5ms------------90度; 7.5% 对应函数中占空比为750
2.0ms-----------135度; 10.0% 对应函数中占空比为1000
2.5ms-----------180度; 12.5% 对应函数中占空比为1250
代码实现
#include <reg51.h>
sbit servo = P1^1; //舵机信号线
unsigned int count_servo; //舵机0.5ms计数
unsigned int max_angle; //最大角度
void delay(unsigned int ms)//@11.0592MHZ
{
unsigned int i;
unsigned int j;
for(i=0;i<ms;i++)
for(j=0;j<128;j++);
}
void init_time0()
{
TMOD |= 0x01; //使用模式1,16位定时器
TH0 = 0xFE; //给定初值,使定时器0.5ms中断一次
TL0 = 0x33;
EA = 1; //总中断开启
ET0 = 1; //定时器0中断开启
TR0 = 1; //定时器开关打开
servo = 0;
count_servo = 0;
}
void time0() interrupt 1{
TR0 = 0; //定时器关闭
TH0 = 0xFE; //重新给定初值,使定时器0.5ms中断一次
TL0 = 0x33;
if(count_servo < max_angle){ //通过max_angle控制角度
servo = 1;
}else{
servo = 0;
}
count_servo++;
if(count_servo >= 10) count_servo = 0;
TR0 = 1; //定时器打开
}
void angle_operate(int angle) //输入角度,转变成对应最大角度
{
TR0 = 0;
count_servo = 0;
switch(angle){
case 0:
max_angle = 3;
break;
case 45:
max_angle = 4;
break;
case -45:
max_angle = 2;
break;
case 90:
max_angle = 5;
break;
case -90:
max_angle = 1;
break;
default:max_angle = 3;
}
TR0 = 1;
}
void main()
{
init_time0();
while(1){
angle_operate(-90);
delay(1000); //1s
angle_operate(-45);
delay(1000); //1s
angle_operate(0);
delay(1000); //1s
angle_operate(45);
delay(1000); //1s
angle_operate(90);
delay(1000); //1s
}
}
结束
如果对你有帮助,点赞支持一下吧
转载联系作者。