本帖最后由 toofree 于 2018-9-14 08:47 编辑 & U1 ^/ r5 b, Y8 x: B 【STM32电机培训】——4、任务2电机设定程序修改PI参数 7 u3 c& u+ K. `; w2 N( b3 a! ]$ j5 o% e" _! h6 K 任务目标: 1、程序中修改速度PI参数;% W/ H3 v1 S) C 2、修改为原始值的2倍,在Workbench中观察参数修改后的速度曲线;4 [% [- P3 I3 R4 | Z; @/ p 3、修改为原始值的0.5倍,再次观察速度曲线 4、与原始参数的速度曲线对比 7 q/ | C. \! L) L- k: t6 r( [7 c PPT文档中给出了必要的函数,及变量定义9 M2 F4 ]# j- V- M# b1 V - V; r: n! M- z2 i9 M, @ 8 t* Y' u: N* r0 {. } / N8 d. F" k+ L5 s5 L 这次任务,本人额外使用了NUCLEO-F302R8板上的用户按键。 7 T* x3 p8 y, Y& t" ] 程序是在上一贴基础上,做适当修改。 【STM32电机培训】——3、任务1电机设定速度、定时启动停止; U/ i" N0 ]" y- B6 \! x+ s! s https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617429&fromuid=307297 (出处: 意法半导体STM32/STM8技术社区)2 d( W8 S4 ^6 r5 I" @: V; ] 5 u6 t; E( \2 T" |; ~7 J* G # D4 Z4 y9 p" s1 b! V 在main.c函数开关,增加一个头文件定义“#include "mc_tasks.h"”,并且增加必要的变量及结构体定义。 增加一个外部函数声明“extern MCT_Handle_t* GetMCT(uint8_t bMotor);”,因为在整个工程中,没有找到任何.h文件中声明过此函数。 增加一个内部函数声明“static void EXTI15_10_IRQHandler_Config(void);”,配置中断,PC13中断,即为NUCLEO-F302R8板上的用户按键中断。 : i" @3 a+ c! W3 i! D3 y/ P, i6 q 7 Z& ?! r5 c' p) x; [- U PC13中断配置函数和中断回调函数定义。在中断回调函数中点个板上用户灯LD2,并且对class_cnt全局变量循环赋值,在主函数中要使用变量class_cnt,用作3种状态切换,详见变量定义处注释部分说明。3 F) k; D2 w ~9 F6 h7 N " Y2 f8 W: a$ [- o% O6 ~ 执行外部中断PC13的初始化,配置电机默认速度,读取默认Kp、Ki参数,初始化中间变量tmp_Kp、tmp_Ki。 class_cnt为0时,正常P和I参数;为1时,2倍P和I;为2时一半的P和I。当然参数也可以在Workbench 中手动修改。& r4 z" ~' B0 |# Z, B3 b9 h 每有一次用户按键操作,class_cnt加1,P和I参数设置变化一次。2 n: g- P/ p- s/ x3 B 下载程序到开发套件中。打开Workbench界面,并与目标板套件连接,# ]; E d, T$ t; _' B 在“监控”窗口下,在打开“Plotter”绘图窗口。当电机启动运行后,即可按一次NUCLEO-F302R8板上用户按键USER B1;在下一次电机启动时,新参数将生效;依次类推,每按下一次按键,状态变化一次。' c( l; ~2 j A& { 下图为分别有连续三次按键,所产生的三种状态电机PI参数变化波形。 $ _: A! o( L/ {8 \; K( q+ O 放大原始波形" F2 R3 q; i: m% Q. t* q % C9 U, i) L% {( C' w( { 放大2倍P和I的波形 9 X( P; s% w% n7 l/ E0 t ; Z7 C5 ^1 |! l p: j 放大0.5倍P和I的波形 ( g. B# `& S3 r 也可以在IAR下观察相应参数变量的变化。下图为原始参数. u% W3 Y' R- w& a: \% g 5 f+ Z9 P# I5 D& U8 t 2倍P和I的参数3 G1 _: b: [) n# t! W' F8 g2 C 0.5倍P和I的参数# u, ]" s4 w9 {) h. r' f 至此,在程序中修改P和I参数任务完成。不知道什么原因,我的套件修改电机参数P和I,出来的现象不太明显,相比其他人的。. M F% B; v) H/ ~& k9 F 按照惯例,程序附上:, d: |3 E5 z6 L- o1 q1 C9 ? |
! L: X _; w& A5 a) }4 F E. V: Q
9 O+ q4 n$ ]1 {* x
% M ^$ M! K& U: N) V: b
1500转时,1、2、0.5波形分别如下:
( s+ k! }- i8 s d& m: }
/ Y$ F+ e& B+ h8 @
在文件“stm32f30x_mc_it.c”中4 e% B& @0 ~, Y% u: o' f
. r8 ~! A/ e. z" ^( _' M* [
9 v8 d' N/ Z. G- `
; k& K4 S& T' I; E5 O; e
& i1 V o. l" ^3 \3 u
请问波形图,红色设Speed Reference部分,结合了楼主上个帖子看了一下,应该是与电机启停的操作有关,可是电机停止的话,Speed Reference为什么不在0位呢?
软件生成的代码在电机停机后没有对speed reference变量进行清零操作
感谢回复,初步清楚了