本帖最后由 子曰好人 于 2018-9-3 23:06 编辑
. t# r% N s# }# k
! }1 i2 U/ a; ]0 _转矩模式任务
( G. x* @+ T2 z, y7 n9 `: h( W, x
! u* S! Z9 V1 y电机库给我们提供了转矩控制的接口函数voidMC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms )。函数第一个参数是目标转矩,第二个参数是持续时间,也就是经过多少时间达到目标转矩。 转矩模式我就自定义为任务5了,代码如下: - int16_t Torque_adc = 0;
/ K& Z! O- }) t% b4 g& u6 Q - int16_t Torque_ref = 0;' M: q* z( b: q" A6 n' R/ v
- void task_5(void)
0 A3 P" |* F+ Q& z B/ F - {$ p; P% a# [5 k9 ~. G
- Torque_adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12);& b8 `5 u1 A% D$ I/ f/ j4 r
- Torque_ref = (5000*Torque_adc)>>16;
( s$ D1 P/ d! Q8 D, F9 E) }+ Y& p) L - if(Torque_ref > 0)
l" I; u3 ]1 E - {" o& _$ k! ]( y7 L0 j0 m
- MC_ProgramTorqueRampMotor1(Torque_ref+900, 1000);
2 e" p# F! m/ r - MC_StartMotor1();) ~6 p+ U5 v$ }9 ]6 {6 A U+ g
- }
! z$ f. u3 D6 a' X7 C - else9 e- L" ?$ y5 B# T5 d7 a
- {' b2 }4 s5 G. a' P5 i
- MC_StopMotor1();
8 W$ c7 u9 J' @5 v5 a - }
% j- l0 e6 m1 Q6 {9 x$ \/ ? - HAL_Delay(100);
) w$ O+ R' g4 C7 C$ C" x, o! q - }
?1 o& m! B7 m/ @0 [, T; m0 M
复制代码主函数代码: - /* Infinite loop */
% F6 r7 w" g2 r |) R8 m) U4 u' P7 U! T - /* USER CODE BEGIN WHILE */
1 W7 A" X' |! b. m7 R! B, m, X+ E - while (1)
2 o/ ?5 M6 p1 b6 | - {. O: M& P, S4 U! k M3 x7 f2 }
! k5 @' N/ h0 }. X) C- if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin)) m. \0 b8 d0 j0 k( y+ X* ]
- {
3 a, q/ }3 U7 t$ l4 F" ~ - task_5();) ^9 `5 Q8 M' |
- }
N7 H! a! S" |+ V/ I - else
1 O6 h) P2 h3 m: m1 ~ - {
+ A6 v% b- V. n6 `& J) }# y - MC_ProgramTorqueRampMotor1(0, 0);
$ b7 `7 D8 V* x0 [7 L3 o- A - MC_StopMotor1();
5 o' J/ i) k9 {! ? - }
& ]! i. m& R" F- [7 N9 U - realspeed = MC_GetMecSpeedAverageMotor1()*6; j' y- L# y- w& O) ~8 X
- /* USER CODE END WHILE */4 J% C g0 l8 y4 W2 @( w( O @
- - Q2 D: k3 Z# x* l) N/ c, }- R- ]3 J
- /* USER CODE BEGIN 3 */5 n7 B3 d& a, G3 @' s
0 f+ M) A. M" A6 V+ L5 T- }6 J1 {) ?& W/ h4 \ F2 h0 _
- /* USER CODE END 3 */
, k, d% J. s* d4 }3 o# C9 m
复制代码其中5000是通过任务4测试出来的,900是通过任务5测试出来的,维持最低转速需要转矩参考量给到900。
( H$ m# J- u4 w( Q& v" V2 q# `. @. I2 M
实验现象:
1 e, V) e, p5 Z7 ~8 w% V' b
# p$ T. u; `; J0 I3 _这个任务虽然完成了但是留下了一些疑问,还需要一段时间去深入了解代码所做的事情。
2 t2 C. e) s) E3 t- N
0 z& I0 i. B! K一些疑问和吐槽: 1.在做这个任务的时候,想吐槽一下电机库这个结构体,传指针是对于阅读代码来说不是很友好,另外就是有些结构体写得不够明白,比如存储dq轴电流、电压的这个结构体
( Q5 C7 ^' t6 f" p; z6 \; X- typedef struct
- x6 W5 d2 _0 A, E* |0 G0 w1 N - {
5 M0 q" d) @+ S3 F+ v2 l: ?7 i - int16_t qV_Component1;- c9 p6 e, W1 E& |: g" P) u+ \
- int16_t qV_Component2;
: W) s) V, K' t, k - } Volt_Components;, Z3 r! i0 ^! z4 h9 R7 m- |" g
复制代码从结构体自身来看,结构体由组件1和组件2构成,但是这个在使用中并不能很好的明白组件1和组件2代表的意思,我看到电机库代码中结构体命名都是Vqd、Iqd这种形式,但是按照大家的习惯可能会把字母符号排在靠前的放前面,如Vdq、Idq这种。也许是我涉足代码不够深入,不了解ST工程师的想法,这里仅提出一点我自己的看法。 s4 \4 O8 j( {; V
+ l3 q d1 r+ X: G, R5 Q
1 c" L& Y( w) Y$ _) V& ]2.接口函数注释描述不是很清晰,比如这个转矩模式的接口函数,我不能知道转矩设定值的限制大小或者通过某种算法来获取转矩参考值。好在我仿真任务4的时候可以查看q轴电流设定值的大小。 - o+ w4 c; q# Q% b" G6 U
- ~4 ^) z! q2 `. a0 c3.转矩模式启动的时候速度会有一个过冲过程,通过仿真调试可以看到在启动的时候iq给定值非常大,过一会儿又降下来了,可能是满转矩启动造成的,后面要好好研究一下启动部分的代码了。 9 o" d1 @9 J1 K, n" v. H7 R2 a! G
4.我遇到的关于编译器的问题,不知道是否是因为工程过于庞大,我用MDK5.25进行仿真的时候出现了编译器类似死机的现象,电机套件正常运行,watch窗口里的变量没有变化。我新建了IAR的工程,仿真的时候不会出现这个问题,不知道各位有遇到过没 ( T9 x7 z6 {8 ^1 t! h" B- A, c4 l8 \
1 m' _4 Q% `: m8 S
ok,今天的分享就到这里,欢迎大家留言讨论。
$ ~) t2 S1 f- Y+ Z
, |, a2 G3 h# M- O5 Q) o" u, p" C6 a: g: Y# Q; `' u) X6 m
4 r% {8 w: F4 ^! q9 e W6 ^9 i
7 a3 G" g' f, F- c1 b. m# } |
目前没有合适的负载,只能靠电机转轴上的两颗螺钉增加一点负载
不太明白你提问的意思,闭环控制都是相同的构造,pid参数提供给pid函数,比如你写的增量式或位置式pid函数。要实现位置环控制只需要得到当前位置和目标位置,即可通过pid函数调节。* l4 A$ t6 U( A% q2 E" i
) `" Y4 q% Z) E W* c* D5 J
有位置环的电机控制系统一般有三层控制环,最外是位置环,中间速度环,最里面是电流环,越是里面的是环调节速度应该越快
评分
查看全部评分
不好意思描述的有问题,我现在写的是位置式的PID函数,最后PID计算出值是提供给速度环的Idq ref吗
速度环输出才是Idq ref,位置环的输出应该是速度参考值,过程是这样的:角度参考值->位置环pid函数->速度参考值->速度环pid函数->电流参考值(Idq ref)->电流环PID函数->dq轴电压矢量->SVPWM
评分
查看全部评分
好的,谢谢大神
你看ST的培训资料吧,我第三篇帖子就说了整个工程我们需要关心的内容,你没看?分析一下他的状态机画画图就明白了
这个倒没测试过,后面找时间测试一下吧