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

	}
}

结束

如果对你有帮助,点赞支持一下吧
转载联系作者。