单片机——SG90舵机工作原理
前言:
舵机控制的另一个专业名字叫伺服控制。
经过百度,伺服”—词源于希腊语“奴隶”的意思。人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。在讯号来到之前,转子静止不动;讯号来到之后,转子立即转动;当讯号消失,转子能即时自行停转。由于它的“伺服”性能,因此而得名——伺服系统。
我们这次就是要控制舵机转动任意角度。
目录
- 舵机
- 一、外观
- 二、相关参数
- 三、工作原理
- 四、舵机购买注意事项
- 五、代码编写
- 六、优化后的代码
舵机
一、外观
接线方法:
红-------------------------VCC
棕色----------------------GND
橙色----------------------信号线
二、相关参数
三、工作原理
舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0—180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。
控制电路板接受来自信号线相应的PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。
舵机的控制需要MCU产生一个周期为20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机转动的角度。
四、舵机购买注意事项
1、在购买时,需要分清楚你的舵机可以转180度,还是360度。相关区别购买时可以了解。
2、舵机又分为数字舵机和模拟舵机。
模拟舵机:需要不断的发送相应角度的PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要在一个时间内不断的发送90度的PWM信号,舵机转动到指定位置就会停止。
数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。
SG90舵机 是模拟舵机,SG90S舵机 我记得好像是数字舵机,总之数字舵机比模拟舵机好些,无论实在程序控制方面还是在运行情况方面都要好些
五、代码编写
舵机要用PWM来控制,PWM的产生可以用软件延时和定时器的方法。这里为了体现精确性,采用定时器的方式。
首先还是看下这张图片,这个是PWM控制SG90舵机的关键。我们只有按照给舵机输入正确的PWM波形,舵机才会转动到指定的角度。
上代码:
1、PWM波形的周期我们用定时器产生,所以先对定时器做初始化:
void Timer_Init()
{TMOD=0X01; //T0定时方式1TH0=0Xfe;TL0=0X33; //计数初值设置为0.5msET0=1; //打开定时器0的中断TR0=1; //打开定时器0EA=1; //开总中断
}
2、然后就是编写定时器中断函数,和输出对应的PWM波形了:
PWM波形这里是在定时器里产生的。
sbit PWM=P2^3; //对应舵机的PWM引脚
int count=0; //全局变量count用于定时器计数
int c=0; //这个值为高低电平的临界值,可以改变,//这里初始化为0表示开始让舵机复位到0度位置(输出0.5ms的高电平)void Timer() interrupt 1
{TH0=0Xfe;TL0=0X33; //重新赋计数初值为0.5msif(count<=c) //进入定时器的时间和高低电平临界值比较{PWM=1; //输出PWM波形中的高电平}else{PWM=0;}count++;if(count>=40) //计数40次,每次0.5ms,总共达到20ms周期后清零,为下一周期开始计数做准备{count=0;}
}
3、主函数代码的书写:
void main()
{Timer_Init();
while(1);
}
嗯嗯,上面就是代码全部了,没有给出整体代码,防止只复制粘贴,不动脑瓜子的童鞋
1、那。。。,博主博主,我把上面的代码组装到工程里去了,烧写到单片机中去,开机舵机没反应呀?
答:看看舵机原本是不是在0度的位置,如果是,请手动把他转到其它角度,在上电,看舵机转到0度了没有。
2、那。。。,博主博主,我想让舵机上电就复位到90度的位置,咋办?
答:认真看下代码里语句的注释,我们将程序中的高低电平临界值变量c,赋值为2,即c=2;上电后,舵机如果不在90度的位置,就会复位到90度了。
3、那。。。,博主博主,我想定义两个按键,按下一个按键舵机转到0度位置,按下另一个按键,舵机转到180位置,咋办?
答:先用sbit定义两个按键引脚,然后在主函数中的while循环里,判断哪个按键按下,然后改变临界值C就行。如下
while(1)
{if(key1==0){delay_ms(5);if(key1==0){c=0; //对应高电平输出0.5ms,转到0度while(!key1);}}else if(key2==0){delay_ms(5);if(key2==0){c=4; //对应高电平输出2.5ms,转到180度while(!key2);}}
}
六、优化后的代码
嗯。。。,咋子优化哦,上面不就可以让舵机抓到指定位置了吗?
SG90是模拟舵机,需要在一个时间内不断的输出一定的PWM波形给舵机,它才会转到到指定位置,上面的代码中我是让定时器不断的工作,不断的输出PWM波形。
其实对于模拟舵机,不需要一直让定时器工作输出PWM波形,只用在一段时间内输出一定的PWM波形就可以。那为什么这样考虑呢?因为给一段时间的PWM波形后,舵机就可以转动到位了,后面再给PWM波形就没有意义了,舵机转动到位后,就可以关闭定时器了(除非你的其它功能要用到定时器,就可以不用关),这样可以避免后面不断的触发定时中断,影响主函数while里其它功能的执行效率,毕竟进入定时中断函数里时,主函数时不得执行的。
上面讲到的那个时间,可以通过实际调试多次测出来,博主这里测出来了。
**完整并优化的项目代码放到最后:
【51单片机控制SG90舵机】
**
单片机——SG90舵机工作原理相关推荐
- sg90舵机工作原理_舵机跑舵?锲而不舍终除隐患!
因为专注才更专业,快快关注吧! 欢迎投稿:sea@shipmg.com 正文开始 一.前言某司二条姐妹船采用 SSP5 型 360º全回转电力推进器,左右两台中压永磁电机推进船舶行驶,另外两面分别由两 ...
- sg90舵机工作原理_快来听郑老轨分享船舶舵机液压锁报警测试经验!
点击☝上方"泛海国际船管"轻松关注哦! [编者按:以下工作经验分享为敝司外派轮机长郑永忠,根据在船工作经验,结合大家日常中,比较容易忽略的地方,整理出来的文章,经其本人同意后,刊发 ...
- 51单片机sg90舵机
51单片机按键控制舵机旋转 一.舵机工作原理 1.这里介绍的sg90的可旋转角度为 0~180° 2.sg90有三条线,橙色(PWM)红色(5V)棕色(GND) 3.PMW的范围为0.5ms2.5ms ...
- 单片机搭建环境烧录方法_单片机仿真器的工作原理解析
仿真器出现的原因 1.早期的单片机内部没有ROM,比如8031.8032,这种单片机只能外部扩展紫外擦除的EPROM存储器,就是芯片上带窗口的ROM.紫外擦除的ROM需要用紫外灯照射较长时间(10分钟 ...
- 单片机看门狗工作原理
刚学习单片机的萌新都听说过单片机看门狗,但是对于其工作原理并不是很清楚,今天这篇文章将为大家介绍单片机看门狗工作原理,一起来了解一下吧! 一.单片机看门狗是什么 在由单片机组成的微型计算机系统中,单片 ...
- adc0832工作原理详解_单片机ADC的工作原理
单片机的ADC可以将模拟量转化为数字量 不同品牌的单片机ADC的配置方法有一定的差异,但基本方法和原理是一样的,启动ADC转换后,可以等待转换完成然后读取数据,或者设置为转换完成产生中断然后读取数据. ...
- MG995舵机工作原理及基于STM32的驱动源代码
MG995舵机工作原理及基于STM32的驱动源代码 一·MG995舵机工作原理 1.MG995舵机简介 产品型号 MG995 产品尺寸 40.7*19.7*42.9mm 产品重量 55g 工作扭矩 1 ...
- SG90舵机的原理和控制方式
前言 做过机器人.智能车或者玩航模的朋友应该对舵机不会陌生,这种舵机也是很常用的. 舵机只是我们通俗的叫法,它的本质是一个伺服电机,也可以叫做位置(角度)伺服驱动器.一般被应用在那些需要控制角度变化的 ...
- 【MCU】单片机看门狗工作原理
背景 在单片机运行中,可能会遇到电磁场等恶劣环境干扰失控,造成程序进入死循环,程序跑飞(死机)等意外故障,程序的正常运行被打断,系统无法继续运行,陷入停滞状态,发生不可预料的后果.此时可通过按下复位按 ...
- 一文读懂舵机工作原理并运用(附代码)
杂谈 自己拿到这一模块是也挺迷茫的,后来看了一些资料,也渐渐积累了些自己的理解,很多博文并没有将舵机讲明白,至少你待把PWM与角度如何换算讲清楚吧,所以笔者写这篇博文供大家学习掌握. 如果你拿到一个舵 ...
最新文章
- ECMAScript5 ES5
- Apache shiro介绍
- hadoop中如何控制map的数量
- sqlserver操作geography方法
- 【pl/sql番外篇】 存储过程 游标
- C语言形参和实参的区别
- commonJS — 数字操作(for Number)
- php 发送图片,利用PHP输入流发送图片
- 提交json数据给Java_java 实现通过 post 方式提交json参数操作
- toad库进行分箱操作
- 如何将音频从视频分离到单独的音轨?
- PSC-Net: Learning Part Spatial Co-occurrence for Occluded Pedestrian Detection 用于遮挡行人检测的部分空间共现网络 翻译
- win7配置TomCat环境
- 使用MODBUS转PROFINET智能网关实现与多个温控器数据读写
- 在线下单系统think php,昱杰订单管理系统(ThinkPHP版) v19.0
- 【天光学术】音乐教育论文:钢琴演奏触键在不同音乐时期的特征分析(节选)
- 房贷利息怎么算, 千万别被砖家叫兽误导
- 小程序behaviors使用笔记
- WPF的自动折行面板
- java实况足球2014_最新实况足球中文榜单下载_九游
热门文章
- 微信小程序的页面布局(1)
- 如何把多个PDF页面合并成一页PDF - PDF页面合并器使用方法
- R语言数据分析及可视化实战
- linux检查系统内存,Linux查看内存使用情况方法
- Java 获取Excel中的表单控件
- 凭什么?80后合伙人“叫板Excel”
- C++:单例模式——线程安全模式、饥汉模式、懒汉模式
- 计算流体力学编程作业matlab,中科大计算流体力学CFD之大作业二.doc
- 解析:WMS仓库管理系统是什么,可以提供什么协助
- 【程序35】 ArrayChange.java 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。