TI程序PMSM3 - 1心得 - 图文

发布时间 : 星期五 文章TI程序PMSM3 - 1心得 - 图文更新完毕开始阅读

心得1:

在主程序中有rc1.TargetValue = _IQ(SpeedRef);rc1.calc(&rc1);这两条语句。

rc1.TargetValue是rc1这个结构体中的变量。从TI网站上下载的pmsm的例程中,初始化在头文件和主函数的开头。 接着在 Include中找到了 rmp_cntl.h这个文件。有以下 typedef struct { _iq TargetValue; // Input: Target input (pu)

Uint32 RampDelayMax; // Parameter: Maximum delay rate (Q0) - independently with global Q _iq RampLowLimit; // Parameter: Minimum limit _iq RampHighLimit; // Parameter: Maximum limit (pu)

Uint32 RampDelayCount; // Variable: Incremental delay (Q0) - independently with global Q _iq SetpointValue; // Output: Target output

Uint32 EqualFlag; // Output: Flag output (Q0) - independently with global Q void (*calc)(); // Pointer to calculation function } RMPCNTL; 结构体 ,搜索RMPCNTL,有以下

In file C:\\tidcs\\DMC\\c28\\v32x\\sys\\pmsm3_1_281x\\cIQmath\\src\\pmsm3_1.c ... Line 103: RMPCNTL rc1 = RMPCNTL_DEFAULTS;

这样 rc1就被定义为了一个结构体。 rc1.TargetValue = _IQ(SpeedRef);就是给结构体中的TargetValue变量赋值 SpeedRef。 再搜RMPCNTL_DEFAULTS;有以下

In file C:\\tidcs\\DMC\\c28\\v32x\\lib\\dmclib\\cIQmath\\include\\rmp_cntl.h ... Line 32: #define RMPCNTL_DEFAULTS { 0, \\ 40, \\ _IQ(-1),\\ _IQ(1), \\ 0, \\ 0, \\ 0, \\

(void (*)(Uint32))rmp_cntl_calc }

也就是对rc1进行了初始化,看最后一行,把(void (*)(Uint32))rmp_cntl_calc赋给了void (*calc)(); 那么void (*calc)()就指向了函数(Uint32))rmp_cntl_calc, 在主程序中rc1.TargetValue = _IQ(SpeedRef);的下一条是rc1.calc(&rc1);这条语句,就等同于调用了(void (*)(Uint32))rmp_cntl_calc这个函数。

在函数rmp_cntl.c中,首先有 void rmp_cntl_calc(RMPCNTL *v)这条语句,因为RMPCNTl *v是结构体型形参,所以赋rc1的首地址给它,这样在rmp_cntl_calc函数运行时,v.xx即是调用了rc1初始化时的变量,从而完成整个程序的执行。 其他程序由此类推,所谓一通全通。

心得2:

在利用TI例程 调试电流环 转速开环的时候,用的是光电编码器,当给speedref=0.2 也就是600转的时候,为什么在CCS变量窗口无法显示电机的转速呢?此时电机正常旋转,但是在CCS上就是无法显示电机转速?

ccs 的观察窗口有很多局限性,建议自己用串口把数据发出去,再弄个上位机软件监控

心得3:

PMSM3_1中,需要对3相的相电流进行采样,而在实际系统中,相电流并不是直流信号,而是近似正弦的信号,所以在一个周期内,电流肯定有正也有负。但是2812的模数12位采集器是单极性的。怎样通过把一个双极性的信号用单极性的AD采集,并表达成相应的12位数字量,这个问题值得我们思考和讨论。另外我也讨论了SVPWM的转向问题。 虽然德州公司的PDF技术文档已经介绍了相关的解决方法,但是应该还有人不大能够理解。 详细内容见pdf文档。 PMSM3_1 中,需要对 3 相的相电流进行采样,而在实际系统中,相电流并不是直流信号,而是近似正弦的信号,所以在一个周期内,电流肯定有正也有负。但是 2812 的模数12 位采集器是单极性的。怎样通过把一个双极性的信号用单极性的 AD 采集,并表达成相应的 12 位数字量,这个问题值得我们思考和讨论。

虽然德州公司的 PDF 技术文档已经介绍了相关的解决方法,但是应该还有人不大能够理解。 解决这个问题,一般要做好两个方面的工作:一,硬件;二,软件。

