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

STEVAL-SPIN3201评估板实现位置控制Position Control(增量编码器)

[复制链接]
Moran_Hansir 发布时间:2020-9-3 10:09
软件:Motor Control Workbench 5.4.3,STM32CubeMX 6.0.1,Keil MDK-ARM v5" L" a, L  C4 U8 P
硬件:STEVAL-SPIN3201 评估板(控制+驱动一体),电机 SCORPION SII-2215-900KV(普通的无人机电机,可视为表贴PMSM),编码器欧姆龙 E6B2-CWZ5G(1020线,ABZ输出)
' b* q2 H6 M. W5 n
5 |$ I) l# H3 N# i( a4 T1 N8 XMCSDK 本来只支持速度控制和力矩(电流)控制,但官方在MCSDK 5.4.3版本中增加了位置控制功能,可详见 Release Notes for X-Cube-MCSDK。位置控制的具体说明在官方 AN5464 文档中。AN5464 给的例子用的是 NUCLEO-F302R8 + X-NUCLEO-IHM08M1 套件,我这里用的是STEVAL-SPIN3201,在实现 位置控制过程中(我们称为Position Control,但在生成的代码中叫做 Trajectory Control,简写TC,即TC类函数),个人总结了几点需要稍微注意下:1 {& c; E+ z1 C2 p- c

