找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 139095|回复: 240
打印 上一主题 下一主题
收起左侧

浅谈用单片机控制SG90舵机(原理+编程)

  [复制链接]
跳转到指定楼层
#
ID:194729 发表于 2019-4-16 11:51 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
此篇文章免费分享给大家,这篇文章结合笔者所学以及在往上参考大神的讲解,通过自己的理解整理成文档,在此免费分享给大家,由于笔者是一名在读学生,文中难免有不当之处,如有错误,望大家指正!!!我会把源文档和源程序放在附件中,有黑币的直接下载,没有的留下邮箱,看见回

SG90舵机(模拟舵机)
一、日常吐槽~~~~~~,在开始今天的主题之前,占用大家一些时间。容我骂街一番,$##%%%$%#$#$$%^艹……………….,哎呀妈呀,骂的有点喘不过来了,额~呸,是(文明人,文明人)
可能就奇了怪了,你不好好码字,骂什么街呢!说来惭愧,上边被骂的人就是笔者自己。今天在调试程序的时候,对,就这个鬼舵机,怎么都不转!!!检查硬件---检查程序---百度,如此反复N小时。始终找不到问题所在,程序呢,怎么看,怎么硬件呢,怎么看,怎么!说是急,那是快,电闪雷鸣,刀光剑影,啪,一个数字1摔在脸上,于是乎,快速打开课本,啪~啪~啪,数字0、1,大脑瓜子一拍,哎呀,一定是这错误了!快速拿起闪闪发光的鼠标,熟练的打开Keil4,一段操作猛如虎,只听见那~~~吱,舵机工作了~~~~
粗心大意定时器0对应的中端口----void Timer() interrupt 1
马虎大意的我写成了这样:void Timer() interrupt 0.
家都走错了,人家咋可能给你钱,大家一定要引以为戒,细心细心再细心
中断号
中断源
0
外部中断0
1
定时器中断0
2
外部中断1
3
定时器中断1
4
串行口中断1
注意C语言用关键字“interrupt+数字”来代替汇编中中断入口地址
——————————————————————————————————
以上非本次笔记重点,只是笔者一点小小的吐槽,外加一点小小的知识
——————————————————————————————————
二、主咖登场基本概念:1.舵机:舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其实质是一个伺服马达

2.模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。

3.数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。

