本来打算玩一下ST Motor Control Workbench的,可无奈里面内容太多,还吃不透。那就先玩一下官方例程,也顺便在官方例程的基础上修改部分代码,完成一些实验。 % N; m' h: b1 J v1.打开工程。工程在安装目录下C:\Program Files (x86)\STMicroelectronics\FOC SDK\v4.3.0\STM32 PMSM FOC LIB\Web\Project\EWARM。我是用的IAR,用Keil或者AC6的小伙伴可以选择对应的文件打开。 " S$ b- q" \9 Y9 F (, 下载次数: 5) 上传 点击文件名下载附件 3 M8 k/ j$ ?0 h9 U9 Q2.打开后,可以看到工程文件中有几个Project,先编译STM32F30x_UserProject-P-NUCCLEO-IHM001_SINGLEDRIVE。 4 G/ ?2 i( r& I0 m$ G+ w' k: r (, 下载次数: 4) 上传 点击文件名下载附件 * C& Z2 O- |% m2 y% _0 U; w3.编译后,发现有1个错误,从提示可以看出缺少了一个库文件,这时我们发现工程内有一个Project是STM32F30x_MCLibrary-STM32F302_SINGLE_DRIVE,选择这个Project,编译。再切换到之前的Project,编译,就没有错误了。9 t) l2 m9 U1 Z4 A( a" _ (, 下载次数: 2) 上传 点击文件名下载附件 % o. ^" Q) v0 D( H* H- \5 h1 R (, 下载次数: 6) 上传 点击文件名下载附件 (, 下载次数: 3) 上传 点击文件名下载附件 ! ?7 }% Q+ ] h b. z8 S 4.下载到板子上,按板上的蓝色USER按钮,可以控制电机的启动与停止,但是调速旋钮不起作用。查看main()函数,例程只简单的处理了按键控制启停,没有做调速功能。3 ]5 Q7 z! S# A - N( g5 E' Z# ~1 D" F1 Y7 O5.按HandOn的Task 1要求,完成实验。 7 b& p+ W' ~: ~5 p (, 下载次数: 6) 上传 点击文件名下载附件 8 c& R* M- J9 H# J4 V6. 把原while循环,替换成以下代码,下载到板子上,电机按照实验要求,正转5S,停止5S,再正转,如此往复。 ; m1 Y, k' E2 |8 fMCI_ExecSpeedRamp(oMCI[0],3000/6,1000);//--1000ms内加速到3000RPM,3000/6:以0.1HZ作为单位的速度指令 " S2 s8 u" y( w# o7 U while(1) : D/ q# E' V" G5 _. ~" C7 W {) l; H, J( y$ K1 D" n1 x9 p& p9 O MCI_StartMotor(oMCI[0]); //-- 运行电机 ! h9 o1 L& w2 N. i //Delay 5S ' k# z, u/ f8 b TB_SetUserTimebaseTime(10000);% I- R G8 n8 K. |5 n# Y while(TB_UserTimebaseHasElapsed() != TRUE);7 c9 p5 K! Y( }2 k% r MCI_StopMotor(oMCI[0]);//--停止电机 , V& |0 L& g* ]% w4 f //Delay 5S ! p) |, h! |' X- h: L TB_SetUserTimebaseTime(10000);9 o+ z6 [3 ?7 V5 P( F5 [2 \ while(TB_UserTimebaseHasElapsed() != TRUE);* y* t& | i1 _0 {. a } . d6 v) c! B- B7.这个实验比较简单,相关的代码实验要求上已经给出,只要添加到程序中就可以了。延时函数用的是Timebase.c中的。SysTick的时钟频率是2000Hz,所在5S延时值就是10000。% i) o, |' L/ o: H /*** n; o, n0 D3 O+ B Z * @brief Use this function to know whether the user time base is elapsed E G! q, v8 t: p" z; x/ s * has elapsed 8 q5 d8 _" B( \# _4 |- p4 u# x * @param none ( H L D' G# i1 z* A. q# [ * @retval bool TRUE if time is elapsed, FALSE otherwise : r% R/ r3 V8 q; l- V8 V */. t4 |, q4 ?' D+ I6 R bool TB_UserTimebaseHasElapsed(void)! n. G% F! B6 Q @4 W- y { , g1 m" g4 }) _( N4 ?: ^: g9 ~: z bool retVal = FALSE; " W0 F/ e8 y0 R& [- l" F if (bUDTBTaskCounter == 0u)4 H2 R' M- b$ T0 t) P. U6 f { , v6 ~4 a% U) \9 f, _! ] retVal = TRUE;/ v: E) y* t- k! q$ Z! A5 o } ; C1 z2 R/ B' X' E# O return (retVal); ! H/ s, K' b7 a. U& g# y( H}. C+ Q% U, `8 i, d( _! E q& Q /**" D% g# ^/ y4 d- S * @brief It set a counter intended to be used for counting the user time base - r8 O2 }8 B! Y( c" t7 L * time6 o2 E" A ?% ^ j2 [) @5 n * @param SysTickCount number of System ticks to be counted K: ~5 L1 F& ^0 ^7 X3 s * @retval void : x% t% m* E! ]- B( o */ : n$ X1 S2 ?6 i. T1 L/ Cvoid TB_SetUserTimebaseTime(uint16_t SysTickCount) 5 R* w& W9 y; _8 R9 |: k; v, z{9 [$ o$ o# X* }( y$ n! \8 K- A bUDTBTaskCounter = SysTickCount;! m9 m; u! r- J7 ~1 P4 i } & u+ X) q3 H/ t, H, c' y # a; h- g: H% [实验完成。 + l: Y* [/ p6 ?( z: p