概述
' _6 f/ A+ h' X; D正在做的项目需要用STM32控制步进电机,本篇主要讲解利用STM32定时器外设输出脉冲来控制步进电机转动。: X0 H* y6 Y3 H |! z4 K0 _; `8 e. k
( m" p- R6 ^+ l0 n7 ~3 vSTM32定时器/ T% A6 a, @! R) z
使用STM32芯片类型:STM32c8t6。
* c2 {# ?( @$ ~) w) ?, o* l, H) n
# D3 O6 P( z4 f
! Q: I/ r1 n2 t5 O0 H" j6 g3 T3 M+ O
使用外设接口:选用TIM4的CH1通道,对应输出脉冲IO口为PB6。
4 n* _5 S+ L, F ^
9 a$ z* B, R& g+ O7 T
1 X8 Y* \0 h8 Q8 Y) ^5 I' m
/ r# p9 I2 ?$ k7 C2 b) ^, r! f* W9 |( S
# q3 ^4 a" \" v) e步进驱动器介绍
! n/ V% s+ t* x3 ?1 i3 q: w(这里以两相步进驱动器为例,详细见说明书)
+ H3 W# {7 N2 d% f' c8 K, g( l, H* n
接口' X! f/ t4 u7 y' a7 v, N
步进驱动器可分为两部分:环形分配器、功率放大器。
" Z+ D9 M+ W0 _5 b* C, M环形分配器:接收3种信号分别为:脉冲信号(PUL),方向信号(DIR),脱机信号(ENA)。
: Q8 z! ^3 `* L( N$ r0 z% Q脉冲信号:环形分配器对脉冲信号进行分配,去控制功率放大器相应的晶体管,使步进电机的线圈得电。所以,步进电机要运转就必须有脉冲输入,所以需要一个驱动器来给步进电机的各项绕组依次通电。
: i0 N6 w, r8 j方向信号:控制AB通电的相序,A-B顺时针,B-A逆时针
$ H$ F0 v# N1 Y+ @# F脱机信号:步进电机停止时,AB线圈有一相得电,得电的功能使转子锁住,使转子不能动,需要收去拨动转子的时候,需要给脱机信号,使AB相绕组完全断电,转子处于自由转动状态。(也就是说控制电机停止除了不给脉冲之外,还可以控制脱机信号来锁死电机,此处用不着脱机信号)' G" S' Y" [% _; X6 Q4 e6 E$ W2 O# z. ~
2 H# N8 d: i P& y2 n- r/ `
) z' {# V, D9 k# a
* Z* W m7 x/ N4 k
细分
" X1 M& I$ L! s4 {( M为了提高步进电动机控制的精度,现在的步进驱动器都有细分的功能,所谓细分,就是通过驱动器中电路的方法把步距角减小。比如把步进驱动器设置成5细分,假设原来步距角1.8°那么设成5细分后,步距角就是0.36°。也就是说原来一步可以走完的,设置成细分后需要走5步。一般步进电动机的细分表在驱动器上可以直接看到。(设置合适细分能够避免电机转动时震动过大,但过高的细分数会导致电机输出力矩减小)0 l' X4 W% I' |1 ?1 g
V8 M3 H) j) |/ p* s/ Z& b
+ P( H* Z0 w' b) n4 m( r9 {# ^( d* \
驱动电源:
$ j1 X7 t5 J' b, w/ H需要9-42V直流电源,需要使用变压器将220V交流电转为24V直流电
1 g+ ~6 l4 S) Q. H0 r( c" ~: f# P9 I7 `6 G$ A0 E- T
$ q3 v% Q- s% A6 l) P
+ ~0 x# v R6 ~定时器频率与步进电机的关系
# P1 w, @- \ z$ y' {7 T+ F; E接线6 ^5 ^/ G' l: {# U/ d3 Z u
将驱动器PUL+端接入STM32输出脉冲的IO口(PB6),PUL-端接地7 a' S. Q3 v9 G: H- y
将驱动器DIR+端接入STM32的任意一个闲置IO口(这里选PB5),DIR-端接地. C) u* p5 ~3 i$ S/ L
驱动器ENA±端不接
& @/ t3 M! V- xA+、A-、B+、B-接入步进电机
0 g* }7 W+ M1 R& R" a# C电源接到变压器% a: F" d, W2 N* T# G% {0 F
# `# c7 B2 F3 [ Z2 m
! Q. s, R' V/ Z. R" c0 S* b7 }频率与速度的关系
# q5 c/ r0 D, I4 Q2 h5 {* z确定输出脉冲频率与电机转速的关系,对于两相步进电机而言:
2 N, ]: h4 Z. ?6 t' |转速 = 脉冲频率 * 60 /((360/T)*x)7 n% x, F- ?8 Z: w' ?1 [
T是步进电机步距角(1.8°),x是驱动器细分倍数(16), J* Y2 }& n% o, i: g" ]$ e- o
脉冲频率= 时钟频率(72Mhz)/ ((arr+1)*(psc+1))
) e1 i( D, I& W( P% ^& Z! U" v根据以上公式,可以得到:
* f$ O! f+ r) C3 |9 FSpeed = 15r/min时,若确定arr为199,则psc为4498 l! Y G& F$ W" F' m1 P. s+ \
其他速度可根据需要自行设定。
$ L5 G) p% S! f5 v, B
2 Q5 t3 `6 F) |) ~
: K$ G/ S! R- G( Q$ s3 c0 w; s代码
2 ?, z1 B+ R. `; ?1 L% ]. S' J" T. O& d5 o编写流程:TIM4配置 -> DIR对应IO口配置 -> main调用初始化函数并设置占空比
$ X( y C: Y2 S5 z4 G- b2 K/ s: t6 W- p8 s
2 w; K2 l! R* y$ Y- I2 Z5 {- //TIM4配置; D) ]0 L9 O& W* S7 W- P
- void TIM4_PWM_Init(u16 arr,u16 psc) //初始化arr=200,psc = 450得到电机速度为15r/min& [% f8 [+ D6 I4 @0 A3 Z
- {
* a" t$ p$ L3 X - //初始化结构体# f; g) F! `, O$ X5 {
- NVIC_InitTypeDef NVIC_InitStructure;# Q0 x. d5 [9 ^2 O
- GPIO_InitTypeDef GPIO_InitStructure;' e, F: p# A) P- N' v
- TIM_OCInitTypeDef TIM_OCInitStructure;
; E* f6 m9 O' [7 N* a4 I- k, F - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;- \) e/ Q7 G0 j* Q. U9 o: L; t) F
-
# p4 r0 I5 ^# H% M9 W( p - //使能时钟3 J0 @; a" ^( R) i$ I# `
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
, I- h' C5 W, T% g5 r- X - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); ! K8 Z4 C3 D1 f* q
- ; R; @5 Q" p& D% z5 i3 @& i* R
- //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.6- {$ z8 B1 @. F7 ?. s4 e0 ^
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM4_CH18 u O$ r- Z3 w* p; ?1 e. H( D, f
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
' a+ Q' W( y- _; Y4 I, b$ I - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
# }, f$ s9 k9 Z. e0 |4 Z - GPIO_Init(GPIOB, &GPIO_InitStructure);: e2 ^0 }/ @& P9 M+ `
- //计数模式: r- V4 i. X7 [& k, |
- TIM_TimeBaseStructure.TIM_Period = arr;
5 M( A N- W G% ]5 j - TIM_TimeBaseStructure.TIM_Prescaler =psc;
! ~8 N( e6 k# @: o+ z" q. d - TIM_TimeBaseStructure.TIM_ClockDivision = 0;$ A. Y- `& k+ v9 O8 d. \4 D1 [! K! r4 b
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; * Z5 G' o( A3 n! k, `8 I: D& U/ M
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
5 \! n, z2 |2 y) Y! ] Y -
) a9 L- A ]- {* p a1 D - //定时中断配置( d5 K5 t2 T3 T* B+ \8 Y0 g
- TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); /
8 E' T- w* @ h$ B k% k: Y$ [ - NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; + I* O. g7 c8 h' p3 N1 B
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; . A. d- V: O& ~3 I' Y, j2 p1 P, j, a
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ) N+ T" }) V/ g1 n. f
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; & m9 [- d# x) C
- NVIC_Init(&NVIC_InitStructure); * ~4 t' L) U- V3 U! @& y
- " B0 R- R% w" g: e5 K0 y" E4 ^
- //初始化TIM4 Channel1 PWM模式 - \- c: T7 X& H( ]4 O
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
$ q% d# @1 o4 e, R# g6 z- F# s" C - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; d6 e" B. L+ [1 Q# ]
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
* m4 E1 ^$ P* N" n0 s `( i$ ? - TIM_OC1Init(TIM4, &TIM_OCInitStructure); ' o7 e% j& Y5 \8 D7 f+ K
9 b% w8 P7 R4 X# b( L5 L+ q6 ^9 Y- TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); 2 w/ a u( G/ K
- TIM_Cmd(TIM4,ENABLE); //使能定时器
1 Z G, U" @" `5 [ - }
% d" n3 v% T, C$ Z+ M% r0 Y2 X8 M
复制代码- /*PB5电机方向引脚配置*/0 Q4 p( g$ Z6 L9 ~, c6 m
- void DIR_Init(void)
- D) T3 f+ y- C# c2 V - {
- t1 V; ^- l0 }1 G4 u, t - GPIO_InitTypeDef GPIO_InitStructure;1 N7 T* J/ Q8 K: z6 b) z- t
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
5 O, i. f I8 v. ]- N1 p6 ?* k6 N o - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; ; C0 @5 @! g( f9 o0 O; q# d. w
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
4 I7 _0 N0 L% ^% R - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; & x9 H( o* O: O( Y' t6 o( B
- GPIO_Init(GPIOB, &GPIO_InitStructure);
; |& f7 y( b8 f6 m, P9 p" s - }
8 i7 U/ T5 A! I' M9 S
复制代码- int main()
) _* R, E" `% f$ h - {# P& I- D1 i1 C9 y @
- DIR_Init();
+ Q" R v ?% r4 K) _ - TIM4_PWM_Init(200,450);! o+ y& l; L% W+ j8 G
- TIM_SetCompare1(TIM4,200/2); //设置占空比为50%(=arr/2),不设置的话电机启动不了
5 R- k+ c$ d+ N# | - while()1 K' ~7 x$ r8 B9 v- z, f2 j
- {, K6 |# ]* k1 ^( h5 B0 i/ ]
- ;1 u& q* [ z' D
- }, u9 j( L" m- L9 F: h5 T- ~- x
- }
2 Z( b. m5 a/ V* v( N9 x3 V
复制代码 . |, e# N2 e9 l2 B. H
' ?1 s% N- O7 H————————————————
% `, n8 q& g# e, {1 d版权声明:Efic8 k, t; a! P: H; M% o/ O7 d0 k
! `4 N( m" ~" X# p- z- g
/ c- }! \# o) P% i3 _
|