<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        SVPWM的查表生成方式代碼

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月28日   【字體:

        昨天研究了傳統的SVPWM生成方法之后 偶然看到了這個東西:
         
        也就是說 SVPWM的占空比-角度的關系可以用分段函數進行表示 這樣就簡單多了
        基本上通過查cos表+判斷能避免浮點數運算 下面素程序www
        結果輸出到3個txt文件中,修改p的值可以算占空比(相電壓)或者線電壓...
        /*
        *    SVPWM program
        *    By Rikka0_0
        *    2014.4.47
        */

        #include <stdio.h>
        #include <stdlib.h>
        #define QUARTER_ROOT_3 433
        #define QUARTER_TOT 750
        #define CONSTANT_SCALER 1000
        unsigned char cosxFF[91]={255,254,254,254,254,254,253,253,252,251,251,250,249,248,247,246,245,243,242,241,239,238,236,234,232,231,229,227,225,223,220,218,216,213,211,208,206,203,200,198,195,192,189,186,183,180,177,173,170,167,163,160,156,153,149,146,142,138,135,131,127,123,119,115,111,107,103,99,95,91,87,83,78,74,70,65,61,57,53,48,44,39,35,31,26,22,17,13,8,4,0};
        int Ua(unsigned int angle){
            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);   
        }
        int main (){
            int angle=0;
            char p=1; //0-Phase voltage 1-Line voltage
           
            FILE* u=fopen("u.txt","wb");
            FILE* v=fopen("v.txt","wb");
            FILE* w=fopen("w.txt","wb");   
            char t[10];
            while(angle<=360){
                itoa(Ua(angle)-p*Ub(angle),t,10);
                fputs(t,u);
                fputs("\n",u);
               
                itoa(Ub(angle)-p*Uc(angle),t,10);
                fputs(t,v);
                fputs("\n",v);
               
                itoa(Uc(angle)-p*Ua(angle),t,10);
                fputs(t,w);
                fputs("\n",w);
               
                angle+=1;
            }
           
            fclose(u);
            fclose(v);
            fclose(w);
            system("Pause");
        }

         下面素一個周期內相電壓(上)和線電壓(下)的關系 可以看出相電壓(占空比分布)呈不規則變化規律 而線電壓呈完美的正弦波變化規律
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