单片机SG-90系列舵机的配置原理以及源码
一、实验原理
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的值就好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!