4.PWM信号:PWM(脉冲宽度调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。那么什么叫PWM信号呢,笔者就简单的谈一下自己的看法,我们都知道,我们所使用的单片机都是数字电路,它的I/O口只有两种状态,那就是高电平1,低电平0知道了这些之后,我们通过控制微处理器输出1-0-1-0-1-0-1-0……如此循环往复,就成为下图1所示的情况,这就是PWM信号。

1.PWM信号
5.占空比高电平(或者低电平)占整个周期的时间就叫作占空比。

6.PWM频率PWM频率是指每秒钟信号从高电平到低电平再到高电平的次数。
工作原理  理解以上的概念,对我们接下来的学习是非常有必要的,希望大家能好好掌握上面的概念。
我所使用的SG90舵机,如下图2所示

2
接线方法
          红-------------------------VCC
          棕色----------------------GND
          橙色----------------------信号线

原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

重点:作为一个单片机编写者,具体的原理,我们不必要搞清楚,我们只需知道如何控制它即可,以下将讲解如何控制舵机运转。

第一步:我们需要使用单片机产生周期为20ms,高电平t等于0.5ms-2.5ms之间的这样一个方波。定时器+中断产生这样的方波。
高电平在一个周期20ms的持续时间对应的舵机角度,如下图所示。
高电平t占整个周期T(20ms)的时间
舵机旋转的角度
0.5ms
0度
1ms
45度
1.5ms
90度
2ms
135度
2.5ms
180度
第二步:简单讲一下编程思想吧,我所使用的是方法是定时器+中断,定时器每0.5ms中断一次,需要中断40次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到40次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下(1--0度,2--45度,3--90度,4--135度,5--180度)。
第三步:着重讲程序中一个语句的含义

为什么此处要此处a==16,a==32,首先,这个值是我一步步测试出来的,如果你看见源程序的话,上面有详细的介绍,此处不再赘述。
我们知道SG90是一个模拟舵机,需要不断的给出信号才能到达指定的位置。到达这个位置并不是一蹴而就的,它需要时间,实际上面的a==16,相当于延时,这段时间刚好能够让舵机达到指定的位置,然后在接收下一个回摆程序。a==32,是因为我需要让它来回摆动的时间对称,所以才用a==32的。有兴趣的可以改变a的值,观察一下具体的情况。
程序此处都不贴出来,时间紧迫,我会放在附件中,有黑币的直接下载,没有的,留下邮箱

单片机源程序如下:
  1. #include<reg52.h>
  2. sbit SG_PWM=P0^0;
  3. unsigned char count=0;
  4. unsigned char PWM_count=3;                  //1--0度,2--45度,3--90度,4--135度,5--180度
  5. unsigned char a=0;
  6. void Timer_Init()
  7. {
  8.   TMOD=0X01;      //T0定时方式1
  9.   TH0=0Xfe;
  10.   TL0=0X33;       //计数初值设置为0.5ms
  11.   ET0=1;          //打开定时器0的中断
  12.   TR0=1;          //打开定时器0
  13.   EA=1;           //开总中断
  14. }
  15. void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
  16. {
  17.   TR0=0;
  18.   TH0=0Xfe;
  19.   TL0=0X33;       //重新赋计数初值为0.5ms
  20.   if(count<=PWM_count)
  21.   {
  22.     SG_PWM=1;
  23.   }
  24.   else
  25.   {
  26.     SG_PWM=0;
  27.   }
  28.   count++;
  29.   if(count>=40)
  30.   {
  31.     count=0;
  32.     a++;
  33.   }
  34.   TR0=1;
  35. }
  36. void main()
  37. {
  38.   Timer_Init();
  39.   while(1)
  40.   {
  41.       if(a==16)                             //20是比较舒服的连贯动作,20以上动作些许不连贯  10的时候出现打架情况,15的时候打架几乎没有,16比较完美
  42.       {
  43.         PWM_count=1;
  44.       }
  45.       if(a==32)
  46.       {
  47.               PWM_count=3;
  48.         a=0;
  49.       }
  50.   }
  51. }
复制代码


全部资料51hei下载地址:
SG90舵机--自动控制.7z (8.99 KB, 下载次数: 1154)
SG90舵机--按键控制.7z (9.62 KB, 下载次数: 928)
浅谈SG90舵机.docx (139.68 KB, 下载次数: 464)


评分

参与人数 2黑币 +112 收起 理由
wxxl + 12 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏75 分享淘帖 顶17 踩
回复

使用道具 举报

来自 240#
ID:544869 发表于 2019-5-24 18:36 来自触屏版 | 只看该作者
我只是过于低调 发表于 2019-5-24 09:30
看看定时器是否配置正确,示波器也就做实验用过,我也不太懂!你们条件真好

我的示波器是玩具型的,80元左右(附图),看I/O简单的信号方便,缺点是会卡。P0^0取反有信号,只是t是低电平,T—t是高电平,舵机不认识,所以不动,和舵机反向器不一样(附舵机反向器图,和一角硬币差不多大)。现在最希望舵机摆动能受控,想做个遥控的划艇或是龙舟玩,遥控接收机输出的信号和舵机一样的,是t=1~2ms, T=20ms

IMG_20190524_152615.jpg (1.14 MB, 下载次数: 1250)

IMG_20190524_152615.jpg

IMG_20190524_152729.jpg (1.57 MB, 下载次数: 1216)

IMG_20190524_152729.jpg
回复

使用道具 举报

来自 239#
ID:544869 发表于 2019-5-25 20:33 来自触屏版 | 只看该作者
我只是过于低调 发表于 2019-5-25 14:33
不得不承认,你比我玩的好,我还是小菜鸡一个呢

您太过谦啦!如果有笨笨比赛的话,我保证能拿金牌,比如高考英文最高一次是11分,所以学编程很难,学了十多年,一月前才入门,现在对中断和计时程序任然看不懂,比如: if(count<=PWM_count)
  {
    SG_PWM=1;
  }
  else
  {
    SG_PWM=0;
  }
  count++;
  if(count>=40)
  {
    count=0;
    a++;
  }
  TR0=1;
}
这段程序,我只猜到40是20ms,其他的都不知道是啥意思。
另外,倒数第三句a==32;我改成a==a+a;为啥就报错呢?请楼主指点,谢谢!
回复

使用道具 举报

来自 238#
ID:194729 发表于 2019-5-26 11:27 | 只看该作者
小笨鸟O 发表于 2019-5-25 20:33
您太过谦啦!如果有笨笨比赛的话,我保证能拿金牌,比如高考英文最高一次是11分,所以学编程很难,学了十 ...

其实给你些建议吧:
1.英语和编程是两回事,如果真的说他俩有点关系的话,那可能就是芯片手册了吧
2.这个程序比较简单,如果中间好多理解不了的话,建议去看下定时器,好好理解下
3.编程学了10多年?一个月前才入门,这个优点尴尬啊
4.C语言一定要有扎实的基础
回复

使用道具 举报

来自 237#
ID:544869 发表于 2019-5-27 16:30 | 只看该作者
我只是过于低调 发表于 2019-5-26 11:27
其实给你些建议吧:
1.英语和编程是两回事,如果真的说他俩有点关系的话,那可能就是芯片手册了吧
2.这 ...

