SVPWM算法软件编程实现

本文是通过软件编程实现SVPWM算法,并将各扇区有效矢量T1,T2,和T0+T7无效矢量作用时间通过DAC转换输出马鞍波,可以更加深刻理解SVPWM算法的实现过程(基于GD32E508芯片)。

1.实现步骤

SVPWM波基波频率设定f为1Hz,旋转实时角度为23.141*t 时间t的步长为0.001,即每隔1ms更新一次旋转角度,1s为一个周期,一个周期1000个采样点
1、移植arm自带DSP库,使能FPU运算;
2、通过给定旋转坐标系直流电压Vd、Vq通过park逆变换得到正交的两相交流正弦电压Ua、Ub;
3、判断Ua、Ub大小判断扇区1/2/3/4/5/6,计算各扇区有效矢量T1,T2 ,无效矢量T0,T7作用时间。
4、各扇区有效矢量T1,T2,无效矢量T0,T7(实则为三相逆变电路三对mos管各下管导通时间,T1+T2+T0+T7的和为SVPWM三角波载波的周期T)。
5、将T1,T2,T0+T7通过DAC转换输出SVPWM马鞍波形(基波和三次谐波的叠加)。

2.软件C代码
2.1 .h文件

#ifndef MAIN_H
#define MAIN_H
#include "gd32e50x.h"
#include "arm_math.h"

/*--------转子磁通两相旋转坐标系----------*/
typedef struct{
    float Vd;
    float Vq;
}voltage_two_phase_rotation;

/*--------定子两相静止坐标系----------*/
typedef struct{
    float Va1;
    float Vb1;
}voltage_two_static_rotation;

/*--------定子三相静止坐标系----------*/
typedef struct{
    float Ta;
    float Tb;
    float Tc;
}svpwm_three_timer;

typedef struct{
    float X;
    float Y;
    float Z;
    uint8_t sector_num;
}svpwm_variable;
/*--------定义各扇区有效矢量T1/T2结构体----------*/
typedef struct{
    float T1;
    float T2;
}svpwm_vector_timer;

#endif /* MAIN_H */

2.2 .c文件

#include "systick.h"
#include "stdio.h"
#include "main.h"
#include "gd32e507z_eval.h"

#define pi 3.142562
 svpwm_three_timer v3_three;
 uint16_t dac_convert[3]={0};
 svpwm_vector_timer v2_timer;
/* park逆变换得到正交的两相交流正弦电压 */
voltage_two_static_rotation voltage_park_inverse(voltage_two_phase_rotation* vi, float angle)
{
    voltage_two_static_rotation v1;
    v1.Va1 = 0.00;
    v1.Vb1 = 0.00;
    v1.Va1 = vi->Vq * arm_cos_f32(angle) + vi->Vd * arm_sin_f32(angle);
    v1.Vb1 = -vi->Vq * arm_sin_f32(angle) + vi->Vd * arm_cos_f32(angle);
    return v1;
}

/* 扇区判断 */
svpwm_variable sector_judge(voltage_two_static_rotation* vi)
{
    uint8_t count = 0,a = 0,b = 0,c = 0;
    svpwm_variable qt;
    qt.X = 0.00;
    qt.Y = 0.00;
    qt.Z = 0.00;
    /* 实际应用中X/Y/Z需要再除以三相逆变器直流侧母线电压值Udc 这里取载波和基波的频率为1:1*/
//    qt.X = sqrtf(3.00) * 1 * vi->Vb1;
//    qt.Y = sqrtf(3.00) * 1 *(-vi->Vb1 + sqrtf(3.00) * vi->Va1)/2;
//    qt.Z = sqrtf(3.00) * 1 * -(vi->Vb1 + sqrtf(3.00)* vi->Va1)/2;
    qt.X = vi->Vb1;
    qt.Y = (-vi->Vb1 + sqrtf(3.00) * vi->Va1)/2;
    qt.Z =  -(vi->Vb1 + sqrtf(3.00)* vi->Va1)/2;    
    if(qt.X > 0.00){
        a = 1;
    }
    if(qt.Y > 0.00){
        b = 1;
    }
    if(qt.Z > 0){
        c = 1;
    }
    count = a + 2 * b + 4 * c;
    switch(count){
        case 3:
            qt.sector_num = 1;
            break;
        case 1:
            qt.sector_num = 2;
            break;
        case 5:
            qt.sector_num = 3;
            break;
        case 4:
            qt.sector_num = 4;
            break;        
        case 6:
            qt.sector_num = 5;
            break;  
        case 2:
            qt.sector_num = 6;
            break;          
        default:
            break;
    }
    return qt;
}

