51单片机基础7——控制sg90(180°)舵机实验

51单片机控制sg90(180)舵机

1. 软硬件条件

  • 单片机型号:STC89C52RC
  • 开发环境:KEIL4
  • 烧录软件:stc-isp
  • sg90舵机

2. 舵机控制原理

舵机控制主要是通过PWM 方式控制,即调节高电平所持续的时间。

2.1 PWM

PWM (Pulse Width Modulation),即脉冲宽度调制。通过对脉冲宽度进行调制,等效出需要的波形,对模拟信号电平进行数字编码,通过调节高电平的占空比来调节信号、能量等变化。

2.2 占空比

占空比:即一个周期内高电平所占据的时间占整个周期的百分比。
占空比 = t 高电平持续时间 T 周期 占空比=\frac{t_{高电平持续时间}}{T_{周期}} 占空比=T周期t高电平持续时间
在这里插入图片描述
如上图所示,一个周期4ms 但是高电平持续时间为1ms,故可得占空比为25%。

2.3 实现 PWM 控制方式

实现 PWM 方式可以有硬件电路支持 PWM 控制,但是该单片机没有。所以。使用 io 口模拟 PWM。但是使用 io 口模拟误差会比较大。

2.4 舵机

由PWM 信号控制,一般用于智能小车全比例转向,摄像机云台,机械臂等。常见sg90 常见有90°、180°和360°。控制sg90舵机的PWM信号不能太频繁,一般为50Hz,也就是一个周期为20ms。


T 脉冲周期 = 1 f 信号频率 = 1 50 s = 0.02 s = 20 m s T_{脉冲周期}=\frac{1}{f_{信号频率}}=\frac{1}{50}s=0.02s=20ms T脉冲周期=f信号频率1=501s=0.02s=20ms
​ ​ 具体控制如下表:

高电平持续时间(ms)角度(°)占空比(%)
0.502.5
1455
1.5907.5
2.013510
2.518012.5

可以设定定时器中断,每0.5ms进行一次中断,修改当前io口电平。

所以需要设定定时器TLx,THx 为:
t 溢出初值 ∗ 1.085 u s = 500 u s t 溢出初值 = 65075 = 0 x F E 33 t_{溢出初值} * 1.085us = 500us \\ t_{溢出初值} = 65075 = 0xFE33\\ t溢出初值1.085us=500ust溢出初值=65075=0xFE33

// 定时器设置 0.5ms
TL0 = 0x33;
TH0 = 0xFE;

3. 单片机控制舵机实现

模块对应引脚
橙色线P1.1
红色线VCC
棕色线GND
3.1 代码实现
#include "reg52.h"

sbit sg90_con = P1^1;
int cnt = 0;
// 枚举类型
typedef enum Angel{angel_0=1,angel_45=2,angel_90=3,angel_135=4,angel_180=5}Angel;
enum Angel angel = angel_0;

void Timer0Init(){
	TMOD &= 0xF0;
	TMOD |= 0x01;
	TH0= 0xFE;
	TL0= 0x33;
	ET0 = 1;
	EA = 1;
	TF0 = 0;
	TR0 = 1;
}

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

void Timer0Handler() interrupt 1{

	TH0 = 0xFE;
	TL0 = 0x33;
	cnt++;
	if(cnt == angel){
		sg90_con = 0;
	}
	if(cnt == 40){
		cnt = 0;
		sg90_con = 1;
	}
}

void init(){
	Delay2000ms();
	Timer0Init();
	sg90_con = 1;
}

void main(){
	init();
	while(1){
		Delay2000ms();
		angel = angel_0;
		cnt = 0;
		sg90_con = 1;
		Delay2000ms();
		angel = angel_90;
		cnt =  0;
		sg90_con = 1;
		Delay2000ms();
		angel = angel_180;
		cnt = 0;
		sg90_con = 1;
		Delay2000ms();
		angel = angel_90;
		cnt = 0;
		sg90_con = 1;
}
}
  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值