批准英文
心得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
asiafriendfinder
void (*calc)(); favoritegirl // 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, \
beech0, \
0, \
深圳暑假兴趣班 (void (*)(Uint32))rmp_cntl_calc }
好听英文歌
也就是对rc1进行了初始化,看最后一行,把(void (*)(Uint32))rmp_cntl_calc赋给了void (*calc)(); 那么void (*calc)()就指向了函数(Uint32))rmp_cntl_calc, 在主程序中rc1.Target
Value = _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 才得到的。
rectangle对于采集过来的 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参数的问题。)