硬件上,由于一般采集过来的信号是双极性的,最大范围是-a~a,这样 AD 是无法采集-a~0 的数据的,为了做到顺利采集,我们可以让电流为 0 的时候,输出电压是 1.5 伏特,而当电流为-a 的时候输出电压是 0,这样我们必须调整信号范围,一般是采用运算放大器和直流电源偏压的办法做到的。可以令 b=1.5+a/2,这样 b 的范围就是 0~3 伏特,符合 2812 的AD 要求。

软件上,参考德州公司的技术文档 ileg2_dcbus_drv.pdf,对采集过来的数字进行异或运算,这个计算设计的很巧妙,绝对出自经验丰富的程序员。

为什么说他做的巧妙呢?原因就是这样的计算很简单而且效果也很好。大家学过单片机的都知道,为了表示一个有符号的整型,我们用的是 int,对于 PMSM3_1 而言,当定义int16 的时候也就意味着这个数字的最高位是符号位,其他的位才是数字位。另外负数的数字位是通过求反加 1 才得到的。

对于采集过来的 12 位数据他们的范围是 0000~FFF0,但是这个数字实际上是无符号的,当我们进行了异或运算之后,我们会发现得到的结果恰好就是以负数为补码形式表示的有符号数字。

请看一下,当同 8000 异或之后,原来的 1.5 伏到 3.0 伏的范围变成了 0000~7FF0,这个范围就是正数的范围,也恰好对应输入的 0~a 安培的电流。另一方面, 0~1.5 伏对应的是8000~8FFF,相应的电流是-a~0 安培。需要注意的是, -a 虽然是最大的负电流,但是他的数字位却是 000,是最小的。因为负数的表示是求反加一的计算,而不是仅仅符号位的改变。

心得4:

关于TI的pmsm3_1在低速应用中的一点看法 :

昨天在虫虫的提醒下,仔细分析了一下pmsm3_1中角度及速度解算的算法,若电机低速旋转的话,会有什么问题呢?

在算法中用的是M法测速,若想改其中的算法用测T法,则每一个采样周期必须有一个机械角度增量来进行PARK/clark变换的角度引用;在算法中的角度解算为20k的频率(即采样周期为0.00005s),即每秒至少20000个机械角度增量(F=20000Point/s);这里假设最低转速为Vmin=6°/s(即1r/min),则每度必须至少细分的点数为F/Vmin=3333.3 Point/°,换算到1圈360度则至少需要增量编码器保证1199988线的精度。买这么高精度的增量式编码器好像很难做到吧。

所以这套算法要想用在低速领域,必须改写算法,大家想想应该如何改这个算法呢?我初步的想法内部采样周期还得用阶梯波模拟正弦波,这样就会有个疑问,永磁同步电机在如此极低速的时候,机械惯量的动态响应与电气的动态步进响应(即电脉冲)比已经很接近,甚至

大过电气的动态步进响应,也就是说永磁同步电机是在不超过最大转矩下,基本不会失步,类似于自控式PMSM,那样的话加速度闭环有必要么? 如果对电机运行效率不要求的话(不去调节Id=0),我直接让电机工作在LEVEL3模式下,电机只加虚拟的电流环(不需要实际的电流测量电路,但让A/D工作,只要保证Ia=Ib=Ic=0),然后给定固定的IqRef,保证电机有最大的出力;在精度极高的阶梯波模拟正弦波驱动下,电机就可以稳速旋转..... 我这样分析不知对不对?还望大家不吝赐教。小弟谢过了

(可能我还没有完全理解你所说的事情,不过我觉得测T法还是值得尝试一下的,因为m法不适合低速测量。另外,改写算法也不是一件很简单的事情,可能要耗费不少时间,你要考虑好了。我的建议是你能不能把测T法的PWM周期适当延长,因为有时候电流环的采样周期也是要根据实际情况而定的,要综合考虑很多因素,不知道这样能不能达到你的要求?我昨天和一个熟人聊天,他就说id=0是应该能调的很好的,你的id=0无法顺利调试很可能就是因为定位的精度不行,而造成一系列震荡。而不是pid参数的问题。)

心得5:

