标题: SG90 9g舵机单片机控制的一些注意事项 [打印本页]

作者: 51hei学习技术中    时间: 2017-3-7 00:42
标题: SG90 9g舵机单片机控制的一些注意事项



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

首 先,这个舵机是模拟舵机,而非数字舵机,这两者的区别是这样,数字舵机只要给一个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)

作者: 斤斤计较    时间: 2017-7-2 22:24
用了这个压缩包,直接就没反应了
作者: king.....    时间: 2017-9-16 13:42
斤斤计较 发表于 2017-7-2 22:25
用了你这个压缩吧,直接就没反应了

是的,和层主一个反应
作者: 愤怒的蜗牛    时间: 2017-9-16 15:45
好资料,51黑有你更精彩!!!
作者: 大力做大力愛    时间: 2018-2-8 18:58
不想下载  楼主能不能复制完整的代码出来
作者: wpq201800    时间: 2018-3-18 09:34
舵机一直调整不了,下载好好试试,谢谢
作者: 破碎虚空    时间: 2018-5-29 19:49
支持  使用看看效果 关注
作者: 基51hei33    时间: 2018-8-3 11:26
这个版本网上好几个地方都有,也不知道谁是原创,看上面的人都说不好使
作者: 瓦尔特    时间: 2018-8-8 13:04
很给力,棒棒哒
作者: 涂山粤初    时间: 2018-8-12 11:43
这和很棒
作者: 白依依    时间: 2018-12-1 13:33
棒棒哒

作者: jimrelief    时间: 2018-12-9 21:17
可以吗话说这程序

作者: 稽铒珐    时间: 2018-12-17 11:58
不错呦
作者: Anastasia_C    时间: 2019-4-26 15:59
很好啊,我的不会没有反应。终于解除了我对连线错误的怀疑
作者: ZimmerHo    时间: 2019-5-15 07:55
代码还不错 @就是没反应
作者: 2592532754    时间: 2019-5-19 09:26
内容很详细 值得一看
作者: xiaozhong1314    时间: 2019-7-12 15:11
接线怎么接啊
作者: gaoyuaniloveyou    时间: 2019-7-25 10:47
棒,帮助不小
作者: sy12    时间: 2019-8-7 17:10
这个连接舵机应该连哪几个口啊?
作者: zynn    时间: 2019-8-8 11:12
感谢分享,太棒了
作者: 随云00    时间: 2019-8-9 16:29
支持一下,就是要下载太麻烦了
作者: lhqsbz    时间: 2019-8-10 17:44
正准备用这个型号的舵机,谢谢提醒受教了!!
作者: akjustice    时间: 2019-8-12 09:36
其实最有效的方法还是查明原理以后,自己根据原理编程序试验
就算用了别人编的程序后,智能小车开得飞起,又有什么意义呢?
作者: caozhaokun    时间: 2020-11-1 21:12
实际应用中,程序还是使用两个定时器中断。
模拟舵机SG90需要持续的输入pwm信号,pwm不需要在主函数里设定,定时器中断,单片机持续输出稳定的pwm信号给舵机,




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1