/*----各扇区矢量作用时间T1,T2计算----*/
svpwm_vector_timer timer_vector_output(svpwm_variable* v1)
{
    float T1,T2;
    svpwm_vector_timer v2;
    switch(v1->sector_num){
        case 1:
            v2.T1 = v1->Y;
            v2.T2 = v1->X;
        break;
        case 2:
            v2.T1 = -v1->Y;
            v2.T2 = -v1->Z;
        break;
        case 3:
            v2.T1 = v1->X;
            v2.T2 = v1->Z;
        break;        
        case 4:
            v2.T1 = -v1->X;
            v2.T2 = -v1->Y;
        break;                
        case 5:
            v2.T1 = v1->Z;
            v2.T2 = v1->Y;
        break;                
        case 6:
            v2.T1 = -v1->Z;
            v2.T2 = -v1->X;
        break;                
    }
    return v2;
}

/*------三相逆变器三对mos管各下管Ta/Tb/Tc作用时间 Ta+Tb+Tc的和为SVPWM三角波载波的周期T------*/
svpwm_three_timer three_phase_timer_output(svpwm_vector_timer* vt,svpwm_variable* vi)
{
    svpwm_three_timer v1;
    float temp,value1,value2,value3;
    temp = vt->T1 + vt->T2;
    //设定SVPWM载波频率为1,即调制波与载波的频率比为1:1,在实际应用中载波频率要远大于调制波频率。
    value1 = (1 - vt->T1 - vt->T2)/4.0;
    value2 = value1 + vt->T1/2.0;
    value3 = value2 + vt->T2/2.0;
    switch(vi->sector_num){
        case 1:
            v1.Ta = value1;
            v1.Tb = value2;
            v1.Tc = value3;
        break;
        case 2:
            v1.Ta = value2;
            v1.Tb = value1;
            v1.Tc = value3;
        break;
        case 3:
            v1.Ta = value3;
            v1.Tb = value1;
            v1.Tc = value2;
        break;
        case 4:
            v1.Ta = value3;
            v1.Tb = value2;
            v1.Tc = value1;
        break;        
        case 5:
            v1.Ta = value2;
            v1.Tb = value3;
            v1.Tc = value1;
        break;
        case 6:
            v1.Ta = value1;
            v1.Tb = value3;
            v1.Tc = value2;
        break;
    }
    return v1;
}
//dac 初始化配置
void dac_init(void)
{
    /* enable the clock of peripherals */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_DAC0);    
    rcu_periph_clock_enable(RCU_DAC1);        
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6);//DAC转换通过PA4/PA5/PA6输出
    dac_deinit(DAC0);
    //dac0 ch0
    dac_trigger_source_config(DAC0,DAC_OUT_0, DAC_TRIGGER_SOFTWARE);
    dac_trigger_enable(DAC0,DAC_OUT_0);  
    dac_ddisc_config(DAC0,DAC_OUT_0,DAC_direct_connect_gpio);  
    dac_output_buffer_enable(DAC0,DAC_OUT_0);
    dac_enable(DAC0,DAC_OUT_0);
    //dac0 ch1
    dac_trigger_source_config(DAC0,DAC_OUT_1, DAC_TRIGGER_SOFTWARE);
    dac_trigger_enable(DAC0,DAC_OUT_1);  
    dac_ddisc_config(DAC0,DAC_OUT_1,DAC_direct_connect_gpio);  
    dac_output_buffer_enable(DAC0,DAC_OUT_1);
    dac_enable(DAC0,DAC_OUT_1);
    //dac1 ch0
    dac_deinit(DAC1);
    dac_trigger_source_config(DAC1,DAC_OUT_0, DAC_TRIGGER_SOFTWARE);
    dac_trigger_enable(DAC1,DAC_OUT_0);  
    dac_ddisc_config(DAC1,DAC_OUT_0,DAC_direct_connect_gpio);  
    dac_output_buffer_enable(DAC1,DAC_OUT_0);
    dac_enable(DAC1,DAC_OUT_0);
}
/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    uint16_t num = 0;
    float angle = 0.00;
    float timer = 0.001;
    voltage_two_phase_rotation v1_two;
    voltage_two_static_rotation v2_two;
    svpwm_variable v4_variable;
    v1_two.Vd = 0.00;//设定旋转坐标系的d轴分量为0,实际电机控制算法通过闭环使d轴分量为0,以获得最大转矩。
    v1_two.Vq = 1.00;//设定旋转坐标系的q轴分量为1
    systick_config();
    dac_init();
    while(1){
        if(timer >= 1.00){
            timer = 0.001;//1s转一圈,采样1000个点,每隔1ms采样一次
        }
        angle = 2 * pi * timer;//根据时间得到旋转角度
        v2_two = voltage_park_inverse(&v1_two,angle);//park逆变换得到正交的两相交流正弦电压
        v4_variable = sector_judge(&v2_two);//算法判断当前所处的扇区数
        v2_timer = timer_vector_output(&v4_variable);//计算各扇区有效矢量T1,T2作用时间
        v3_three = three_phase_timer_output(&v2_timer,&v4_variable);//不同扇区,三相逆变器三对mos管各下管Ta/Tb/Tc作用时间
        //三对mos管各下管Ta/Tb/Tc作用时间通过三路DAC转换输出,调制波和载波频率设成一致的目的也是方便DAC转换输出示波器观察,如果载波频率过大,
        //DAC转换输出的值很小,不利于示波器观察。
        dac_convert[0] =(uint16_t)(((v3_three.Ta + 0.0) * 4096)/3.30);
        dac_convert[1] =(uint16_t)(((v3_three.Tb + 0.0)* 4096)/3.30);        
        dac_convert[2] =(uint16_t)(((v3_three.Tc + 0.0)* 4096)/3.30);   
        OUT0_R12DH(DAC0) = dac_convert[0];       
        OUT1_R12DH(DAC0) = dac_convert[1];        
        OUT0_R12DH(DAC1) = dac_convert[2];        
        DAC_SWT(DAC0) |= DAC_SWT_SWTR0;
        DAC_SWT(DAC0) |= DAC_SWT_SWTR1;
        DAC_SWT(DAC1) |= DAC_SWT_SWTR0;
        timer += 0.001;
        delay_1ms(1);
    }
}

