软件: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- /* USER CODE BEGIN 2 */ M; w* R+ t. f& c4 V! X
- MC_StartMotor1();" ?* o8 W8 Y: |( x
- /* USER CODE END 2 */
! M6 r3 p' l; w: E7 ^2 p+ h - /* Infinite loop */0 Y7 {3 z6 q; @7 h2 W* A0 M- _
- /* USER CODE BEGIN WHILE */
, }' O; c* N3 o b6 y - while(MC_GetAlignmentStatusMotor1()!=TC_ALIGNMENT_COMPLETED){}$ w% Q) D' q3 _* P
- while (1)/ B9 Y7 e5 R$ t) o# d/ T
- { J# H; q3 m2 }; R& k' ~
- /* USER CODE END WHILE */8 b5 t4 u/ U9 l8 c8 d" |4 ~3 N+ J
- /* USER CODE BEGIN 3 */
% J' y( W0 g) g5 x - MC_ProgramPositionCommandMotor1(3.14/2,0.1);$ x# L$ o* @& O3 P8 k" V9 Q ]% H
- HAL_Delay(2000);! \4 @* u/ E5 k1 x5 w! D
- MC_ProgramPositionCommandMotor1(-3.14/2,0.1);/ e& x( e( o3 ~
- HAL_Delay(2000);$ k. A4 d* c& l0 l3 G6 M
- }
2 g6 k5 d; d* p4 {7 c# @ - /* USER CODE END 3 */
复制代码 我用起来未成功,修改了电机启动函数的位置、调整了位置控制的时间参数、开启了Z相对应管脚的中断,代码如下:
4 H# E6 T3 O4 P/ n6 m4 [1 P/ ], l- /* USER CODE BEGIN 2 */- |- ?8 L: l6 B" g/ J0 g6 f7 \
- ! B4 P4 E1 J1 Q" }0 S: Q, n
- /* USER CODE END 2 */
: o$ Z$ G) n7 }) E
; `4 C. k; x) e( p- j0 Y% b, l" M- /* Infinite loop */' E- _9 I- f! f# F4 C$ S
- /* USER CODE BEGIN WHILE */$ A0 W; a' s/ {8 K
- while(MC_GetAlignmentStatusMotor1()!=TC_ALIGNMENT_COMPLETED){}
8 J- Y+ @7 d2 U8 W/ \7 S - MC_StartMotor1();
5 l i/ _$ [# g! z - while (1)
( x B4 T( F! d% ^0 ~" k6 I - {
$ B. U# k- j7 V$ L - /* USER CODE END WHILE */
M( k# x# F2 a; y& p, I - $ B3 d5 k; k# Y# W% W# R: s1 u) T6 T
- /* USER CODE BEGIN 3 */
k6 K$ Z' R3 k: W! q - MC_ProgramPositionCommandMotor1(3.14/2,1);9 Y% X8 \' o2 I4 ^% t% I8 v# \
- HAL_Delay(2000);3 b5 h% R. O7 D9 D, V
- MC_ProgramPositionCommandMotor1(-3.14/2,1);. l+ Y0 u/ {0 _1 r1 V# s
- HAL_Delay(2000);$ y" a e* {; w5 i/ N) m
- }
3 H; u1 z' m) c! P9 _3 P2 q - /* USER CODE END 3 */+ @$ R' I2 C$ i0 S8 m N5 L+ o
- }
5 N1 w' p w4 ]8 k
复制代码- static void MX_NVIC_Init(void)
# w( L' U' T7 _! |: Q5 t1 v - {, U, }$ d. L2 t; c: L) y
- /* TIM1_BRK_UP_TRG_COM_IRQn interrupt configuration */
6 ~) d- d o+ {* M - HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0);: x9 q% d) K+ k
- HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);% }3 E5 Q, N4 {( m1 A$ g6 x$ y
- /* DMA1_Channel1_IRQn interrupt configuration */! F0 A: o2 D9 O! d+ S0 A E' [& h d
- HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
& g. C1 e5 c( Q2 | - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
, J; X7 M( X! B- G$ z - /* TIM2_IRQn interrupt configuration */
7 Q& @7 V. ?8 K; y - HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
+ B/ ]6 b" Y- V' V/ [8 a - HAL_NVIC_EnableIRQ(TIM2_IRQn);
- S3 f5 g* V$ x- Y - /* USART1_IRQn interrupt configuration */
& I/ h, i4 i/ O$ T6 a - HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);
) H' H/ h; ^/ \) |, y& `9 h3 z - HAL_NVIC_EnableIRQ(USART1_IRQn);
6 i6 i1 {" a ^* ^9 ~9 g o7 W - /* EXTI0_1_IRQn interrupt configuration */
' u) Z7 [% P3 K) O; Q - HAL_NVIC_SetPriority(EXTI0_1_IRQn, 3, 0);
% j ~6 ~- e7 N, n - HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
1 a, b+ k- t* n* n, l/ G2 o5 G - /* EXTI2_3_IRQn interrupt configuration */2 R- D0 G, a% n! {5 _3 Z
- HAL_NVIC_SetPriority(EXTI2_3_IRQn, 3, 0);
! ~/ H2 J: m& ?' G# x - HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);
+ k/ w( F7 C. j$ c - }
复制代码 该位置控制测试程序为电机每隔2s正转到90°位置,然后反转到90°位置,官方给的位置控制时间为0.1秒,我在我的电机上响应跟不上,这个可能和整定的控制器参数有关,由于是测试位置控制模式ok不ok,所以把时间改为了1秒。最后上视频:
4 p" A. a+ I: ]7 y7 Z5 _
( X+ Z& s# U. O: a) \- H! U* @ |