- z( M( x7 ^' C1. 目前的固件只支持增量编码器,AB相输出或ABZ相输出均可,目前不支持磁编码器等绝对位置传感器;, l/ s$ u2 a/ D5 t5 J& {

. Q% G) Q2 \9 U5 Z2. 在位置控制模式中,如果用AB相编码器,则电机对齐后的位置为0初始机械位置,如果用ABZ相编码器,电机对齐后会缓慢转动一圈来找Z相有输出的位置,并将该位置作为0初始机械位置;
& D; |6 I# b2 c7 A/ x
9 ~. m0 U( i, E( e6 W3. 在用位置控制模式时,需要整定电流环和位置环参数,在 drive_parameters.h 头文件中;
* _0 R# o+ {' `, \/ ?  I2 C1 T" N' z# b
我用的是ABZ相编码器,在配置好Workbench后还需要在CubeMX中把Z相对应的管脚PA2配置为GPIO_EXTI2,即Z相有输出时会触发中断来标定0初始机械位置。. ]$ V- Y! i6 o# ^
生成工程文件后,还需要修改一下代码,在main.c中,官方给的测试位置控制的代码为:
* E' h8 W2 c4 `# ]8 X
  1. /* USER CODE BEGIN 2 */  M; w* R+ t. f& c4 V! X
  2. MC_StartMotor1();" ?* o8 W8 Y: |( x
  3. /* USER CODE END 2 */
    ! M6 r3 p' l; w: E7 ^2 p+ h
  4. /* Infinite loop */0 Y7 {3 z6 q; @7 h2 W* A0 M- _
  5. /* USER CODE BEGIN WHILE */
    , }' O; c* N3 o  b6 y
  6. while(MC_GetAlignmentStatusMotor1()!=TC_ALIGNMENT_COMPLETED){}$ w% Q) D' q3 _* P
  7. while (1)/ B9 Y7 e5 R$ t) o# d/ T
  8. {  J# H; q3 m2 }; R& k' ~
  9. /* USER CODE END WHILE */8 b5 t4 u/ U9 l8 c8 d" |4 ~3 N+ J
  10. /* USER CODE BEGIN 3 */
    % J' y( W0 g) g5 x
  11. MC_ProgramPositionCommandMotor1(3.14/2,0.1);$ x# L$ o* @& O3 P8 k" V9 Q  ]% H
  12. HAL_Delay(2000);! \4 @* u/ E5 k1 x5 w! D
  13. MC_ProgramPositionCommandMotor1(-3.14/2,0.1);/ e& x( e( o3 ~
  14. HAL_Delay(2000);$ k. A4 d* c& l0 l3 G6 M
  15. }
    2 g6 k5 d; d* p4 {7 c# @
  16. /* USER CODE END 3 */
复制代码
我用起来未成功,修改了电机启动函数的位置、调整了位置控制的时间参数、开启了Z相对应管脚的中断,代码如下:
4 H# E6 T3 O4 P/ n6 m4 [1 P/ ], l
  1.   /* USER CODE BEGIN 2 */- |- ?8 L: l6 B" g/ J0 g6 f7 \
  2. ! B4 P4 E1 J1 Q" }0 S: Q, n
  3.   /* USER CODE END 2 */
    : o$ Z$ G) n7 }) E

  4. ; `4 C. k; x) e( p- j0 Y% b, l" M
  5.   /* Infinite loop */' E- _9 I- f! f# F4 C$ S
  6.   /* USER CODE BEGIN WHILE */$ A0 W; a' s/ {8 K
  7.         while(MC_GetAlignmentStatusMotor1()!=TC_ALIGNMENT_COMPLETED){}
    8 J- Y+ @7 d2 U8 W/ \7 S
  8.        MC_StartMotor1();
    5 l  i/ _$ [# g! z
  9.   while (1)
    ( x  B4 T( F! d% ^0 ~" k6 I
  10.   {
    $ B. U# k- j7 V$ L
  11.     /* USER CODE END WHILE */
      M( k# x# F2 a; y& p, I
  12.                 $ B3 d5 k; k# Y# W% W# R: s1 u) T6 T
  13.     /* USER CODE BEGIN 3 */
      k6 K$ Z' R3 k: W! q
  14.                 MC_ProgramPositionCommandMotor1(3.14/2,1);9 Y% X8 \' o2 I4 ^% t% I8 v# \
  15.                 HAL_Delay(2000);3 b5 h% R. O7 D9 D, V
  16.                 MC_ProgramPositionCommandMotor1(-3.14/2,1);. l+ Y0 u/ {0 _1 r1 V# s
  17.                 HAL_Delay(2000);$ y" a  e* {; w5 i/ N) m
  18.   }
    3 H; u1 z' m) c! P9 _3 P2 q
  19.   /* USER CODE END 3 */+ @$ R' I2 C$ i0 S8 m  N5 L+ o
  20. }
    5 N1 w' p  w4 ]8 k
复制代码
  1. static void MX_NVIC_Init(void)
    # w( L' U' T7 _! |: Q5 t1 v
  2. {, U, }$ d. L2 t; c: L) y
  3.   /* TIM1_BRK_UP_TRG_COM_IRQn interrupt configuration */
    6 ~) d- d  o+ {* M
  4.   HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0);: x9 q% d) K+ k
  5.   HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);% }3 E5 Q, N4 {( m1 A$ g6 x$ y
  6.   /* DMA1_Channel1_IRQn interrupt configuration */! F0 A: o2 D9 O! d+ S0 A  E' [& h  d
  7.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
    & g. C1 e5 c( Q2 |
  8.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
    , J; X7 M( X! B- G$ z
  9.   /* TIM2_IRQn interrupt configuration */
    7 Q& @7 V. ?8 K; y
  10.   HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
    + B/ ]6 b" Y- V' V/ [8 a
  11.   HAL_NVIC_EnableIRQ(TIM2_IRQn);
    - S3 f5 g* V$ x- Y
  12.   /* USART1_IRQn interrupt configuration */
    & I/ h, i4 i/ O$ T6 a
  13.   HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);
    ) H' H/ h; ^/ \) |, y& `9 h3 z
  14.   HAL_NVIC_EnableIRQ(USART1_IRQn);
    6 i6 i1 {" a  ^* ^9 ~9 g  o7 W
  15.   /* EXTI0_1_IRQn interrupt configuration */
    ' u) Z7 [% P3 K) O; Q
  16.   HAL_NVIC_SetPriority(EXTI0_1_IRQn, 3, 0);
    % j  ~6 ~- e7 N, n
  17.   HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
    1 a, b+ k- t* n* n, l/ G2 o5 G
  18.   /* EXTI2_3_IRQn interrupt configuration */2 R- D0 G, a% n! {5 _3 Z
  19.   HAL_NVIC_SetPriority(EXTI2_3_IRQn, 3, 0);
    ! ~/ H2 J: m& ?' G# x
  20.   HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);
    + k/ w( F7 C. j$ c
  21. }
复制代码
该位置控制测试程序为电机每隔2s正转到90°位置,然后反转到90°位置,官方给的位置控制时间为0.1秒,我在我的电机上响应跟不上,这个可能和整定的控制器参数有关,由于是测试位置控制模式ok不ok,所以把时间改为了1秒。最后上视频:
4 p" A. a+ I: ]7 y7 Z5 _
( X+ Z& s# U. O: a) \- H! U* @
赞 收藏 3 评论5 发布时间:2020-9-3 10:09

举报

5个回答
捣鼓单片机的糟老头子 回答时间:2020-9-16 18:09:12
follow模式好用吗
wsl666 回答时间:2020-11-6 16:26:52
厉害
. P5 C& z5 _7 u4 x( e% [9 e
wsl666 回答时间:2020-11-6 16:27:16
厉害厉害, @! K% {, A8 `/ A& t# \4 b2 d
wsl666 回答时间:2020-11-8 21:24:07
厉害+ ^6 |7 Z- Y( u) h" k
Kevin_G 回答时间:2020-11-20 15:08:12
收藏
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版