概述
7 l* ?: I- r- n8 u. C( B正在做的项目需要用STM32控制步进电机,本篇主要讲解利用STM32定时器外设输出脉冲来控制步进电机转动。" n6 ]3 m+ j3 t+ R) V0 W
! B, n5 J s$ V/ o% a) bSTM32定时器. C" x+ p! ?1 P0 t7 E8 h
使用STM32芯片类型:STM32c8t6。! C; o% I3 `# d5 |) S" f
; Z! J" C0 i7 x5 T: ]8 o; E$ b
' e& D! P. l ?, m7 w
! O( M& o6 S8 M5 X3 K; D# d
使用外设接口:选用TIM4的CH1通道,对应输出脉冲IO口为PB6。
1 P! n( V/ Q- k4 o/ i8 p7 k# s5 E3 o7 ]1 S M- O- J3 c# N
1 r8 M- x" }+ T) r4 d u2 e! B: `
& p. p* C, Q5 z) _
+ Q' A3 F7 f% i$ K( S5 H
步进驱动器介绍; Q- Y0 T& \# R
(这里以两相步进驱动器为例,详细见说明书)
. T6 ?* Y1 |) Z# J2 q4 r! U6 c5 _5 ]" ^$ L1 Y" }- u
接口! c& I- I7 F; q$ ~, T9 o5 x
步进驱动器可分为两部分:环形分配器、功率放大器。2 Q$ O% \) u* f; V" n, p
环形分配器:接收3种信号分别为:脉冲信号(PUL),方向信号(DIR),脱机信号(ENA)。- |, x- t$ U3 Z U9 G
脉冲信号:环形分配器对脉冲信号进行分配,去控制功率放大器相应的晶体管,使步进电机的线圈得电。所以,步进电机要运转就必须有脉冲输入,所以需要一个驱动器来给步进电机的各项绕组依次通电。
2 R3 J, S* N( \' v6 v9 X方向信号:控制AB通电的相序,A-B顺时针,B-A逆时针
" a. W1 L Q, {: S. B! W脱机信号:步进电机停止时,AB线圈有一相得电,得电的功能使转子锁住,使转子不能动,需要收去拨动转子的时候,需要给脱机信号,使AB相绕组完全断电,转子处于自由转动状态。(也就是说控制电机停止除了不给脉冲之外,还可以控制脱机信号来锁死电机,此处用不着脱机信号)
( u0 Q1 ?" J2 @0 I$ t+ c- q" m$ @ Z- t) J
- {8 u/ W& L5 y( ], H) t) i0 _! J3 T
细分+ w* v0 r- v9 }
为了提高步进电动机控制的精度,现在的步进驱动器都有细分的功能,所谓细分,就是通过驱动器中电路的方法把步距角减小。比如把步进驱动器设置成5细分,假设原来步距角1.8°那么设成5细分后,步距角就是0.36°。也就是说原来一步可以走完的,设置成细分后需要走5步。一般步进电动机的细分表在驱动器上可以直接看到。(设置合适细分能够避免电机转动时震动过大,但过高的细分数会导致电机输出力矩减小)
+ p$ |" S+ A6 ~% S4 f- W0 c9 D% D9 J* s
0 _6 y& J# K' F/ h& a0 a2 `! C0 K" p E6 H2 l
驱动电源:- w) i( B8 l, c" I: c: n3 F, o
需要9-42V直流电源,需要使用变压器将220V交流电转为24V直流电4 G, R+ @& M' y
3 Z5 R3 f: [8 P3 M S+ @
1 B$ p2 A* H n, k9 s1 \. [/ `* u3 Q- F$ Q" d$ T7 Q
定时器频率与步进电机的关系
$ O. c+ ]! g9 @2 J接线" Z4 g, b1 B v# B
将驱动器PUL+端接入STM32输出脉冲的IO口(PB6),PUL-端接地1 K, y3 t( Y5 y+ ?9 w( q
将驱动器DIR+端接入STM32的任意一个闲置IO口(这里选PB5),DIR-端接地- @( [; P: ` Y& r& v9 D; n" R/ S k. `
驱动器ENA±端不接! p4 x1 h2 E' @8 _1 b$ Z
A+、A-、B+、B-接入步进电机
- h; r3 k- Y8 R5 E2 Z: t8 F电源接到变压器/ t; E4 _5 h- X. B7 n/ R
r- W2 m* `; b- L. k6 h: P( t; e
) v4 A+ a0 H; C; f; J" w频率与速度的关系9 L" V/ X& N8 r& R( J' }
确定输出脉冲频率与电机转速的关系,对于两相步进电机而言:- y+ S+ r1 ~! i4 R+ s D' D8 G
转速 = 脉冲频率 * 60 /((360/T)*x)
+ s1 a, ^0 t+ V) H6 w$ MT是步进电机步距角(1.8°),x是驱动器细分倍数(16)% ?7 K" ?3 W4 ?" r
脉冲频率= 时钟频率(72Mhz)/ ((arr+1)*(psc+1))3 S1 z) A) ]! o/ s8 z
根据以上公式,可以得到:' N3 H8 y# F4 ]7 ]+ a
Speed = 15r/min时,若确定arr为199,则psc为449
# c& V$ k$ \( L" B. T. u1 }其他速度可根据需要自行设定。
0 k4 A. c E4 \6 {
6 j" D" K. k7 i% e% {
$ q# m! o* c! o' A7 `代码& Q. `# ~; ^# J: k: O7 s
编写流程:TIM4配置 -> DIR对应IO口配置 -> main调用初始化函数并设置占空比
. q* U2 _) a' U+ H4 a/ H5 B, e& ^+ Z+ k @4 I2 f
/ O3 t* R( P7 _- v) {( e- //TIM4配置8 q1 e5 v1 P3 w/ W. g3 v/ G4 j2 x
- void TIM4_PWM_Init(u16 arr,u16 psc) //初始化arr=200,psc = 450得到电机速度为15r/min" V- t: R/ [1 y, N/ R( M
- { % n9 D# [) J1 \$ d- U+ R
- //初始化结构体, z3 w* S' {: u# T
- NVIC_InitTypeDef NVIC_InitStructure;
% o2 s2 F. i6 Q - GPIO_InitTypeDef GPIO_InitStructure;' t! j0 o/ y+ K. g$ }" F9 u
- TIM_OCInitTypeDef TIM_OCInitStructure;( }+ y2 }! q. d) W) K
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
5 L- ?2 \" A. q% n - ! w3 N2 e& l9 a* V, c( M N
- //使能时钟3 L. [) f; @ }* Q+ O7 J
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);3 @& Q* w b& M
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); + ]5 ?0 w% K9 K7 W0 V7 P2 ]( n
- 8 _" \8 @4 e/ m, `1 a
- //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.63 l8 e$ f% {3 W* W4 I% X
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM4_CH1% ^0 }/ K" g; ]6 ~' @
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; " t' q% ?$ Q& Z% V
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- h6 X5 @+ I. I$ L. N - GPIO_Init(GPIOB, &GPIO_InitStructure);
( L: P( F' K0 s* C! {. r) f - //计数模式
/ o) \; R: r, ]+ L6 l W$ A" r - TIM_TimeBaseStructure.TIM_Period = arr;
* I$ q# k5 j: Y! A1 g& i0 P/ L1 d - TIM_TimeBaseStructure.TIM_Prescaler =psc; 4 h) j. v+ F7 P
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;/ o) |" @: ?- w* v8 J3 C* p
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 3 A4 G3 V$ ^2 G: K; v
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 4 m* ~2 G( h# C' ]3 r
- ( x8 Z9 U8 k } A) ]+ E9 T
- //定时中断配置
- j p* v* t2 Q1 X3 t1 k) O# p - TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); /* K! f: @0 H( R& p5 K# }
- NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; + B* f& G5 \' C: x# g; u/ ~# H9 s
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
; V' G; s: r. g( o6 Q - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ) p4 {; ?* Q+ y- N' }: j5 b
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; # p( t# \/ |" R* {0 q
- NVIC_Init(&NVIC_InitStructure);
; a* N1 i: O% s: U0 t2 J. T
+ Z' K1 i7 V8 f' o- //初始化TIM4 Channel1 PWM模式
+ e8 A6 }2 ]) N r/ t( L/ W: l, O - TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;- i' W7 m# C7 f, z
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; / _! R4 c9 w" \5 n
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
! R; T0 [/ [8 z# H. i( |* J( X& ^+ ]' W - TIM_OC1Init(TIM4, &TIM_OCInitStructure); % ^- d' y( i; k i! [( s3 O
$ I# T8 J7 t- \; p- TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
- A; q+ k, ~; ?2 X( V - TIM_Cmd(TIM4,ENABLE); //使能定时器
3 r* e" b8 Y& F. F0 I - }
; `* o/ y1 r& T4 k% \) G& p+ P: x
复制代码- /*PB5电机方向引脚配置*/
# t+ y9 I3 a6 g. Z8 q$ i - void DIR_Init(void)
: M/ u# X. X0 l* T - {
5 R( v* R: ]8 E! U8 v" Q' H - GPIO_InitTypeDef GPIO_InitStructure;7 Y5 u1 A9 c) h) p$ v
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
6 R- b- ~6 W: F% U - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; . g2 [$ g7 }' U( ^/ t# M$ V/ h
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 2 l. i8 O7 i4 Z$ y" X
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ M7 ~ a6 H3 @ - GPIO_Init(GPIOB, &GPIO_InitStructure); / S" B$ ?/ o! X; b$ y
- }
6 w- E! A' I, F1 i
复制代码- int main()
* W! t6 { g6 P - {' B k( G) H M& d
- DIR_Init();
/ j' o- F4 z; u0 B( O5 M - TIM4_PWM_Init(200,450);
( x1 H! i+ K" ^$ [7 E - TIM_SetCompare1(TIM4,200/2); //设置占空比为50%(=arr/2),不设置的话电机启动不了
% ^! _) y/ @: P* A/ @. F2 b; w - while()
0 Z/ W [) N# @' N* X - {: A' n3 D" l& w$ p, r
- ;
, p0 v/ a8 E) z9 o# I - }- L- L8 Q& \' g+ @9 k* Y' [9 t2 i
- }9 Z, u# A; k' R. u
复制代码 - J0 Z0 t6 {, i% g. Q$ r- p
8 O# ?) x! |9 G/ @; l+ Q1 l9 ^————————————————& E. Q8 G( L; h; H
版权声明:Efic8 V& _3 k6 c& ?2 f) l
# u, i$ H$ x% p5 b* H" h8 V( y
2 l: q* q, D [ \) H+ i" O( S( t |