标题: SG90 9g舵机单片机控制的一些注意事项 [打印本页]
作者: 51hei学习技术中 时间: 2017-3-7 00:42
标题: SG90 9g舵机单片机控制的一些注意事项
如图这种模拟舵机,在智能小车中是用来带动超声波探头旋转,刚接触的朋友在使用的时候可能觉得有些棘手,故将这几天的使用心得总结如下:
首 先,这个舵机是模拟舵机,而非数字舵机,这两者的区别是这样,数字舵机只要给一个PWM信号即可,这个信号是目的地的位置,舵机会自动旋转到这个位置,而 模拟舵机需要一直给予目的地的PWM信号。由于舵机需要的PWM信号实际就是一个方波,所以模拟舵机就是需要不断的重复发一样的方波,直到舵机旋转到指定 的位置,并且如果需要锁定在这个位置,那么还需继续给予这个方波。
请看下面这个例子:
- void main(void)
-
- {
-
- DUOJI=1;
-
- Delay500us();
-
- Delay500us();
-
- DUOJI=0;
-
- Delay500us();
-
- Delay500us();
-
- while(1)
-
- {
-
- DUOJI=1;
-
- Delay500us();
-
- Delay500us();
-
- DUOJI=0;
-
- Delay500us();
-
- Delay500us();
-
- }
-
- }
复制代码 同样的代码一个在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即可。
最后请看这段代码:
- void timer0(void) interrupt 1
-
- {
-
- // TR0=0; //如果加上TR0,那么定时时间会受到影响,被延长
-
- TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
-
- TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
-
-
-
- uiPwmCountDuoJ++;
-
- if(uiPwmCountDuoJ>200)
-
- {
-
- uiPwmCountDuoJ=0;
-
- }
-
- PwmServomoto();
-
- // TR0=1;
-
- }
复制代码
这个中断函数里需要注意的是两行注释掉的TR0语句,如果不注释这 两条语句,那么每次进入中断会先关闭中断计数,等出中断了再继续计数,这样就相当于延长了每次中断的时间,那么舵机转过的角度就会受到影响,如果后续再在 中断中增加别的代码,那么舵机就得每次都进行调整,很麻烦,所以如果中断中的代码并不长,不建议加上TR0这两条语句。
基本就是这些了,有什么问题就留言,看到会第一时间回复。
如图这种模拟舵机,在智能小车中是用来带动超声波探头旋转,刚接触的朋友在使用的时候可能觉得有些棘手,故将这几天的使用心得总结如下: 首先,这个舵机是模拟舵机,而非数字舵机,这两者的区别是这样,数字舵机只要给一个PWM信号即可,这个信号是目的地的位置,舵机会自动旋转到这个位置,而模拟舵机需要一直给予目的地的PWM信号。由于舵机需要的PWM信号实际就是一个方波,所以模拟舵机就是需要不断的重复发一样的方波,直到舵机旋转到指定的位置,并且如果需要锁定在这个位置,那么还需继续给予这个方波。
请看下面这个例子:
- void main(void)
- {
- DUOJI=1;
- Delay500us();
- Delay500us();
- DUOJI=0;
- Delay500us();
- Delay500us();
- while(1)
- {
- DUOJI=1;
- Delay500us();
- Delay500us();
- DUOJI=0;
- Delay500us();
- Delay500us();
- }
- }
复制代码
同样的代码一个在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即可。
最后请看这段代码:
- void timer0(void) interrupt 1
复制代码
这个中断函数里需要注意的是两行注释掉的TR0语句,如果不注释这两条语句,那么每次进入中断会先关闭中断计数,等出中断了再继续计数,这样就相当于延长了每次中断的时间,那么舵机转过的角度就会受到影响,如果后续再在中断中增加别的代码,那么舵机就得每次都进行调整,很麻烦,所以如果中断中的代码并不长,不建议加上TR0这两条语句。
最后附上完整的51单片机控制舵机源码:
作者: 斤斤计较 时间: 2017-7-2 22:24
用了这个压缩包,直接就没反应了
作者: king..... 时间: 2017-9-16 13:42
是的,和层主一个反应
作者: 愤怒的蜗牛 时间: 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 |