|
本帖最后由 stm1024 于 2018-9-6 17:33 编辑 6 C% k) d+ V, w7 `2 B- o 5 ^: {5 o/ a4 V7 p' [/ y: \: M1 V 任务1要求如下:
4 q/ `4 n* @. K' u5 ~8 x6 S0 n 实现的代码,论坛中的已经有很多例子,我就不再献丑了,主要结合STM32 Motor Control SDK中的说明文档,说一下使用的注意事项。& q* D% V2 Q6 i, { & K4 F( E, ~0 K( p8 T7 \" K# b$ k. C 任务1中已经把需要的函数列举出来了:( Y, R J% i# H1 o 1. MC_ProgramSpeedRampMotor1& b( p) ?7 C' i1 G" F7 P 2.MC_StartMotor1和 MC_StopMotor1 M f) p) K* p0 Y 1.MC_ProgramSpeedRampMotor1) B. h8 @: r, Z9 D& } 先说这个尾巴1.这个控制类库支持两个电机的控制,其实这个在MotorControl Workbench的新建工程中会得到体现:" o5 z( b9 K5 m0 H' V" {
此外,培训的文件中也可以看到:
两个不同的电机可以有完全不同的参数设置,这里我们都使用电机1.8 U) m6 z. I5 q! @5 B* n 函数MC_ProgramSpeedRampMotor1原型:2 t% Z" N+ O. c5 b7 n4 U void MC_ProgramSpeedRampMotor1(int16_t hFinalSpeed, uint16_t hDurationms) ; 作用是“Programs a speed ramp for Motor 1 for later or immediate execution. ”,即配置速度斜坡为以后或立即执行。如果电机的状态是START_RUN或者是RUN,这个函数就会立即得到执行,否则只是缓存该值,直到电机状态是START_RUN或者RUN。0 b. u; h4 W! i$ m3 \ hFinalSpeed:最终速度,注意这个单位是以0.1Hz为单位的,所以,如果要使用3000rpm,这个地方给定的参数应该这么计算:9 Z' B# x2 ]. K5 P 先3000/60,这将得到转/秒,然后单位是0.1Hz,即提供1,则1秒转10次,所以要乘以10,最终应该是3000/60*10=3000/6) T6 {* t# P/ `* F! B 示例中的第一个参数就是这么来的,调用这个函数,需要注意提供的第一个参数必须是目标rpm/6。另外要注意的是变量的数据类型是int16_t,说明可以接受负数,其实就是电机旋向和正方向相反。不过,如果给一个正方向,然后立即给一个反方向,肯定是会在速度几乎为0的时候触发 Speed Feedback故障的,这个在前面的测试中也得到了验证。 hDurationms:由于是 speed ramp,必然有一个爬坡时间,这里就是设置该爬坡时间的,单位是毫秒。手册中提到“It is possible to set 0 to perform an instantaneous change in the speed value”,推测应该是用电机可能的最大角加速度立即提升到目标速度。- _8 N( d+ |1 s" G5 H: ^ % W0 S! W, V) X: h2 ? 2. MC_StartMotor1和 MC_StopMotor1 显然,这两个函数是启动和停止电机的。 对于MC_StartMotor1,需要注意的是,必须在执行前调用以下函数之一: MC_ProgramSpeedRampMotor1() MC_ProgramTorqueRampMotor1() MC_SetCurrentReferenceMotor1() 第一个是转速控制,第二个则是扭矩控制,最后一个功能暂不明白,似乎是把当前参考作为后续执行的参数。# s* G* M: n ` 6 A% j& A( \% s- n& k 停止函数则没有太多的使用限制,任何时候都可以使用。; [6 c# R4 R X! z) W 0 U9 l. z3 N6 P% ?" e9 D! m |
微信公众号
手机版
4 u0 y- g) M5 s; k
关于楼主的帖子有一个地方有不同观点,关于报错触发点,不一定是速度接近于0的时候才产生报错,如果要看故障发生点需要通过更高频率的采样数据(DAC或者Jscope)来查看内部变量的变化情况。1 z8 X" S4 Z3 Q
void MC_SetCurrentReferenceMotor1( Curr_Components Iqdref )这个函数是直接设置dq轴电流的,其实如果把d轴电流设置为0,q轴电流设置为非零值,那么和void MC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms )这个函数的功能就几乎一样了
更新一下,刚才又看了代码注释,有一段是这样的:1 ]! r/ P$ t6 s" C& l) E0 A
可能是我理解的不是太深,或者表述的有问题,估计意思是说速度方向的变换会导致speed feedback error,就是说这只是触发speed feedback error的情况之一,至于出现这个故障的时候,原因不一定是由于方向的改变。