$ w' E. M# N0 P( `最近几年国内机器人开始起步发展,很多高校、中小学都开始进行机器人技术教学。小型的机器人、模块化的机器人、组件式的机器人是教学机器人的首选。在这些机器人产品中,舵机是很关键,使用较多的部件。根据控制方式,舵机应该称为微型伺服马达。早期在模型上使用最多,主要用于控制模型的舵面,所以俗称舵机。舵机接受一个简单的控制指令就可以自动转动到一个比较精确的角度,所以非常适合在关节型机器人产品使用。
- Q. q% N$ I9 b9 h6 T2 {% a 1.舵机的结构舵机简单的说就是集成了直流电机、电机控制器和减速器等,并封装在一个便于安装的外壳里的伺服单元。能够利用简单的输入信号比较精确的转动给定角度的电机系统。舵机安装了一个电位器(或其它角度传感器)检测输出轴转动角度,控制板根据电位器的信息能比较精确的控制和保持输出轴的角度。这样的直流电机控制方式叫闭环控制,所以舵机更准确的说是伺服马达,英文servo。
$ r- y& a3 M! [# r
: w; B$ j1 z L0 n# F! D. I舵机的主体结构如图所示,主要有几个部分:外壳、减速齿轮组、电机、电位器、控制电路。简单的工作原理是控制电路接收信号源的控制信号,并驱动电机转动;齿轮组将电机的速度成大倍数缩小,并将电机的输出扭矩放大响应倍数,然后输出;电位器和齿轮组的末级一起转动,测量舵机轴转动角度;电路板检测并根据电位器判断舵机转动角度,然后控制舵机转动到目标角度或保持在目标角度。舵机的外壳一般是塑料的,特殊的舵机可能会有金属铝合金外壳。金属外壳能够提供更好的散热,可以让舵机里面的电机运行在更高功率下,以提供更高的扭矩输出。金属外壳也可以提供更牢固的固定位置。舵机的齿轮箱有塑料齿轮、混合齿轮、金属齿轮的差别。塑料齿轮成本低,噪音小,但强度较低;金属齿轮强度高,但成本高,在装配精度一般的情况下会有很大的噪音。小扭矩舵机、微舵、扭矩大但功率密度小的舵机一般都用塑料齿轮,如Futaba3003,辉盛的9g微舵。金属齿轮一般用于功率密度较高的舵机上,比如辉盛的MG995舵机,在和3003一样体积的情况下却能提供13KG的扭矩。Hitec甚至用钛合金作为齿轮材料,其高强度能保证3003大小的舵机能提供20几公斤的扭矩。混合齿轮在金属齿轮和塑料齿轮间做了折中,在电机输出减速箱扭矩不大的部位,用塑料齿轮。8 m0 }# B/ P V5 l
; C& \( p7 V9 O) }
2.舵机的规格和选型
6 F a& `8 O9 G9 |舵机转速转速由舵机无负载的情况下转过60°角所需时间来衡量,常见舵机的速度一般在0.11s/60°-0.21s/60°之间。 ( K4 _4 g# p' R' w
) g" G' h9 u# O
舵机扭矩
& f' E6 O) S5 Q# n7 ?舵机扭矩的单位是KG·CM,这是一个扭矩单位。可以理解为在舵盘上距舵机轴中心水平距离1CM处,舵机能够带动的物体重量。
! e- J. N/ Q2 G9 n) c1 x工作电压厂商提供的速度、转矩数据和测试电压有关,在4.8V和6V两种测试电压下这两个参数有比较大的差别。如MG995在4.8V时速度为0.17秒,在6.0V时速度为0.13秒。舵机的工作电压对性能有重大的影响,舵机推荐的电压一般都是4.8V或6V。当然,有的舵机可以在7V以上工作,比如12V的舵机也不少。具体更加较高的电压可以提高电机的速度和扭矩。选择舵机还需要看我们的控制板所能提供的电压。 ! s, S7 B* N6 n* Z8 ?
尺寸重量和材质舵机的功率(速度×转矩)和舵机的尺寸比值可以理解为该舵机的功率密度,一般同样品牌的舵机,功率密度大的价格高。塑料齿轮的舵机在超出极限负荷的条件下使用可能会崩齿,金属齿轮的舵机则可能会电机过热损毁或外壳变形。所以材质的选择并没有绝对的倾向,关键是将舵机使用在设计规格之内。用户一般都对金属制的物品比较信赖,齿轮箱期望选择全金属的,舵盘期望选择金属舵盘。但需要注意的是,金属齿轮箱在长时间过载下也不会损毁,最后却是电机过热损坏或外壳变形,而这样的损坏是致命的,不可修复的。塑料出轴的舵机如果使用金属舵盘是很危险的,舵盘和舵机轴在相互扭转过程中,金属舵盘不会磨损,舵机轴会在一段时间后变得光秃,导致舵机完全不能使用。综上,选择舵机需要在计算自己所需扭矩和速度,并确定使用电压的条件下,选择有150%左右甚至更大扭矩富余的舵机。
8 f, W# v" }6 h5 \* w 3.舵机的工作原理舵机是一个微型的伺服控制系统,具体的控制原理可以用下图表示:
+ E* Y$ ]/ o5 ]" C ) v5 ~# h% w8 A9 {& b i
工作原理是控制电路接收信号源的控制脉冲,并驱动电机转动;齿轮组将电机的速度成大倍数缩小,并将电机的输出扭矩放大响应倍数,然后输出;电位器和齿轮组的末级一起转动,测量舵机轴转动角度;电路板检测并根据电位器判断舵机转动角度,然后控制舵机转动到目标角度或保持在目标角度。模拟舵机需要一个外部控制器(遥控器的接收机或者单片机)产生脉宽调制信号来告诉舵机转动角度,脉冲宽度是舵机控制器所需的编码信息。舵机的控制脉冲周期20ms,脉宽从0.5ms-2.5ms,分别对应-90度到+90度的位置(对于180°舵机)。 舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的: 0.5ms--------------0度;4 C: X7 F$ e0 z5 X6 k4 L0 e5 O
1.0ms------------45度;! ~9 Y! {! u, V0 w8 H
1.5ms------------90度;
4 R4 P2 E/ E' d: P% x2.0ms-----------135度;+ W; k4 }# j* ]7 l
2.5ms-----------180度;( T/ h5 Z9 ~& H
如下图所示:* W! S; I0 g. ]
+ K7 a2 B3 H- C+ w7 n: x) ?; g2 Q/ T$ ~# w
. P g$ D6 _6 r- s( S6 a
# b9 X/ z8 p% `需要解释的是舵机原来主要用在飞机、汽车、船只模型上,作为方向舵的调节和控制装置。所以,一般的转动范围是45°、60°或者90°,这时候脉冲宽变一般只有1ms-2ms之间(比如你做一个遥控小车,用舵机控制方向,那么舵机转的角度肯定不是180度,对吧。因为你见过你开的车方向能转180度吗?)。而后舵机开始在机器人上得到大幅度的运用,转动的角度也在根据机器人关节的需要增加到-90°至90°之间,甚至还有-135°至135°之间,脉冲宽度也随之有了变化。对于机器人控制而言,我们一般通过单片机产生PWM信号控制舵机。 ' [% H" d) ?$ l
4.STM32控制舵机代码/ E0 S D6 D z1 h/ `- w: n9 K; f
- 0.5ms---------0度. E0 U# | T$ L3 V0 d; T: n
- 0.6ms---------9度( e' R: N1 P2 Y5 X" }: q7 d
- 0.7ms---------18度
7 f7 x& ~% R' b3 V; C - 0.8ms---------27度' [9 N) [' n8 [( q5 t" \
- 0.9ms---------36度9 L3 N) f; c0 l% r) m
- 1.0ms---------45度
; G/ S" n" y" S7 T4 ~ - 1.1ms---------54度" [- O) ^) x' t. r$ g0 K* D& m2 H$ T
- 1.2ms---------63度
" w- T3 z) |8 s3 f8 Y- p7 S - 1.3ms---------72度
; g" h6 W: ~: k& w4 s5 b" T/ L) U - 1.4ms---------81度
* o& @4 U$ k- k0 W ]7 r - 1.5ms---------90度
2 q# C3 I1 v% ^# \2 R G - 1.6ms---------99度0 p+ x+ G6 |4 X6 I0 P' d8 S
- 1.7ms---------108度
/ ]5 D5 a) P! X4 }. \/ } - 1.8ms---------117度
5 m6 T2 F2 n1 z% @: h6 S - 1.9ms---------126度0 i. s6 A9 w# r ~, J2 Q
- 2.0ms---------135度) `, E V- y9 g# ?3 ]$ |4 I
- 2.1ms---------144度4 I4 _' }; e9 c, x# x; u
- 2.2ms---------153度
% P2 A2 I1 c I& t* Q - 2.3ms---------162度+ ]7 ^/ e* y% z' ]
- 2.4ms---------171度+ j% Z6 t- }4 a8 Z7 L9 I* N* Y
- 2.5ms---------180度! j# c1 u: b5 c! r; s5 m
- 8 J) T1 Z8 D% {4 p/ L) N( j1 }+ m
- \ | /
! c9 o7 Z1 m- M- Q% |0 A9 g - \---|---/ q B& Y) G2 x
- \ | /! }2 O+ B, i2 r$ d2 n4 P4 D1 t1 ^4 n
- \ | /, }7 U6 e4 G8 L0 Q' O& I( [3 T
- \|/ b% R" Y' K( @6 o
- --------------------------------------------------------------3 u/ ]; r) E. Q3 p. n
a( {% O4 C1 h7 c% Q2 r" }- 20ms的时基脉冲,如果想让舵机转63度,就应该发生一个高电平为1.2ms,
8 f4 J9 ^. O3 Y1 z - 周期为20ms的方波,duty=1.2/20=6% ,而定时器自动重装载寄存器arr的值
; y* c& @7 |. F7 D - 为 1000 ,所以令duty=60,时占空比才为60/1000=6%. ~2 X( g8 U) e0 _4 n( k4 [: Q" C
- , {5 ~' A+ B( n5 G w
- 20ms的时基脉冲,如果想让舵机转90度,就应该发生一个高电平为1.5ms,2 g3 W9 J" F$ e8 K6 P8 j, V* l* t
- 周期为20ms的方波,duty=1.5/20=7.5% ,而定时器自动重装载寄存器arr的值; M$ M+ D) s- I, @0 ]- `: y
- 为 1000 ,所以令duty=75,时占空比才为75/1000=7.5%.9 o/ |4 Q. S8 F2 a4 M+ h. Y* r3 N
- " A5 I) I- }$ s/ r% q5 N+ j5 d
- 20ms的时基脉冲,如果想让舵机转126度,就应该发生一个高电平为1.9ms,. m, |; h% l& P9 {3 u* i4 J2 t8 J
- 周期为20ms的方波,duty=1.9/20=9.5% ,而定时器自动重装载寄存器arr的值+ v0 a4 P+ d" ] _* `8 Q. C
- 为 1000 ,所以令duty=95,时占空比才为95/1000=9.5%.
: _+ t$ D3 \3 f - -----------------------------------------------------------------
( `) J0 z! o7 U* k8 C5 m7 w( A# \ - void SERVO_Init(void)
2 X3 R7 V# c) ^4 L - {
0 z4 [) x0 c9 ~! E( M - GPIO_InitTypeDef GPIO_InitStruct;
, C2 g q; c* O% S2 x6 h" ` - TIM_TimeBaseInitTypeDef TIM_TimeStructure;" T* h; d. s. R$ h! u4 [/ L
- TIM_OCInitTypeDef TIM_OCInitStructure;0 E" k) A$ f/ Y! ^& |4 j2 m$ b5 p
- & p; B( X! Z/ A; N6 v
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ' ^- ^6 v2 a4 m9 _4 {& t) a* A; |
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); Z: h0 g l$ s) {! [( _/ c: u2 A
- 7 ?5 {9 ]! {% G! `+ ~
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//配置为复用推挽输出" i0 z* j4 g" D, F% ^
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
7 w& Y) E& v! w- J4 n- J - GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;% M" I: H2 N/ ?: c% f
- GPIO_Init(GPIOA,&GPIO_InitStruct);
* x$ w1 M4 E5 M% w
' H' t! s6 B% Y, s5 ^2 M/ g- TIM_TimeStructure.TIM_Period=1000;//1000 自动重装载寄存器的值,周期为50 000Hz/1000=50Hz,即输出PWM波形的频率为20ms。
- s$ M! H# D# v' ^; R9 S* ^ - TIM_TimeStructure.TIM_Prescaler=1440-1;;// 1400 时钟预分频系数为3600,72 000 000Hz/1400=50000Hz =50KHZ。 7 H' i. S* w' ^$ [9 Q- _4 D
- TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;
9 g) |( T' }1 A" z" c% k( J8 | - TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;" R1 D7 D& B) M+ @. [* ~; y. _
- TIM_TimeStructure.TIM_RepetitionCounter=0;
) J6 `0 M( i/ d4 i# y - TIM_TimeBaseInit(TIM3,&TIM_TimeStructure);1 J; k# K+ J/ J" A$ ?
- TIM_ARRPreloadConfig(TIM3,ENABLE); //使能ARR预装载寄存器(影子寄存器): o; A3 w' ^* W7 ^
9 y2 i! M2 C4 X+ e- TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
& t& D S( `& A- [- K& { - TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;2 ?( r1 w; V9 E! i0 s/ y" ~
- TIM_OCInitStructure.TIM_Pulse=0;//占空比大小4 K" l m; c+ Z6 ~) F! O# B
- TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
4 _( v# Q y3 N. p - TIM_OC2Init(TIM3,&TIM_OCInitStructure);
5 K- ^) g( X% D0 o; w% E, X' } - 7 z0 x5 h7 Q0 c! a1 i
- TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
5 z! x" p; P, F: K" u4 v7 P9 k - TIM_Cmd(TIM3,ENABLE);
& O; H* ?7 p4 P5 i! c$ l% e% l% F - TIM_CtrlPWMOutputs(TIM3,ENABLE); 1 P; u, \! p/ \
- }
) L5 G A+ R, f - //舵机角度控制# M s7 C. B- b1 H5 T
- void SERVO_Angle_Control(uint16_t Compare2)
& w# v R5 X* o) S3 R& S. H6 _, J3 J - {% x5 q0 x4 E- v3 l+ T
- TIM_SetCompare2(TIM3,Compare2);//设置通道2为可变的pwm
0 V ~# j1 B( V' H0 [2 x - }
复制代码: \& \9 K$ ^* X: B* \0 A2 b
配置号上面的程序,如果你想让舵机旋转90度,只需要在你程序的某个位置放上这句话就可以了 SERVO_Angle_Control(75);//舵机旋转90度
" j9 w% C- d3 @# v1 i" _原因就是20ms的时基脉冲,如果想让舵机转90度,就应该发生一个高电平为1.5ms,周期为20ms的方波,duty=1.5/20=7.5% ,而定时器自动重装载寄存器arr的值为 1000 ,所以令duty=75,时占空比才为75/1000=7.5%。以此类推,你想让舵机转多大的角度按照这个方法设置就行了。 / G) S K$ ]; z( ]
9 w+ o7 a6 x6 v- z# C7 D
) h0 Q/ |+ u# \: s7 B |