听您的建议,我把定时器有关的视频教程又看了好几遍,还是许多不懂。
说实话,我的这样智商,学习十几年能入门,会搞LED了,开心了好久呢!哈哈~
请问一下:学好51编程需要看那些书?以前看C语言书 发现和51联系不大。
另外,如果写一个受控的舵机程序,难度大啊?估计是目前这个程序的几倍?谢谢!
我目前是用纯硬件做一套可以遥控的舵机控制系统,非常麻烦,所以想用单片机来弄,
回复

使用道具 举报

236#
ID:838920 发表于 2025-4-19 15:01 | 只看该作者
非常棒的分享,思路独特。加油。
回复

使用道具 举报

235#
ID:1148441 发表于 2025-4-19 08:43 | 只看该作者
求高级工程师大佬发资料&#128516;2131113264@qq.com
回复

使用道具 举报

234#
ID:379844 发表于 2023-5-31 21:38 来自触屏版 | 只看该作者
NewIdeas 发表于 2020-2-7 22:11
还可以有更简单的,直接控制角度,需要的可以私我

有更简单的源码么?
回复

使用道具 举报

233#
ID:1056190 发表于 2022-12-7 02:03 | 只看该作者
你好,请问你是用keil5还是keil4编程的代码呢,可以发一份吗?
回复

使用道具 举报

232#
ID:507540 发表于 2022-5-9 16:19 | 只看该作者
非常给力的程序
回复

使用道具 举报

231#
ID:893692 发表于 2021-8-12 16:53 | 只看该作者
我只是过于低调 发表于 2019-4-29 09:23
高电平t占有周期的时间改为2.5ms,理论上可以转到180°,但是不知道什么原因,我得舵机不能完全转到180° ...

我想问问怎么反转?
回复

使用道具 举报

230#
ID:551638 发表于 2021-7-14 14:31 | 只看该作者
楼主厉害啊楼主六六六
回复

使用道具 举报

229#
ID:197229 发表于 2021-6-9 01:53 | 只看该作者
真是好资料 非常感谢楼主的 分享。O(∩_∩)O谢谢
回复

使用道具 举报

228#
ID:931554 发表于 2021-6-8 12:43 | 只看该作者
楼主给力,非常好的帖子。学习了。。。。。。。。。。。。。。。。。
回复

使用道具 举报

227#
ID:584226 发表于 2021-6-6 13:36 | 只看该作者
楼主的晶振频率是多少的?
回复

使用道具 举报

226#
ID:924045 发表于 2021-6-5 11:44 | 只看该作者
很有帮助,赞
回复

使用道具 举报

225#
ID:929129 发表于 2021-5-29 16:19 | 只看该作者
小笨鸟O 发表于 2019-5-24 18:36
我的示波器是玩具型的,80元左右(附图),看I/O简单的信号方便,缺点是会卡。P0^0取反有信号,只是t是低电 ...

能给我发一下吗,顺便问一下能不能设置舵机正转90度和反转90度
回复

使用道具 举报

224#
ID:893542 发表于 2021-5-8 14:59 | 只看该作者
你好,我想问一下,为什么1是0度,2是45度,3是90度?你设定的pwm_count是3,也就是说转动90度,但是中断处理程序里面,count<=3,这个不是应该会输出4次0.5ms的高电平吗,那2ms对应的占空比不应该就是135度,而不是90度吗?
回复

使用道具 举报

223#
ID:91521 发表于 2021-4-21 20:50 | 只看该作者
我只是过于低调 发表于 2019-5-26 11:27
其实给你些建议吧:
1.英语和编程是两回事,如果真的说他俩有点关系的话,那可能就是芯片手册了吧
2.这 ...

我也笨,学了好多年,也是最近才入门
回复

使用道具 举报

222#
ID:907247 发表于 2021-4-17 11:03 | 只看该作者
同学,能把资料分享给我一份吗,我邮箱zboyun@163.com,感激不尽!
回复

使用道具 举报

221#
ID:780742 发表于 2021-3-23 15:35 | 只看该作者
楼主还记得这个模块吗?请问a是什么意思呀?
回复

使用道具 举报

220#
ID:886711 发表于 2021-2-26 16:45 | 只看该作者
内个,能实现任意角度的转动么?
回复

使用道具 举报

219#
ID:875759 发表于 2021-1-9 22:09 | 只看该作者
2199180127@qq.com谢谢楼主
回复

使用道具 举报

218#
ID:874462 发表于 2021-1-8 13:53 | 只看该作者
1425026347@qq.com
楼主麻烦了
回复

使用道具 举报

217#
ID:867221 发表于 2020-12-24 16:55 | 只看该作者
1535248756@qq.com  感谢楼主,好人一生平安!
回复

