本帖最后由 toofree 于 2018-9-14 08:47 编辑 【STM32电机培训】——4、任务2电机设定程序修改PI参数 - t0 U" B3 a- S0 c1 H! q* Y( \" z) w" [& v 任务目标:6 ]4 U9 f8 @/ a! z R 1、程序中修改速度PI参数;" u& F. x; ^3 M- K 2、修改为原始值的2倍,在Workbench中观察参数修改后的速度曲线;" M6 z6 G/ D ?% Q, V- p' K& Q' J 3、修改为原始值的0.5倍,再次观察速度曲线 4、与原始参数的速度曲线对比 PPT文档中给出了必要的函数,及变量定义 # q# F' E% Q: ^1 H3 a; l / j4 I6 ?+ g9 ]& g 这次任务,本人额外使用了NUCLEO-F302R8板上的用户按键。 & l; S+ x, D' z6 R 程序是在上一贴基础上,做适当修改。2 Y8 F3 |! p4 Z. c& T( H 【STM32电机培训】——3、任务1电机设定速度、定时启动停止 https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617429&fromuid=307297. E( {7 I6 d. j2 J& z (出处: 意法半导体STM32/STM8技术社区) % I4 \' |5 z4 d 在main.c函数开关,增加一个头文件定义“#include "mc_tasks.h"”,并且增加必要的变量及结构体定义。& g2 Y5 T& V6 x* o5 ] 增加一个外部函数声明“extern MCT_Handle_t* GetMCT(uint8_t bMotor);”,因为在整个工程中,没有找到任何.h文件中声明过此函数。 增加一个内部函数声明“static void EXTI15_10_IRQHandler_Config(void);”,配置中断,PC13中断,即为NUCLEO-F302R8板上的用户按键中断。 , n3 o, P/ O2 j. s4 ~( X 5 c9 n7 c2 d/ Q. H& n PC13中断配置函数和中断回调函数定义。在中断回调函数中点个板上用户灯LD2,并且对class_cnt全局变量循环赋值,在主函数中要使用变量class_cnt,用作3种状态切换,详见变量定义处注释部分说明。 9 _+ D9 W) x$ c0 l m7 ~! {; _ 执行外部中断PC13的初始化,配置电机默认速度,读取默认Kp、Ki参数,初始化中间变量tmp_Kp、tmp_Ki。6 [) T/ |/ ]8 B( W: K % z' u' _3 @( }9 z" a* ~. }* k0 t' A' R class_cnt为0时,正常P和I参数;为1时,2倍P和I;为2时一半的P和I。当然参数也可以在Workbench 中手动修改。 每有一次用户按键操作,class_cnt加1,P和I参数设置变化一次。 2 M' q4 b; G: W/ Q4 {3 Z # t) j- w. `, h 下载程序到开发套件中。打开Workbench界面,并与目标板套件连接,7 S4 m- s, p; U8 ] ' x7 p* z$ `0 r* W [; K ; I8 a$ A; N/ ?2 S2 P2 @$ @# N( A. k 在“监控”窗口下,在打开“Plotter”绘图窗口。当电机启动运行后,即可按一次NUCLEO-F302R8板上用户按键USER B1;在下一次电机启动时,新参数将生效;依次类推,每按下一次按键,状态变化一次。 下图为分别有连续三次按键,所产生的三种状态电机PI参数变化波形。2 H& I& p/ R: l" E. m8 a % \2 O( e7 q1 L# F" \ ! S7 N' l: a1 M+ ] 放大原始波形3 { i, T' k0 k* m, b2 t, x v' K 8 u. R4 ~4 `- g, v& Y 放大2倍P和I的波形3 t5 Z4 }& J' W; u + Y" d/ p/ w; f4 e% @, ^ 放大0.5倍P和I的波形( `. b A: @+ J8 r8 O 5 T: [( Z) w8 ~ 也可以在IAR下观察相应参数变量的变化。下图为原始参数$ [5 Y; V9 d7 ] 0 L1 b; a- S0 x( h: j- Z# \" P 2倍P和I的参数 - T6 a% n3 ?: _ ) H! T$ w0 V4 Z+ U 0.5倍P和I的参数 ) t* w' U# s& \, e 至此,在程序中修改P和I参数任务完成。不知道什么原因,我的套件修改电机参数P和I,出来的现象不太明显,相比其他人的。% k; N) H! p9 W4 k+ r; F! v, a 按照惯例,程序附上:" W0 y. J6 e; t i3 F( _ |
4 E+ V& m, r- W; s
1 E4 A; G% n$ G+ ~6 P0 H
; \/ {4 i7 C) }- c
1500转时,1、2、0.5波形分别如下:2 g( J" R; \1 a# B# r. F; ], g b' R
4 C2 i$ o2 ^1 C
* R9 F; W' ~* b- N' d& x% v4 a
在文件“stm32f30x_mc_it.c”中
4 I9 c, y; J2 s+ s. i
0 A( v. x# v4 n
: Q& E" n e. X7 H" I2 ~
* X ~* q: { G& e+ N7 B/ j
请问波形图,红色设Speed Reference部分,结合了楼主上个帖子看了一下,应该是与电机启停的操作有关,可是电机停止的话,Speed Reference为什么不在0位呢?
软件生成的代码在电机停机后没有对speed reference变量进行清零操作
感谢回复,初步清楚了