[C51]sg90舵机控制

1. 什么是舵机
如下图所示,最便宜的舵机 sg90 ,常用三根或者四根接线,黄色为 PWM 信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有 0-90° 0-180° 0-360°
[C51]sg90舵机控制_第1张图片
2. 怎么控制舵机
向黄色信号线 灌入 ”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
定时器需要定时 20ms, 关心的单位 0.5ms, 40 个的 0.5ms, 初值 0.5m cnt++
1s = 10ms * 100
20ms = 0.5ms * 40

 

#include "reg52.h"

sbit sg90 = P1^1;


int angle;
int cnt = 0;

void Delay2000ms() //@11.0592MHz
{
	unsigned char i, j, k;
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Time0Init()
{
	//1.配置定时器0工作模式是16位计时
	TMOD = 0x01;
	//2.给初值,定时10ms
	TH0 = 0xFE;
	TL0 = 0x33;
	//3.开始计时
	TR0 = 1;
	//4.清空溢出标志位
	TF0 = 0;
	//5.打开计时器0中断
	ET0 = 1;
	//6.打开总中断
	EA = 1;
}

void main()
{
	Delay300ms();//让硬件稳定
	Time0Init();//初始化定时器
	angle = 1;  //d初始角度是0°,定时器溢出一次就是0.5
	cnt = 0;
	sg90 = 1;   //一开始从高电平开始
	while(1)
	{
		angle = 3; // 90°
		cnt = 0;
		Delay2000ms();
		angle = 1; //0°
		cnt = 0;
		Delay2000ms();
	}
}       



void Time0handle() interrupt 1
{
	//来计算1s的时间
	cnt++;
	//重新给给初值
	TH0 = 0xFE;
	TL0 = 0x33;
	//控制pwm波
	if(cnt < angle)
	{
		sg90 = 1;
	}
	else
	{	
		sg90 = 0;
	}
	//爆表40次,就是20ms
	if(cnt == 40)
	{
		cnt = 0;
		sg90 = 1;
	}
}

你可能感兴趣的:(C51,单片机)