使用道具 举报

216#
ID:866534 发表于 2020-12-24 13:44 | 只看该作者
435391658@qq.com谢谢楼主
回复

使用道具 举报

215#
ID:864563 发表于 2020-12-23 20:35 | 只看该作者
大佬可以分享一下自动控制和按键控制的源程序吗?1292200517@qq.com
回复

使用道具 举报

214#
ID:864563 发表于 2020-12-21 11:28 | 只看该作者
大佬,可以分享一下吗?我最近也要用sg90舵机做一个机械臂
回复

使用道具 举报

213#
ID:829905 发表于 2020-12-19 21:18 | 只看该作者
楼主,怎么能让他一直转
回复

使用道具 举报

212#
ID:691302 发表于 2020-12-11 22:50 | 只看该作者
非常感谢,很需要,谢谢
回复

使用道具 举报

211#
ID:848956 发表于 2020-11-25 14:05 | 只看该作者
谢谢大佬1727022151@qq.com
回复

使用道具 举报

210#
ID:833307 发表于 2020-10-23 06:05 | 只看该作者
自学单片机有段时间了, 菜鸟一只, 终于找的一个地方学习,
回复

使用道具 举报

209#
ID:832360 发表于 2020-10-20 18:59 | 只看该作者
996501050@qq.com  
如果能发过来的话,非常感谢!!
回复

使用道具 举报

208#
ID:832033 发表于 2020-10-20 00:28 | 只看该作者
1293930389@qq.com
谢谢大佬
回复

使用道具 举报

207#
ID:681797 发表于 2020-10-13 23:52 | 只看该作者
3492258044@qq.com谢谢楼主
回复

使用道具 举报

206#
ID:826760 发表于 2020-10-8 10:27 | 只看该作者
winter_wind0571@qq.com
给我一份,谢谢!!
回复

使用道具 举报

205#
ID:826679 发表于 2020-10-7 21:01 | 只看该作者
回复

使用道具 举报

204#
ID:826649 发表于 2020-10-7 20:03 来自触屏版 | 只看该作者
213973009@qq.com谢谢楼主,给力啊
回复

使用道具 举报

203#
ID:477152 发表于 2020-9-23 21:57 | 只看该作者
楼主方便给代码吗505024254@qq.com ,谢谢哈
回复

使用道具 举报

202#
ID:821947 发表于 2020-9-22 16:06 | 只看该作者
lovinglxf@126.com 万分感谢如果能有一些资料能否也发我参看学习一下呢谢谢楼主了,祝楼主一身平安!
回复

使用道具 举报

201#
ID:817950 发表于 2020-9-11 16:41 | 只看该作者
佬累 发表于 2020-8-10 17:23
我有几个问题,第一,0.5ms是0,意思是他没有转吗,第二所有的舵机转的角度都一样,第三怎么让他转-90度    ...

做出如下定义1.5ms状态为中立,小于1.5ms为反转或负方向运行,高于1.5ms为正转或正方向运行。
哈哈哈。其实,通常说0肯定是1.5ms -90定义为1ms +90定义为2ms。
你会问,为啥是1ms和2ms,不是应该是0.5-2.5ms么?舵机分不同种类,有90°舵机180度舵机,还有360度舵机(收帆舵机)通常,为保证兼容性,模型接收机输出的信号在1-2ms
回复

使用道具 举报

200#
ID:817950 发表于 2020-9-11 16:26 | 只看该作者
楼主,其实驱动舵机,最简单的就是软件延时,For循环嵌套
1 for延时,0 for延时这样,
普通舵机驱动还是很简单的。
说实话51性能太差,在同步运动的要求下(其实不止51很多MCU都不行,1T的MCU会好很多,但是舵机多了还是渣渣,舵机分辨率越高,对MCU要求就越苛刻),带不了太多舵机,带舵机多了,舵机的操作精度会立马下降。
普通舵机的有效范围是1-2ms高电平,分辨率要求达到1°,5.5us就要有一次中断判断。所以,航模接收机,包括飞控,舵机输出基本都是串行异步的方式进行驱动,以保证10路信号输出
回复

使用道具 举报

199#
ID:815493 发表于 2020-9-8 15:42 | 只看该作者
3233635736@qq.com多谢好不容易找到一篇讲解的多谢多谢多谢
回复

使用道具 举报

198#
ID:812990 发表于 2020-8-10 17:23 | 只看该作者
我有几个问题,第一,0.5ms是0,意思是他没有转吗,第二所有的舵机转的角度都一样,第三怎么让他转-90度    非常感谢
回复

使用道具 举报

197#
ID:812252 发表于 2020-8-7 17:56 | 只看该作者
1015829876@qq.com谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表