看了论坛里面几位同学的帖子,表示晕死,遂淘宝一批零件,自制三相全桥:
好了,那些都是后话了。
先简单讲讲SVPWM:电机内部的三个或者三组定子各成120度角,采用Y型连接(三个绕组的一端连在一起,另外一端分别连在三相电压上)。
这三相电压,可以用一个固定的直流电压配合三个半桥来合成,合成的电压介于0与VDC之间。三个半桥在Y型连接的三个或者三组电磁铁里能够产生最大磁通,也就是能够流过最大电流的状态,有6种,其中3种是某相接VDC,另两相接0;另3种是某两相接VDC,另一相接0。这六种状态产生的合磁场强度相等,分别指向相隔60度的6个方向。
要令电机转起来,需要产生旋转的磁场,这个磁场可以通过以上6个方向的磁场中的某两个方向混合产生。例如,产生指向30度的磁场,就可以用0度的磁场和60度的磁场按照一定比例混合叠加。
设我需要产生的磁场角度在0到60度之间变化(如果在60-120度或者120-180度之间变化,矢量混合的情况是一样的,所以只讨论一种)。
设我需要产生的磁场强度为m,角度为a,则我需要的磁场矢量b在xy平面上可以表示为
b=(mcos(a), msin(a))
或者 b=m(cos(a),sin(a)). 因为m只是决定强度,这里不妨设m等于1,等到求出三相电压之后,我们再把这个m乘上去。
指向0度的磁场b0,设其强度为1,坐标为(1,0).
指向60度的磁场b1,设其强度为1,坐标为(1/2,(根号3)/2).
用b0和b1两个矢量合成我们需要的矢量b, 可以表示为b=k0b0+k1b1,其中k0和k1就是混合比例。
显然,当b=0度时,混合比例k0=1,k1=0;当b=60度时,k0=0,k1=1. 而对应0到60度之间的每一个矢量b,都有一对k0与k1与之对应。
在我的程序里面,规定转动一周为1536单位,每个60度扇形有256单位。所以我可以建立一个长度为256的数组,数组中存储计算好的k0与k1,这样便可以通过输入的磁场角度值,直接得到k0与k1的值。然后用它们分别乘以组成当前角度所在的60度扇形的两条边的两个磁矢量的三相电压矢量并相加,就可以得到用于产生这个角度磁场的电压矢量(这个电压还应该乘以m以决定强度)。
首先,利用excel来计算k0和k1.实际上是对一个二元一次方程(x0k0+x1k1=x; y0k0+y1k1=y)求解。图中的字母关系是:b(x,y), b0(x0,y0), b1(x1,y1)
解得的k为0和1之间变化的浮点数。为了加快在单片机上的运行速度,避免浮点运算,将k乘以255取整(将k从0~1映射到0~255). 注意到k0和k1的数值相对于中轴对称,所以只需存储k0数组.
举例:需要合成角度为299单位(一周1536单位),强度为127/256(强度范围从1/256~255/256)的磁场。首先计算299/256=1,知道该矢量落在6个矢量(0~5)中的1号与2号之间。
然后计算299mod 256=43单位。查表可得:在43单位处,混合系数k0=225, k1=51.
假设1号矢量对应的电压矢量为(0,0,1),2号对应的电压矢量为(1,0,1),则所需电压矢量为(0,0,225)+(51,0,51)=(51,0,225).
再乘以强度127/256,可得(25,0,111).
至此,直接将电压矢量数值作为pwm占空比控制全桥即可。
这个算法使用了两次查表,使用了三次/256,一次mod 256,两次乘法,若干次加法。全部控制在16bit整数运算范围内。
其中/256和mod 256 这两个操作分别用取高8位和取低8位就可以实现,故该算法速度极快,可以在8位单片机上流畅运行。
200字以内,仅用于支线交流,主线讨论请采用回复功能。