发一个TIM1输出6路互补SVPWM程序,带死区

2019-07-21 05:39发布

本帖最后由 417400765 于 2017-11-30 11:58 编辑

闲来无事,写了个SVPWM生成程序,MCU选择STM32F030C8,有兴趣的可以一起研究,如果有错误,希望大家指正附件是工程压缩包,欢迎大家下载

int Ua(unsigned int angle)
{
                int sign=1;//char sign=1;
        
                if(angle>180)
                {
                                        angle-=180;
                                        sign=-1;
    }
    if(0<=angle&&angle<60)
                {
        if(angle<30)
            return sign*QUARTER_ROOT_3*cosxFF[30-angle]/CONSTANT_SCALER+128;
        else
            return sign*QUARTER_ROOT_3*cosxFF[angle-30]/CONSTANT_SCALER+128;
    }
                else if(60<=angle&&angle<120)
                {
        if(angle<90)
            return sign*QUARTER_TOT*cosxFF[angle]/CONSTANT_SCALER+128;
        else
            return -sign*QUARTER_TOT*cosxFF[180-angle]/CONSTANT_SCALER+128;
    }
                else if(120<=angle&&angle<=180)
                {
        if(angle<150)
            return -sign*QUARTER_ROOT_3*cosxFF[150-angle]/CONSTANT_SCALER+128;
        else
            return -sign*QUARTER_ROOT_3*cosxFF[angle-150]/CONSTANT_SCALER+128;
    }
}
int Ub(unsigned int angle)
{
    if(angle<120)
        return Ua(120-angle);
    else
        return Ua(angle-120);
}
int Uc(unsigned int angle)
{
    if(angle<240)
        return Ua(240-angle);
    else
        return Ua(angle-240);   
}

void IRQ_SVPWM(void)
{
        uint8_t p=0;//char p=1; //0-Phase voltage 1-Line voltage
        
  PWM_U=Ua(angle)-p*Ub(angle);        
  PWM_V=Ub(angle)-p*Uc(angle);
  PWM_W=Uc(angle)-p*Ua(angle);  
        
  angle+=1;
        if(angle>360)
                angle = 0;
        
        TIM1->CCR1 = PWM_U;//PWMMR1;
        TIM1->CCR2 = PWM_V;//PWMMR3;
        TIM1->CCR3 = PWM_W;//PWMMR5;
}


1.jpg 2.jpg 3.jpg
STM32F030R8.rar (3.01 MB, 下载次数: 1444) 2017-11-30 11:08 上传 点击文件名下载附件



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。