51单片机SG-90系列舵机的配置原理以及源码
2023-09-11 14:19:59 时间
一、实验原理
1、舵机转动的原理(如下图所示)
1,根据上图我们可以得知,要想控制舵机转动指定的角度,必须要让它在一定的周期(20ms)中,获得一定时间(分别是0.5ms、1ms、1.5ms、2ms、2.5sm)的高电平,具体对应关系,上图中已给出。
1,现在我们要做的就是生成一个周期为20ms的PWM波,通过设定一个比较值(最大为20ms),用来控制我们的高电平时间,进而控制舵机转动指定角度。
2、生成PWM波的原理
(1)用定时来实现,设定一个初始值,使其溢出时间为500us,再设定一个计数值,控制PWM波的周期,该值最大为40(500us*40=20 000us),如此便设定了周期为20ms;计数值会一直和比较值做比较,这样就可以实现高电平时间的控制。
(2)通过上述三个值的调节,就可以实现舵机不同角度的转动。
二、关键代码
主函数:(注释紊乱是编码的问题,复制到Keil5里选择ANSI编码就没问题了)
/*
Ä£Äâ¶æ»ú¿ØÖÆÔÀí£º0~180¡ã
0.5ms-----0¶È
1.0ms-----45¶È
1.5ms-----90¶È
2.0ms-----135¶È
2.5ms-----180¶È
*/
#include <REGX52.H>
#include "timer0.h"
#include "delay.h"
sbit SG_PWM=P2^0; //ÐźſØÖÆÒý½Å ºì¡ª¡ªVCC ×Ø¡ª¡ªGND »Æ¡ª¡ªÐźÅÏß
unsigned char count=0; //¼Æ´Î ¸³³õֵΪ0
unsigned char PWM_count=0; //0--0¶È£¬2--45¶È£¬4--90¶È£¬6--135¶È£¬8--180¶È
void main()
{
Timer0_Init();
while(1)
{
PWM_count=1; //¶æ»úת¶¯0¶È(0.5ms)
Delay(1000);
PWM_count=2; //¶æ»úת¶¯45¶È(1ms)
Delay(1000);
PWM_count=3; //¶æ»úת¶¯90¶È(1.5ms)
Delay(1000);
PWM_count=4; //¶æ»úת¶¯135¶È(2ms)
Delay(1000);
PWM_count=5; //¶æ»úת¶¯180¶È(2.5ms)
Delay(1000);
}
}
void Timer0() interrupt 1 //Ìرð×¢Òâ´Ë´¦£¬0--ÍⲿÖжÏ0£¬1--¶¨Ê±Æ÷ÖжÏ0£¬2--ÍⲿÖжÏ1£¬3--¶¨Ê±Æ÷ÖжÏ1£¬4--´®ÐпÚÖжÏ1
{
TL0 = 0x33;
TH0 = 0xFE; //ÖØи³¼ÆʱÆ÷³õֵΪ0.5ms
count++; //¼Æ´Î£¬Ã¿500us¼ÇÒ»´Î count+1
count%=40; //ÿ¸öÖÜÆÚΪ20ms
if(count<PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
}
定时器0
#include <REGX52.H>
void Timer0_Init()
{
TMOD &= 0xF0; //ÉèÖö¨Ê±Æ÷ģʽ
TMOD |= 0x01; //ÉèÖö¨Ê±Æ÷ģʽ
TL0 = 0x33; //ÉèÖö¨Ê±³õʼֵ
TH0 = 0xFE; //ÉèÖö¨Ê±³õʼֵ
ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0µÄÖжÏ
TF0 = 0; //Çå³ýÒç³öÖжϱê־λ
TR0 = 1; //¶¨Ê±Æ÷0¿ªÊ¼¼Æʱ
EA = 1; //¿ª×ÜÖжÏ
}
延时函数:
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
注:若要实现不同角度的控制,只需要改变 PWM_count的值就好。
相关文章
- lvs中dr模式配置脚本
- 深入理解Spark:核心思想与源码分析. 3.5 Hadoop相关配置及Executor环境变量
- Maven mirrorOf配置
- package.json的所有配置项及其用法,你都熟悉么
- 【Nacos源码之配置管理 七】服务端增删改配置数据之后如何通知集群中的其他机器
- IDEA配置Tomcat源码
- IDEA中配置阅读并编辑jdk8源码的环境
- H3C 在网络中的正确位置配置ACL包过滤
- SwiftUI iOS 组件之延迟出发组件降低服务器必要调用 app网络请求配置(教程含源码)
- freeline源码修改和配置流程
- Fiddler-002-常用配置修改
- Spring5参考指南:基于注解的容器配置
- 【dubbo源码】配置信息解析-注解版
- stm32中I2Cx的简单配置以及源码
- 单片机语音模块JQ8900-16P的几种触发方式与源码配置
- 12. ubuntu16.04配置anaconda+python3+tensorflow+jupyter远程访问
- Shiro(二):Shiro 认证(xml配置方式)
- 配置静态路由
- NGINX 常用配置
- Java开发 - 配置中心初体验
- MongoDB ReplacaSet & Sharding集群安装 配置 和 非集群情况的安装 配置 -摘自网络
- 安装 RabbitMQ C#使用-摘自网络(包括RabbitMQ的配置)
- zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析
- 内网服务暴露到外网,实现内网穿透(外网访问内网服务器),自动化配置和部署方案之frp,附实现源码,相关资源放到 GitHub 上免费下载
- 本地环境 XAMPP+phpStorm+XDebug+chrome配置和断点调试