单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
此篇文章免费分享给大家,这篇文章结合笔者所学以及在往上参考大神的讲解,通过自己的理解整理成文档,在此免费分享给大家,由于笔者是一名在读学生,文中难免有不当之处,如有错误,望大家指正!!!我会把源文档和源程序放在附件中,有黑币的直接下载,没有的留下邮箱,看见回

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, 下载次数: 200)
SG90舵机--按键控制.7z (9.62 KB, 下载次数: 162)
浅谈SG90舵机.docx (139.68 KB, 下载次数: 76)


评分

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

查看全部评分

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

使用道具 举报

来自 2#
小笨鸟O 发表于 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, 下载次数: 15)

IMG_20190524_152615.jpg

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

IMG_20190524_152729.jpg
回复

使用道具 举报

来自 3#
小笨鸟O 发表于 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;为啥就报错呢?请楼主指点,谢谢!
回复

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

6#
15871820141 发表于 2019-4-16 22:04 | 只看该作者
回复

使用道具 举报

7#
 楼主| 我只是过于低调 发表于 2019-4-17 21:10 | 只看该作者

已经发送到你的邮箱
回复

使用道具 举报

8#
 楼主| 我只是过于低调 发表于 2019-4-18 09:46 | 只看该作者

不客气不客气,共同学习
回复

使用道具 举报

9#
Rainson 发表于 2019-4-20 01:38 来自手机 | 只看该作者
请问自动控制使用什么控制的?
回复

使用道具 举报

10#
YH123456789 发表于 2019-4-20 10:00 | 只看该作者
1376886001@qq.com 感谢楼主
回复

使用道具 举报

11#
阿鎏尼克 发表于 2019-4-20 10:10 来自手机 | 只看该作者
谢谢392389854@qq.com
回复

使用道具 举报

12#
 楼主| 我只是过于低调 发表于 2019-4-20 14:56 | 只看该作者
Rainson 发表于 2019-4-20 01:38
请问自动控制使用什么控制的?

这个自动控制很简单,就是我上边讲的a==16,这只不过是个延时,为了让舵机达到指定位置,然后在返回另一个指定位置,从而实现自动控制
回复

使用道具 举报

13#
 楼主| 我只是过于低调 发表于 2019-4-20 14:59 | 只看该作者

已发送
回复

使用道具 举报

14#
 楼主| 我只是过于低调 发表于 2019-4-20 14:59 | 只看该作者

已发送
回复

使用道具 举报

15#
爱疯的孩纸 发表于 2019-4-20 15:05 | 只看该作者
回复

使用道具 举报

16#
779380649 发表于 2019-4-20 23:52 | 只看该作者
回复

使用道具 举报

17#
 楼主| 我只是过于低调 发表于 2019-4-21 17:21 | 只看该作者
回复

使用道具 举报

18#
 楼主| 我只是过于低调 发表于 2019-4-21 17:22 | 只看该作者
回复

使用道具 举报

19#
lwl812071006 发表于 2019-4-22 09:08 | 只看该作者
有电路图?
回复

使用道具 举报

20#
 楼主| 我只是过于低调 发表于 2019-4-22 09:42 | 只看该作者

这个很简单的,就是随手演示一下,没有特意的去画电路图
回复

使用道具 举报

21#
yyuq 发表于 2019-4-22 13:05 | 只看该作者
772497644@qq.com  谢谢楼主
回复

使用道具 举报

22#
 楼主| 我只是过于低调 发表于 2019-4-22 15:41 | 只看该作者

已发送,注意查收
回复

使用道具 举报

23#
safadsgsgf 发表于 2019-4-24 23:53 | 只看该作者
1019528885@qq.com  感谢楼主分享!
回复

使用道具 举报

24#
 楼主| 我只是过于低调 发表于 2019-4-26 00:00 | 只看该作者

已发送,注意查收
回复

使用道具 举报

25#
explorercc 发表于 2019-4-27 22:30 | 只看该作者
explorercc@126.com,谢谢楼主
回复

使用道具 举报

