本帖最后由 yexiachensi11 于 2020-11-2 18:47 编辑
(三)SVPWM实现(上) 懂得矢量控制的原理、六个扇区、矢量合成等概念的话,把SVPWM用C语言实现出来并不难。简单点来说,输入参数是inv clarke(clarke反变换)的输出值Va、Vb、Vc。根据Va、Vb、Vc的正负号判断扇区位置。根据Va、Vb、Vc的大小确定本扇区相邻的这两个矢量的作用时间。
1、驱动层的实现
原理上有两种实现方式:零矢量集中、零矢量分散。而且零矢量集中的方式能够减少开关损耗。但是零矢量分散的方式又能够减少高次谐波。这里我实现的是零矢量分散的方式。
使用TIM1定时器,中心对齐。如下图。

驱动的输入参数就是TIM1_CH1~TIM1_CH4通道的比较匹配值。
2、实现层
首先要澄清的是,PWM的占空比跟SVPWM的占空比不是一个概念。PWM的占空比的值就是每个通道的比较匹配值;SVPWM的占空比就是有效矢量占PWM周期的时间。PWM周期的时候由有效矢量的时间和零矢量的时间组成。接下来的实现步骤就很明确了,实现层就是要计算有效矢量的时间。有效矢量又是由两个矢量组成,那么就分别计算出两个矢量分别占用的时间,再计算每个通道的比较匹配值。3、代码
参考了microChip、ST的SVPWM实现方式,相同的是都把clarke反变换跟SVPWM实现集合到一个函数中实现了。变换阵的系数通过推导都是一致的,区别是符号以及矩阵的列不同。
microChip的clarke反变换阵:
┏ Va ┓ ┏ 0 1 ┓ ┏ Vα ┓
┃Vb ┃〓┃-1/2 (√3)/2┃·┃Vβ ┃ ┗Vc ┛ ┗-1/2 -(√3)/2┛ ┗ ┛ ST的clarke反变换阵:
┏ Va ┓ ┏ 0 -1 ┓ ┏ Vα ┓
┃Vb ┃〓┃(√3)/2 -1/2┃·┃Vβ ┃ ┗Vc ┛ ┗-(√3)/2 -1/2┛ ┗ ┛ 变换阵的不同,影响后面的扇区判断。 目前我实现了三角函数的计算、park、clarke的变换和反变换、SVPWM这几个函数。准备测试一下SVPWM的功能。尤其要注意的是浮点数转换成定点数的Q格式数据转换,以及Q格式数据的加减乘除运算。例如两个Q15格式数据相乘结果是Q30格式,要除以32768,回到Q15格式,再进行加减法运算。 设置Vq = Vd = 60000,θ角从0到65535,即0到2π。在QT上先进行测试,得到的波形如下:
把占空比放大:
扇区放大图:
目前还不确定在硬件上能否推动电机转动,看扇区输出,是一个完整的圈。如果有问题,那么下一章会完全推翻这章的描述。接下来就是在硬件上测试了。
|