找回密码
 立即注册

QQ登录

只需一步,快速开始

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

SG90 9g舵机单片机控制的一些注意事项

  [复制链接]
跳转到指定楼层
楼主
ID:140725 发表于 2017-3-7 00:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



如图这种模拟舵机,在智能小车中是用来带动超声波探头旋转,刚接触的朋友在使用的时候可能觉得有些棘手,故将这几天的使用心得总结如下:   
  

首 先,这个舵机是模拟舵机,而非数字舵机,这两者的区别是这样,数字舵机只要给一个PWM信号即可,这个信号是目的地的位置,舵机会自动旋转到这个位置,而 模拟舵机需要一直给予目的地的PWM信号。由于舵机需要的PWM信号实际就是一个方波,所以模拟舵机就是需要不断的重复发一样的方波,直到舵机旋转到指定 的位置,并且如果需要锁定在这个位置,那么还需继续给予这个方波。
  请看下面这个例子:

  
  1. void main(void)
  2.   
  3. {
  4.   
  5.      DUOJI=1;
  6.   
  7.      Delay500us();
  8.   
  9.      Delay500us();
  10.   
  11.      DUOJI=0;
  12.   
  13.      Delay500us();
  14.   
  15.      Delay500us();
  16.   
  17.      while(1)
  18.   
  19.      {
  20.   
  21.      DUOJI=1;
  22.   
  23. Delay500us();
  24.   
  25.      Delay500us();
  26.   
  27.      DUOJI=0;
  28.   
  29.      Delay500us();
  30.   
  31.      Delay500us();
  32.   
  33.      }
  34.   
  35. }
复制代码
   同样的代码一个在while外,一个在while内,如果将while内的代码都注释起来,那么舵机并不会转动,因为并没有一直给予方波,就是这意思。   
  

但 是这样写代码不太好,因为使用的是延迟函数,程序就会停在这里,不会去响应其他的函数,所以一般是使用定时器中断,具体的代码就不在这里写了,附件里有。 需要注意的一点是,进入中断的频率越高,数每+1,舵机转过的角度就越小,也就是精度越好,我使用的是每0.02ms进入一次中断,那么数每+1,舵机大 概转过0.02/2*185=1.85°。
      再有就是这个方波与转过角度的关系了,如下图:

  


      重要的部分是0.5-2.5ms上升沿这段,时间越长舵机转过角度越大,0.5ms舵机就转过0°,2.5ms舵机就转到最大角度(大概185°),根据自己需要设定即可。0.5-30ms下降沿这段,并不重要,只要保证大于0.5ms即可。
      最后请看这段代码:

  1. void timer0(void) interrupt 1
  2.   
  3. {
  4.   
  5. //   TR0=0;                             //如果加上TR0,那么定时时间会受到影响,被延长
  6.   
  7.      TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
  8.   
  9.      TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
  10.   
  11.      
  12.   
  13.      uiPwmCountDuoJ++;
  14.   
  15.      if(uiPwmCountDuoJ>200)            
  16.   
  17.      {
  18.   
  19.           uiPwmCountDuoJ=0;
  20.   
  21.      }
  22.   
  23.      PwmServomoto();
  24.   
  25. //   TR0=1;
  26.   
  27. }
复制代码


      
这个中断函数里需要注意的是两行注释掉的TR0语句,如果不注释这 两条语句,那么每次进入中断会先关闭中断计数,等出中断了再继续计数,这样就相当于延长了每次中断的时间,那么舵机转过的角度就会受到影响,如果后续再在 中断中增加别的代码,那么舵机就得每次都进行调整,很麻烦,所以如果中断中的代码并不长,不建议加上TR0这两条语句。
      基本就是这些了,有什么问题就留言,看到会第一时间回复。


   如图这种模拟舵机,在智能小车中是用来带动超声波探头旋转,刚接触的朋友在使用的时候可能觉得有些棘手,故将这几天的使用心得总结如下:    首先,这个舵机是模拟舵机,而非数字舵机,这两者的区别是这样,数字舵机只要给一个PWM信号即可,这个信号是目的地的位置,舵机会自动旋转到这个位置,而模拟舵机需要一直给予目的地的PWM信号。由于舵机需要的PWM信号实际就是一个方波,所以模拟舵机就是需要不断的重复发一样的方波,直到舵机旋转到指定的位置,并且如果需要锁定在这个位置,那么还需继续给予这个方波。
请看下面这个例子:
  1. void main(void)
  2. {
  3. DUOJI=1;
  4.         Delay500us();
  5.         Delay500us();
  6. DUOJI=0;
  7.         Delay500us();
  8.         Delay500us();
  9.         while(1)
  10.         {
  11. DUOJI=1;
  12.         Delay500us();
  13.         Delay500us();
  14.         DUOJI=0;
  15.         Delay500us();
  16.         Delay500us();
  17.         }
  18. }
