51单片机控制sg90舵机

PWM开发SG90

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

占空比: 一个周期内,高电平占据时长的百分比

在这里插入图片描述

如何实现PWM信号输出

  1. 通过芯片内部模块输出,一般观察手册或者芯片IO口都会标明这个是否是PWM口
    如下图增强51,STC15w的CPU
    在这里插入图片描述

  2. 如果没有集成PWM功能,可以通过IO口软件模拟,相对硬件PWM来说精准度略差

什么是舵机
如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有0-90°、0-180°、0-360°
怎么控制舵机

在这里插入图片描述

向黄色信号线“灌入”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

我这款51单片机没有专门的PWM口,就只好用IO口的高低电平转换来模拟控制信号

定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5m cnt++
1s = 10ms * 100
20ms = 0.5ms * 40

代码如下:

#include <reg52.h>
#include <intrins.h>

sbit sg90_con = P1^1;
int count = 0;
int angle ;//定义舵机角度

void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;

_nop_();
i = 15;
j = 2;
k = 235;
do
{
	do
	{
		while (--k);
	} while (--j);
} while (--i);

}

void Time0Init()
{
//1. 配置定时器0工作模式位16位计时
TMOD = 0x01;
//2. 给初值,定一个0.5ms出来
TL0=0x33;
TH0=0xFE;
//3. 开始计时
TR0 = 1;
TF0 = 0;
//打开定时器0的中断
ET0 = 1;
//打开中断总开关
EA = 1;
}

void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;

_nop_();
i = 3;
j = 26;
k = 223;
do
{
	do
	{
		while (--k);
	} while (--j);
} while (--i);

}

void main()
{

Delay300ms();//让硬件稳定一下
Time0Init();//初始化定时器
angle = 1;//初始化角度为0度,0.5ms的高电平
count = 0;//初始化周期
sg90_con = 1;//一上电就给sg90舵机一个高电平

//每隔两秒切换一次角度
while(1){
	angle = 3;//90度,1.5ms的高电平
	count = 0;//切换角度后,重置周期,使其同步
	Delay2000ms();
	
	angle = 1;//0度,0.5ms的高电平
	count = 0;切换角度后,重置周期,使其同步
	Delay2000ms();
}

}

void Time0Handler() interrupt 1
{

count++;//统计爆表的次数
TL0 = 0x33;//重新给初值,使其重新计算0.5ms
TH0 = 0xFE;

//控制PWM波形
if(count < angle){
	sg90_con = 1;

}else{
	sg90_con = 0;
}
			
if(count == 40){//爆表了,给变量加1,加个40次就是20ms
		count = 0;//当count为40时,表示20ms,此时让count=0,重新计算下一次的20ms,20ms为舵机一个周期
		sg90_con = 1;
		
}

}

结果图:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值