3.实验结果
示波器抓取三路DAC输出马鞍波波形,SVPWM基波为1hz:
svpwm基波频率1HZ
示波器抓取三路DAC输出马鞍波波形,SVPWM三次谐波为3hz:
SVPWM载波频率3HZ
Matlab仿真SVPWM马鞍波输出波形:
matlab仿真svpwm马鞍波形
Matlab仿真输出面积等效PWM波经电机感性负责滤除高次谐波分量输出三相正弦交流ia,ib,ic:
三相正弦电流输出
4.总结
各扇区T1,T2,T0+T7在实际应用编程中是给到timer定时器中心对齐模式输出三路互补PWM波的比较值CH1VAL,CH2VAL,CH3VAL,svpwm即为调制波,timer定时器PWM中心对齐模式的三角波即为载波,输出三路互补pwm波作用于三相逆变电路三对mos管可输出和SVPWM面积等效的PWM波(+Ud,0 ,-Ud),Ud为三相逆变电路直流侧电压,再作用于电机,因为电机是感性负载,等效电感L可将PWM波中的高次谐波分量滤除,只剩基波分量,输出相位差为120度的三相交流正弦电流ia,ib,ic。
实际电机应用中,马鞍波只能通过matlab仿真看到,示波器使能抓取三对mos管的pwm开关波形或者经三相全桥逆变电路输出的含有高次谐波、面积等效三相交流正弦波的pwm波形。

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 三电平APF(Active Power Filter)是一种用于无功补偿和谐波抑制的电力电子装置。虚拟磁链模型是一种常用于APF控制的方法。SVPWM(Space Vector Pulse Width Modulation)算法是一种用于控制三电平逆变器的技术。FPGA(Field Programmable Gate Array)则是一种可编程逻辑器件。 三电平APF虚拟磁链模型预测SVPWM算法的研究和FPGA实现是指使用虚拟磁链模型对三电平APF进行建模和预测,进而实现SVPWM算法的研究和在FPGA上进行实现。 首先,通过虚拟磁链模型,我们可以对APF进行建模和预测。该模型基于电网电压和电流的采样数据,通过对电网参数和APF参数进行计算和测量,可以准确地预测APF的输出。 其次,SVPWM算法是一种通过调节逆变器的开关状态,实现精确控制输出电压的技术。借助于虚拟磁链模型的预测,可以在SVPWM算法中引入更准确的参考信号,以实现更精确的电压控制。 最后,FPGA作为一种可编程逻辑器件,可以用于实现SVPWM算法。通过将算法硬件化,可以获得更高的运算速度和实时性。FPGA还具有良好的可重构性,可以根据具体需求进行灵活配置和优化。 因此,三电平APF虚拟磁链模型预测SVPWM算法的研究和FPGA实现,可以提高APF的控制性能和运行效率,实现更好的无功补偿和谐波抑制效果。同时,FPGA实现的硬件结构可以满足实时性要求,并具有较高的可重构性,适用于各种实际应用场景。 ### 回答2: 三电平APF是一种用于电力系统中谐波抑制和无功补偿的双向功率电子器件。虚拟磁链模型预测SVPWM算法的研究和FPGA实现是为了提高三电平APF的控制性能和效率。 虚拟磁链模型预测SVPWM算法是在三电平APF中采用的一种较新的控制算法。它基于虚拟磁链模型来对电流进行控制,通过预测电流矢量在正、负半周期内的变化情况,并根据预测结果计算出合适的开关状态,从而实现有效的无功补偿和谐波抑制。 而FPGA是一种灵活可编程的集成电路,具有高速、高可靠性和低功耗的特点。在三电平APF中实现虚拟磁链模型预测SVPWM算法的FPGA设计可以提高控制速度和精度,并且具有较好的实时性和可靠性。 具体而言,研究虚拟磁链模型预测SVPWM算法需要对其原理进行深入分析和建模,并结合电力系统的特点进行参数优化。同时,需要设计相应的FPGA电路来实现算法的控制逻辑和计算运算,以满足高速的实时控制需求。在FPGA实现过程中,需要充分考虑电路的时序问题和资源利用率,保证控制算法在硬件上的正确性和稳定性。 总结来说,三电平APF虚拟磁链模型预测SVPWM算法的研究和FPGA实现可以提高三电平APF的控制性能和效率,对于电力系统的谐波抑制和无功补偿具有积极的应用意义。 ### 回答3: 三电平apf是一种高性能有源滤波器,可以有效地抑制电力系统中的谐波和失真。虚拟磁链模型是一种通过计算电网电流和逆变器输出电流之间的误差来预测电网电流的方法,从而实现对电网电流的控制。svpwm算法是一种基于空间矢量调制原理的PWM调制技术,通过适当的控制电压矢量的大小和方向,实现对逆变器输出电流的精确控制。 对于三电平apf,通过虚拟磁链模型,可以预测电网电流的波形,并通过控制逆变器输出电流,使其与预测的电网电流保持一致。通过这种方式,可以消除电网电流中的谐波成分,提高电能质量。 在研究三电平apf虚拟磁链模型预测svpwm算法时,需要通过理论分析和仿真验证,确定合适的预测误差计算方法和控制策略。具体包括建立准确的电网电流和电感电流模型,并利用svpwm算法生成逆变器的PWM信号。通过不断调整预测误差计算方法和控制策略,可以提高系统的响应速度和稳定性。 在FPGA实现方面,可以利用FPGA的并行计算和灵活编程的特点,将三电平apf虚拟磁链模型预测svpwm算法转化为硬件电路。通过将各个模块进行逻辑设计和连接,可以实现对电网电流的实时控制和滤波功能。同时,FPGA还可以灵活地进行算法优化和参数调整,使系统的性能得到进一步提升。 总结起来,三电平apf虚拟磁链模型预测svpwm算法的研究及FPGA实现,可以提高电能质量和系统的响应速度。这对于电力系统的稳定运行和谐波抑制具有重要的意义。同时,FPGA的应用可以使系统具备高速运算和灵活配置的能力,为实际工程应用提供了可行的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值