复制代码

   同样的代码一个在while外,一个在while内,如果将while内的代码都注释起来,那么舵机并不会转动,因为并没有一直给予方波,就是这意思。    但是这样写代码不太好,因为使用的是延迟函数,程序就会停在这里,不会去响应其他的函数,所以一般是使用定时器中断,具体的代码就不在这里写了,附件里有。需要注意的一点是,进入中断的频率越高,数每+1,舵机转过的角度就越小,也就是精度越好,我使用的是每0.02ms进入一次中断,那么数每+1,舵机大概转过0.02/2*185=1.85°。
    再有就是这个方波与转过角度的关系了,如下图:
    重要的部分是0.5-2.5ms上升沿这段,时间越长舵机转过角度越大,0.5ms舵机就转过0°,2.5ms舵机就转到最大角度(大概185°),根据自己需要设定即可。0.5-30ms下降沿这段,并不重要,只要保证大于0.5ms即可。
    最后请看这段代码:
  1. void timer0(void) interrupt 1
复制代码

    这个中断函数里需要注意的是两行注释掉的TR0语句,如果不注释这两条语句,那么每次进入中断会先关闭中断计数,等出中断了再继续计数,这样就相当于延长了每次中断的时间,那么舵机转过的角度就会受到影响,如果后续再在中断中增加别的代码,那么舵机就得每次都进行调整,很麻烦,所以如果中断中的代码并不长,不建议加上TR0这两条语句。
   
最后附上完整的51单片机控制舵机源码:
舵机程序.zip (22.69 KB, 下载次数: 528)

评分

参与人数 6黑币 +37 收起 理由
胡来的馒头 + 5 绝世好帖!
莫德尔 + 12 很给力!
wbx2017 + 5
奇点zy + 5 很给力!
317673965 + 5 赞一个!
xiaoguo666 + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:216646 发表于 2017-7-2 22:24 | 只看该作者
用了这个压缩包,直接就没反应了
回复

使用道具 举报

板凳
ID:233394 发表于 2017-9-16 13:42 | 只看该作者
斤斤计较 发表于 2017-7-2 22:25
用了你这个压缩吧,直接就没反应了

是的,和层主一个反应
回复

使用道具 举报

地板
ID:233449 发表于 2017-9-16 15:45 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

5#
ID:272080 发表于 2018-2-8 18:58 | 只看该作者
不想下载  楼主能不能复制完整的代码出来
回复

使用道具 举报

6#
ID:293351 发表于 2018-3-18 09:34 | 只看该作者
舵机一直调整不了,下载好好试试,谢谢
回复

使用道具 举报

7#
ID:288414 发表于 2018-5-29 19:49 | 只看该作者
支持  使用看看效果 关注
回复

使用道具 举报

8#
ID:377519 发表于 2018-8-3 11:26 | 只看该作者
这个版本网上好几个地方都有,也不知道谁是原创,看上面的人都说不好使
回复

使用道具 举报

9#
ID:384149 发表于 2018-8-8 13:04 | 只看该作者
很给力,棒棒哒
回复

使用道具 举报

10#
ID:265444 发表于 2018-8-12 11:43 | 只看该作者
这和很棒
回复

使用道具 举报

11#
ID:436152 发表于 2018-12-1 13:33 | 只看该作者
棒棒哒
回复

使用道具 举报

12#
ID:440944 发表于 2018-12-9 21:17 | 只看该作者
可以吗话说这程序
回复

使用道具 举报

13#
ID:303320 发表于 2018-12-17 11:58 | 只看该作者
不错呦
回复

使用道具 举报

14#
ID:511592 发表于 2019-4-26 15:59 | 只看该作者
很好啊,我的不会没有反应。终于解除了我对连线错误的怀疑
回复

使用道具 举报

15#
ID:530474 发表于 2019-5-15 07:55 来自手机 | 只看该作者
代码还不错 @就是没反应
回复

使用道具 举报

16#
ID:510728 发表于 2019-5-19 09:26 | 只看该作者
内容很详细 值得一看
回复

使用道具 举报

17#
ID:421308 发表于 2019-7-12 15:11 | 只看该作者
接线怎么接啊
回复

使用道具 举报

18#
ID:589233 发表于 2019-7-25 10:47 | 只看该作者
棒,帮助不小
回复

使用道具 举报

19#
ID:588060 发表于 2019-8-7 17:10 | 只看该作者
这个连接舵机应该连哪几个口啊?
回复

使用道具 举报

20#
ID:515975 发表于 2019-8-8 11:12 | 只看该作者
感谢分享,太棒了
回复

使用道具 举报

21#
ID:587361 发表于 2019-8-9 16:29 | 只看该作者
支持一下,就是要下载太麻烦了
回复

使用道具 举报

22#
ID:361216 发表于 2019-8-10 17:44 | 只看该作者
正准备用这个型号的舵机,谢谢提醒受教了!!
回复

使用道具 举报

23#
ID:598462 发表于 2019-8-12 09:36 | 只看该作者
其实最有效的方法还是查明原理以后,自己根据原理编程序试验
就算用了别人编的程序后,智能小车开得飞起,又有什么意义呢?
回复

使用道具 举报

24#
ID:207204 发表于 2020-11-1 21:12 | 只看该作者
实际应用中,程序还是使用两个定时器中断。
模拟舵机SG90需要持续的输入pwm信号,pwm不需要在主函数里设定,定时器中断,单片机持续输出稳定的pwm信号给舵机,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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