51单片机控制SG90舵机详解:从硬件连接到代码实现
创作时间:
作者:
@小白创作中心
51单片机控制SG90舵机详解:从硬件连接到代码实现
引用
CSDN
1.
https://m.blog.csdn.net/2402_83339265/article/details/138576985
舵机(SG90)
一.实物图及接线:
实物图:
自带三根线(黄,红,褐)色。与51单片机接线图:
Vcc(红色) ------> 单片机的5V
GND(褐色) ------> 单片机的GND
信号线(黄色) ------> 这里接P21(只要不冲突,这根随机)
二.定义和原理:
- 参数及定义:
- 舵机是一种伺服驱动器,适用于角度不断变化并可以保持的控制系统。
- 这款舵机是模拟舵机,理解为需要不断发送PWM信号控制舵机角度,例如1ms的高电平给到信号接口,他就会传输1ms的PWM信号,舵机就会转到1msPWM信号对应的45度角。
- 使用的是4.8V-6V的电压,正常接单片机的5V就行,有时候舵机出现卡顿或不转,有可能是电压不够,注意这点。精度可以控制在0.2cm。
- 原理:
占空比:就是一个周期内,高电平所占比例,舵机角度转动多少就是要看高电平占多少,理解这个很重要。
- 舵机工作的一个周期20ms,这个固定。通过给信号口输入控制信号(0.5ms-2.5ms)多少决定舵机转动的角度。
- 控制信号对应角度:(忽略上图角度)
0.5ms -----> 0度
1.0ms -----> 45度
1.5ms -----> 90度
2.0ms -----> 135度
2.5ms -----> 180度 - 这里需要用到定时器来控制舵机的一个周期及控制 控制信号的时间。
三.代码思路:
- 定时器的初始化:(以定时器0举例)
- 选择定时器0的定时模式且方式1;
- 设置初值TH0和TL0,正常情况下定时0.5ms溢出,因为刚好是角度控制信号的倍数,方便理解,也可以是0.1ms溢出,这里用0.5ms举例。
- 打开定时器启动位TR0;
- 打开总中断EA;
- 打开定时器0中断ET0;
void Time0_Init()
{
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
EA=1;
ET0=1;
}
- 定时器中断函数:
- 定义一个变量,用来统计中断次数(定时器溢出申请中断次数),让它递增,直到递增到能够让舵机完成一个周期20ms,也就是40次(0.5ms*40=20ms),才让它归0,反复形成20ms的周期。
- 不能忘了重新给TH0和TL0重新赋予初值。
- 定义一个全局变量,用来控制舵机要转的角度,让它与中断次数变量对比,例如,if(中断次数<舵机角度变量){给PWM信号};理解为:一个中断次数时间0.5ms,当舵机角度变量为3时,说明将产生3个PWM信号,这个PWM信号的产生由给P21高电平产生。如果中断次数>舵机角度变量就不给PWM信号,即else{不给PWM信号}
结合下图理解:
void Time0() interrupt 1
{
count++; //定义一个变量统计中断次数
TH0=(65536-500)/256;
TL0=(65536-500)%256;
if(count==40) //一个20ms的周期
{
count=0;
}
if(count<number) //通过给number赋值决定舵机转动角度
{
SG90=1; //给P21口高电平表示传输PWM信号
}
else
{
SG90=0;
}
}
- 主函数:
- 调用定时器初始化函数。
- 可以调整舵机初始角度。
- while循环里给舵机角度变量赋值,若要让舵机在两个角度之间跳变,则用延时控制速度。还可以用按键控制想要的角度。
void main()
{
Time0_Init();
SG90=1;
while(1)
{
number=1;
count=0; //在舵机转动后清空中断次数,为下一个角度做准备
Delay1ms(1000);
number=3;
count=0;
Delay1ms(1000);
}
}
四.总代码:
现象1:从0度—>135度来回转动
#include <REGX52.H>
#include "Delay1ms.h"
sbit SG90=P2^1;
void Time0_Init();
unsigned char count=0;
unsigned char number=0;
void main()
{
Time0_Init();
SG90=1;
while(1)
{
number=1;
count=0;
Delay1ms(1000);
number=3;
count=0;
Delay1ms(1000);
}
}
void Time0_Init()
{
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
EA=1;
ET0=1;
}
void Time0() interrupt 1
{
count++;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
if(count==40)
{
count=0;
}
if(count<number)
{
SG90=1;
}
else
{
SG90=0;
}
}
现象2.独立按键控制0度—>90度转动
#include <REGX52.H>
#include "Delay1ms.h"
sbit SG90=P2^1;
void Time0_Init();
unsigned char count=0;
unsigned char number;
void main()
{
Time0_Init();
SG90=1;
while(1)
{
if(P3_1==0)
{
number=1;
count=0;
}
if(P3_0==0)
{
number=3;
count=0;
}
}
}
void Time0_Init()
{
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
EA=1;
ET0=1;
}
void Time0() interrupt 1
{
count++;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
if(count==40)
{
count=0;
}
if(count<number)
{
SG90=1;
}
else
{
SG90=0;
}
}
五.效果展示:
现象1:
舵机循环旋转现象2:
按键控制舵机转动角度
热门推荐
C语言如何表示字符%
糖友饮食,也可兼顾美味与健康
百草益寿:藏在你身边的“天然他汀”食物,攻克血管斑块各显神通
如何慎重考虑保险退保问题?这种退保决定有哪些影响?
羽毛球的毛是什么动物毛?羽毛球重量和速度的选择
透过《三体》,读懂科幻中的战略思维
中国古代历史上的十大罪人,个个祸国殃民,他们都是谁?
大范围春雨开启大回暖,冷暖对撞或引发陆地风暴,专家:狂风雷暴
40岁+女性注意,这些表现可能是进入更年期的信号
交通事故产生的拖车费怎么承担
VR在心理治疗中的创新应用:治疗焦虑与PTSD
经典粤菜与葡萄酒如何完美搭配?
夫复何求什么意思
C语言中判断质数的几种方法
菠萝和凤梨,究竟是不是同一种水果?产地人给你细致的答案
TCL电视没有声音怎么办?静音问题全面解析
氖气行业分析
工伤骨折如何伤残鉴定?一文详解申请流程与评级标准
骨折后遗症的表现
面粉的种类及挑选方法
老人保险怎么缴费?哪种保险最划算?
JINR科学家首次揭示钚-227同位素的放射性衰变特性
计算机硬件风扇和散热器维护指南
膝关节疼怎么办?专业医生的7个缓解方法
如何生成测试题目的软件
一案医说|夜夜盗汗湿床单?辨清3种“汗人”体质,对症止汗
九天是怎么回事 九天分野是怎么划分地上疆土的
《星露谷物语》钓鱼赚钱攻略:从入门到精通
血压低能献血吗?专家解读低血压患者献血风险
七巧板的拼法 开发智力好帮手!