目的:学习ST的电机FOC矢量控制算法控制方法 学前准备:! r+ @& {3 t) H 软件:安装FOC SDK V4.3 (STSW-STM32100) 硬件:P-NUCLEO-IHM002套件(含控制板+电机驱动板+电源适配器) % N) K% o M' C; R- r 一、安装ST Motor FOC SDK V4.3,双击即可一直next下去,有些电脑安装不成功,不知道什么原因,知道的大神可以帮忙解决一下,谢谢,现象如下:) M1 \* h$ s# X3 ?, t 二、安装成功后,按照路径:C:\Program Files (x86)\STMicroelectronics\FOC SDK\v4.3.0\STM32 PMSM FOC LIB\Web\Project\MDK-ARM找到此文件夹下的“STM32F30x_Workspace”工作空间,用MDK5打开(如果用IAR的话,请按照路径C:\Program Files (x86)\STMicroelectronics\FOC SDK\v4.3.0\STM32 PMSM FOC LIB\Web\Project\EWARM查找)' c- z: \2 ^6 p4 o 三、打开工程后,会发现有两个project,如下 第一个为电机的驱动库,也就是我们今天要所要使用的电机驱动库,第二个为我们需要添加自己的代码的地方,也就是用户代码,今天我们将在这里添加一些代码来实现我们的一些功能) q# X b. B7 G# [/ i$ P 四、分别编译这两个工程,请注意,第一个编译下面的用户工程的话,会出现一个错误,这个时候不用管,之后编译第一个MC_Libraty工程,编译完成后,再反过来编译UserProject工程即可 五、打开UserProject工程的project下的main.c文件,会有一些ST编写好的测试代码,我们可以将代码直接下载到我们的P-NUCLEO-IHM002套件的控制板中。运行之前,需要按照要求,将跳线帽设置到FOC模式下,即JP1和JP2闭合,J5和J6设置到3Sh一端。然后给电机驱动板供电12V,电机按照要求接上,点击nucleo板上的按钮B1即可实现电机的启动,再按一下电机停止。& t. z9 s: S5 F8 X 六、基于以上代码,我们今天要对此功能进行修改,来完成我们一个小实验,实验目标是实现电机上电自启动,每隔2秒自动调整一下速度,从缓慢启动到最高速度,然后再由最高速度变成停止状态,按照上述流程,反复执行。 七、将以下代码复制到main.c文件的while(1)大循环中 while(1) { MCI_StartMotor(oMCI[0]); //电机启动4 m, ^" F0 `6 R1 T+ l2 T for(unsigned char i=1;i<5;i++) { MCI_ExecSpeedRamp(oMCI[0], (i*600)/6, 1000);//设置新的速度,依次增速; X. G6 l+ K, J! w0 m: q TB_SetUserTimebaseTime(2000);//延时2秒 while(TB_UserTimebaseHasElapsed() != TRUE); ) ^# m0 S0 W, U+ ^& D } for(unsigned char i=5;i>1;i--) {7 k+ n# a6 e* q; B( Z' [ MCI_ExecSpeedRamp(oMCI[0], (i*600)/6, 1000);//设置新的速度,依次减速. x) q$ H. h. l ?4 T6 S; c4 t7 |2 E TB_SetUserTimebaseTime(2000);//延时2秒/ v) i2 R2 ^8 V( s while(TB_UserTimebaseHasElapsed() != TRUE); } MCI_StopMotor(oMCI[0]);//电机停止& B( t8 B* c( \( F0 ]0 p$ E TB_SetUserTimebaseTime(2000);//延时2秒 while(TB_UserTimebaseHasElapsed() != TRUE); 4 G6 _+ q: ?" ?! f; b* g9 { ~; P) r, |, U } `. Y( U, w; l. P # R9 r# u" _9 y 有一点需要注意,TB_SetUserTimebaseTime(2000);延时的是2秒,按照原程序这个函数实现的功能是1秒,为什么这里变成2秒,是因为我在滴答定时器的初始化配置那里SYS_TICK_FREQUENCY做了更改,实现了每1ms中断一次的逻辑(之前SYS_TICK_FREQUENCY值为2000),如下6 J: E8 H( m: f$ m1 e3 U void SysTick_Configuration(void) { /* Setup SysTick Timer for 500 usec interrupts */ if (SysTick_Config((SystemCoreClock) / SYS_TICK_FREQUENCY))' A% @% ~' S/ z/ g { 1 a8 d' A- y% x l+ F9 ~ /* Capture error */ ; _3 l9 A2 v; u9 a6 s while (1);6 l. `5 o! @2 T0 u* K+ Z } NVIC_SetPriority(SysTick_IRQn, SYSTICK_PRIORITY);/ v# i2 z+ c8 e" K NVIC_SetPriority(PendSV_IRQn, PENDSV_PRIORITY);$ s4 y* y& U7 _8 x: r }0 u) c* C) d4 F* J; M, @( K0 X 八、按照上述修改,将程序重新编译后,下载到控制板中,即可看到我们所要达到的现象,即启动->增速->减速->停止->启动 九、感想:此电机库对于想直接上手控制电机的想快速入门的同学变的非常方便,对于我们这些初学者不用太多关注他们内部逻辑的实现,只要调用相关的API函数即可实现我们所要达到的目的,唯一的小缺点就是库的代码量太大,所占的空间较大,如果所选用的MCU空间较小的话,则留给用户使用的代码空间将变得非常少,因此如果后期实现优化,降低代码所占用空间,将大大会提高使用者对FOC电机库的依赖。 9 _/ P0 l$ _- Z$ C$ N( m7 j * M P- o* G7 u- {. b 3 X2 T. y6 q P8 J2 Q" i; b* E: c , N/ s: x$ {9 N/ i- W # R5 d% g* H9 I; p8 U" S- N4 A |
楼主啊,我的程序就不能编译成功。。。 而且多编译几下Keil就关了。。这是什么原因了,给解答一下,谢谢!!! |