你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32控制启动步进电机

[复制链接]
STMCU小助手 发布时间:2022-12-23 16:00
概述
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
20210322171821742.png ' 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
20210322172633488.png 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
20210322173022165.png
- {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
20210322173713544.png
0 _6 y& J# K' F/ h& a0 a
2 `! 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+ @
20210322173944439.png
1 B$ p2 A* H  n, k
9 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
  1. //TIM4配置8 q1 e5 v1 P3 w/ W. g3 v/ G4 j2 x
  2. void TIM4_PWM_Init(u16 arr,u16 psc) //初始化arr=200,psc = 450得到电机速度为15r/min" V- t: R/ [1 y, N/ R( M
  3. {  % n9 D# [) J1 \$ d- U+ R
  4.     //初始化结构体, z3 w* S' {: u# T
  5.         NVIC_InitTypeDef NVIC_InitStructure;
    % o2 s2 F. i6 Q
  6.         GPIO_InitTypeDef GPIO_InitStructure;' t! j0 o/ y+ K. g$ }" F9 u
  7.         TIM_OCInitTypeDef  TIM_OCInitStructure;( }+ y2 }! q. d) W) K
  8.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    5 L- ?2 \" A. q% n
  9.     ! w3 N2 e& l9 a* V, c( M  N
  10.         //使能时钟3 L. [) f; @  }* Q+ O7 J
  11.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);3 @& Q* w  b& M
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  + ]5 ?0 w% K9 K7 W0 V7 P2 ]( n
  13.           8 _" \8 @4 e/ m, `1 a
  14.     //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形        GPIOB.63 l8 e$ f% {3 W* W4 I% X
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM4_CH1% ^0 }/ K" g; ]6 ~' @
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  " t' q% ?$ Q& Z% V
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    - h6 X5 @+ I. I$ L. N
  18.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    ( L: P( F' K0 s* C! {. r) f
  19.     //计数模式
    / o) \; R: r, ]+ L6 l  W$ A" r
  20.     TIM_TimeBaseStructure.TIM_Period = arr;
    * I$ q# k5 j: Y! A1 g& i0 P/ L1 d
  21.         TIM_TimeBaseStructure.TIM_Prescaler =psc; 4 h) j. v+ F7 P
  22.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;/ o) |" @: ?- w* v8 J3 C* p
  23.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 3 A4 G3 V$ ^2 G: K; v
  24.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 4 m* ~2 G( h# C' ]3 r
  25.         ( x8 Z9 U8 k  }  A) ]+ E9 T
  26.     //定时中断配置
    - j  p* v* t2 Q1 X3 t1 k) O# p
  27.         TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); /* K! f: @0 H( R& p5 K# }
  28.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  + B* f& G5 \' C: x# g; u/ ~# H9 s
  29.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    ; V' G; s: r. g( o6 Q
  30.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  ) p4 {; ?* Q+ y- N' }: j5 b
  31.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; # p( t# \/ |" R* {0 q
  32.         NVIC_Init(&NVIC_InitStructure);
    ; a* N1 i: O% s: U0 t2 J. T

  33. + Z' K1 i7 V8 f' o
  34.         //初始化TIM4 Channel1 PWM模式         
    + e8 A6 }2 ]) N  r/ t( L/ W: l, O
  35.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;- i' W7 m# C7 f, z
  36.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; / _! R4 c9 w" \5 n
  37.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    ! R; T0 [/ [8 z# H. i( |* J( X& ^+ ]' W
  38.         TIM_OC1Init(TIM4, &TIM_OCInitStructure); % ^- d' y( i; k  i! [( s3 O

  39. $ I# T8 J7 t- \; p
  40.         TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  
    - A; q+ k, ~; ?2 X( V
  41.         TIM_Cmd(TIM4,ENABLE);        //使能定时器
    3 r* e" b8 Y& F. F0 I
  42. }
    ; `* o/ y1 r& T4 k% \) G& p+ P: x
复制代码
  1. /*PB5电机方向引脚配置*/
    # t+ y9 I3 a6 g. Z8 q$ i
  2. void DIR_Init(void)               
    : M/ u# X. X0 l* T
  3. {       
    5 R( v* R: ]8 E! U8 v" Q' H
  4. GPIO_InitTypeDef  GPIO_InitStructure;7 Y5 u1 A9 c) h) p$ v
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         
    6 R- b- ~6 W: F% U
  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 . g2 [$ g7 }' U( ^/ t# M$ V/ h
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  2 l. i8 O7 i4 Z$ y" X
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    + M7 ~  a6 H3 @
  9. GPIO_Init(GPIOB, &GPIO_InitStructure);                                                                         / S" B$ ?/ o! X; b$ y
  10. }
    6 w- E! A' I, F1 i
复制代码
  1. int main()
    * W! t6 {  g6 P
  2. {' B  k( G) H  M& d
  3.         DIR_Init();
    / j' o- F4 z; u0 B( O5 M
  4.         TIM4_PWM_Init(200,450);
    ( x1 H! i+ K" ^$ [7 E
  5.         TIM_SetCompare1(TIM4,200/2);        //设置占空比为50%(=arr/2),不设置的话电机启动不了
    % ^! _) y/ @: P* A/ @. F2 b; w
  6.         while()
    0 Z/ W  [) N# @' N* X
  7.         {: A' n3 D" l& w$ p, r
  8.                 ;
    , p0 v/ a8 E) z9 o# I
  9.         }- L- L8 Q& \' g+ @9 k* Y' [9 t2 i
  10. }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
收藏 评论0 发布时间:2022-12-23 16:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版