编码器如何与QEP电路结合来启动pmsm电机:(F280x PMSM3_4:3 相、含传感器、PMSM 的定位控制(使用 QEP))

1、在TI 的PMSM3_4中有一个设定QEP的变量 qep1.CalibratedAngle = -1250; 这个是什么意思?

这个是校正角度,对PMSM而言,定位完成后,qep1.CalibratedAngle=0;旋转磁场与励磁磁场保持90度,编码器此时的角度为0,电机可以正常运转。

如果把z脉冲当做起始位置的话,那么得到的结果是不加CalibratedAngle的。但是z脉冲未必与A相轴线重合,而如果以定子A相为基准的话,那么就必须加上一个偏置量。那么偏置量是实验得到的,而非可以计算得到的了。 编码器安装时,不太可能正好是某相反电动势的零点位置。所以都需要测量下CalibrateAngle的。

2、在TI所给的例程中,其中当index转一圈后,T2计数器重置为0,且p->IndexSyncFlag = 0x00F0; 这里对于IndexSyncFlag (索引同步标志)设置为240°(00f0的十进制)。为什么要将这个IndexSyncFlag设置为00f0?

3、PMSM矢量控制中,用增量式光电编码器进行位置检测时,需要编码器的z脉冲与电机a相绕组轴线重合来作为转子位置的电气0度,那么我应该怎么样来确定他是否重合,即怎样来确定电机起始位去啊?

4、也就是光电编码器安装后,z脉冲与电机a相绕组轴线还是存在一个偏移,这个校准角应该怎样测量出来呢?

5、一篇《关于复合式光电编码器的永磁同步电机启动方法研究》指出了增量式编码器ABZUVW的用法,主要是解决永磁同步电机在转子位置信息未知的情况下启动的问题。文章中介绍说电机转子的磁极零点要与编码器的Z脉冲信号对齐(把z脉冲当做起始位置?),电机才能启动。磁极零点是什么意思?为什么需要对齐(什么原理)?有什么方法可以使得磁极零点与Z脉冲信号对齐?

综合以上其实就是一个电机的启动问题,如何结合我们现有的编码器和DSP的qep电路来解决?

心得6:

关于TI的PMSM3_1程序里的pid模块程序的理解:

在TI的PMSM3_1程序里的pid_reg3_calc函数给了如此算法: v->Out =Kp*(e(k)+Ki*e(k)+Kc*e_staerr(k)+Kd*(e(k)-e(k-1))) 这属于什么类型的PID算法,又如何理解其中的Kc-积分校正参数?(有pid_reg3.c;pid_reg3.h)

对于其中的源代码见:void pid_reg3_calc(PIDREG3 *v)

以前没有专门研究过这个算法,建议你可以看看那本讲PID仿真的书

我个人的观点是,这个积分校正参数主要作用是为了削弱积分的饱和作用,当你实际计算的积分量很大的时候,往往输出量就进入了饱和区,在深度饱和区系统很难退出来,所以要在输出量很大的时候限制积分的作用。

刚刚我在研学论坛上下了那本《先进PID控制及其MATLAB仿真》. 觉得这个程序可能就是为了抗饱和作用的,虽然在实现上和该书的程序不一样,但是我想作用都差不多,就是让系统不至于深度饱和,这样可以提高可控性。你可以去找找这个书。

心得7:

量值转换和数量统一问题:

众所周知,将控制算法表述成可编程芯片的程序时,首先要解决的问题就是数量的统一所谓数量统一,主要包括如何将传感器传递过来的数据同控制算法的数据统一起来,说得再具体一点就是要让指令量和反馈量的尺度一样,另外一个问题就是:如何让控制器的输出量和功率控制模块的输入量(一般都是PWM)在一个尺度上,这里牵扯到很多值得思考问题。在PMSM 3_1的level5中,需要对采集过来的QEP信号进行计数,然后将这个计数结果一部分用于电流环的PRAK变换(角度量),另一部分用于速度环反馈信号的合成(速度量)。

详细内容见PDF文件。欢迎交流!!

心得8:

由于电流环响应速度快,速度环响应速度慢,所以在编程时在更新20个电流数据之后才更新一次电流数据。(具体表述有待修改)

联系合同范文客服:xxxxx#qq.com(#替换为@)