26#
yyhlsf 发表于 2019-4-28 10:25 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

27#
 楼主| 我只是过于低调 发表于 2019-4-28 12:43 | 只看该作者

已发送,注意查收
回复

使用道具 举报

28#
 楼主| 我只是过于低调 发表于 2019-4-28 12:43 | 只看该作者

共同进步
回复

使用道具 举报

29#
kkk11 发表于 2019-4-29 09:08 | 只看该作者
请问转180°应该怎么设置??
回复

使用道具 举报

30#
 楼主| 我只是过于低调 发表于 2019-4-29 09:23 | 只看该作者
kkk11 发表于 2019-4-29 09:08
请问转180°应该怎么设置??

高电平t占有周期的时间改为2.5ms,理论上可以转到180°,但是不知道什么原因,我得舵机不能完全转到180°
回复

使用道具 举报

31#
机械1111 发表于 2019-4-30 23:15 | 只看该作者
648244672@qq.com谢谢楼主
回复

使用道具 举报

32#
 楼主| 我只是过于低调 发表于 2019-5-1 09:07 | 只看该作者

已发送
回复

使用道具 举报

33#
bazhahei 发表于 2019-5-1 09:38 来自手机 | 只看该作者
2622869349@qq.com    谢谢楼主
回复

使用道具 举报

34#
hg1594130342 发表于 2019-5-1 15:34 | 只看该作者
1594130342@qq.com   谢谢楼主
回复

使用道具 举报

35#
 楼主| 我只是过于低调 发表于 2019-5-1 23:27 | 只看该作者
bazhahei 发表于 2019-5-1 09:38
2622869349@qq.com    谢谢楼主

已发送
回复

使用道具 举报

36#
 楼主| 我只是过于低调 发表于 2019-5-1 23:28 | 只看该作者

已发送
回复

使用道具 举报

37#
spang 发表于 2019-5-2 14:16 | 只看该作者
1064366989@qq.com  谢谢楼主
回复

使用道具 举报

38#
JokerAlon 发表于 2019-5-2 22:46 | 只看该作者
210121656@qq.com 谢谢楼主
回复

使用道具 举报

39#
机械1111 发表于 2019-5-2 23:20 | 只看该作者
楼主,要控制多个舵机应该怎么办?我这样改的程序但是这几个舵机转的角度都不一样,有的转角特别小
if(count<=PWM_count)
  {
    SG_PWM=1;
         SG_PWM2=1;
         SG_PWM3=1;
         SG_PWM4=1;
  }
  else
  {
    SG_PWM1=0;
         SG_PWM2=0;
         SG_PWM3=0;
         SG_PWM4=0;
  }
回复

使用道具 举报

40#
 楼主| 我只是过于低调 发表于 2019-5-2 23:37 | 只看该作者

额  兄弟  别逗了,那么多黑币,如果觉得能学到东西就下了吧。没有黑币的我可以帮忙下载
回复

使用道具 举报

41#
123.00 发表于 2019-5-3 10:48 | 只看该作者
519902379@qq.com谢谢楼主
回复

使用道具 举报

42#
 楼主| 我只是过于低调 发表于 2019-5-3 14:12 | 只看该作者
机械1111 发表于 2019-5-2 23:20
楼主,要控制多个舵机应该怎么办?我这样改的程序但是这几个舵机转的角度都不一样,有的转角特别小
if(co ...

你是想要所有的舵机转一样的角度嘛?
回复

使用道具 举报

43#
机械1111 发表于 2019-5-4 07:16 来自手机 | 只看该作者
我只是过于低调 发表于 2019-5-3 14:12
你是想要所有的舵机转一样的角度嘛?

是的,我想让它们同步地转一样的角度
回复

使用道具 举报

44#
机械1111 发表于 2019-5-4 09:28 来自手机 | 只看该作者
机械1111 发表于 2019-5-4 07:16
是的,我想让它们同步地转一样的角度

实际上我想做一个四足机器人,让它们都同步转一样的角度只是先测试一下,最终想实现的是前两个舵机同步前摆同时后两个舵机同步向后摆。
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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