MwZheV 发表于 2010-4-2 23:25

三相变频器驱动异步电机矢量控制C程序

这是用三相变频器驱动三相异步电机的矢量控制的C程序。这个程序不能compile。以前可以的,后来不知道被谁改过了,执行后也是有些问题的。程序中注释的地方很多都是乱码,我查了函数集,把里面有的用英文标注了。各位前辈如果有做过的,请帮我看一下是哪里有问题,该怎么改啊,这样写的思路对不对呢。

#include        <mwio3.h>

/***********丂AD偺儗儞僕傪愝掕:9R梡丂**************/
#defineCH0_RANGE   400.0                            /* CH0偺儗儞僕 for vu           */
#defineCH1_RANGE   400.0                            /* CH1偺儗儞僕 for vw           */
#defineCH2_RANGE   50.0                                    /* CH2偺儗儞僕 for iu           */
#defineCH3_RANGE   50.0                                    /* CH3偺儗儞僕 for iw               */
#defineCH4_RANGE   400.0                            /* CH4偺儗儞僕 for E            */
#defineCH5_RANGE   50.0                           /* CH5偺儗儞僕 for Idc                */
#defineCH6_RANGE   10.0                           /* CH6偺儗儞僕 for CH6        */
#defineCH7_RANGE   10.0                           /* CH7偺儗儞僕 for CH7                 */

/**********悢抣偺愝掕**********/
#define        PI(n)        (3.14159265358979 * (n))                /* 墌廃棪兾                        */       
#define BDN        0                                        /* Board number (0-3)                */
#define CH        0                                        /* Channel number                */
#define tr        0.084904545                                /* L2/r2 夞揮巕帪掕悢                */
#define TM        200                                        /* 懍搙墘嶼娫妘        [兪s]                */
#define FM        5000                                        /* 懍搙墘嶼娫妘                 */
#define RESOLUTION        4000                                /* 僄儞僐乕僟偺R/P(1000) 4攞        */
#define        r1        12.8                                        /* 摍壙夞楬掕悢丂1師掞峈r1        夞揮屻偺抣        */       
#define        r2        10.17                                        /* 摍壙夞楬掕悢丂2師掞峈r2                        */
#define        l1        0.033645354                                /* 摍壙夞楬掕悢丂1師傕傟僀儞僟僋僞儞僗        l1'        */
#define        l2        0.033645354                                /* 摍壙夞楬掕悢丂2師傕傟僀儞僟僋僞儞僗        l2'        */
#define        Lm        0.553222582                                /* 摍壙夞楬掕悢丂椼帴僀儞僟僋僞儞僗        M'        */
#define        L1        0.863479227                                /* 摍壙夞楬掕悢乮2憡夞揮婡乯丂桳岠僀儞僟僋僞儞僗L1 = l1' + 3/2 * M'         */
#define        L2        0.863479227                                /* 摍壙夞楬掕悢乮2憡夞揮婡乯丂桳岠僀儞僟僋僞儞僗L2 = l2' + 3/2 * M'        */
#define        M        0.829833873                                /* 摍壙夞楬掕悢乮2憡夞揮婡乯椼帴僀儞僟僋僞儞僗M= 3/2 * M'                */

/**********AD曄姺撉傒崬傒梡曄悢**********/
float        vu, vw;                                                /* 揹埑僙儞僒梡曄悢                */       
float        iu, iv, iw;                                        /* 揹棳僙儞僒梡曄悢                */       
float         E;                                                /* 捈棳揹埑                         */
float        Idc;                                                /* 捈棳揹棳                        */
float        CH6, CH7;                                        /* 枹巊梡曄悢                        */

/**********揹埑巜椷梡曄悢**********/
float        u, v, w;                                        /* 揹埑巜椷梡曄悢                */
float        d, q, a, b;                                        /* 揹埑巜椷丆dq, ab幉                */
float        *pu, *pv, *pw, *pa, *pb;                        /* 揹埑巜椷丄dq, ab幉億僀儞僞        */
float        umax, umin;                                        /* u憡揹埑巜椷嵟戝抣丆嵟彫抣        */
float        vmax, vmin;                                        /* v憡揹埑巜椷嵟戝抣丆嵟彫抣        */
float        wmax, wmin;                                        /* w憡揹埑巜椷嵟戝抣丆嵟彫抣        */
float        flux, torque;                                        /* 帴懇巜椷丆僩儖僋巜椷                */
float        K_torque;                                        /* 僩儖僋巜椷學悢                */
float        K_d, K_q;                                        /* 揹埑巜椷學悢                        */
float        K_v;                                                /* 揹埑巜椷學悢                        */

/**********揹棳僼傿乕僪僶僢僋梡曄悢**********/
float        id, iq, ia, ib;                                        /* 揹棳僼傿乕僪僶僢僋                */
float        *pia, *pib, *pid, *piq;                                /* 揹棳僼傿乕僪僶僢僋億僀儞僞丂        */
float        id_ref, iq_ref;                                        /* 揹棳巜椷                        */
float        kp_i, ki_i, kd_i, t_i;                                /* PID寁嶼梡掕悢                */
mwPID         *ppid_iu, *ppid_iw;                                /* PID峔憿懱傊偺億僀儞僞(iu,iw) */

/**********PWM曄挷梡曄悢**********/
float        DeadT;                                                /* 抁棈杊巭婜娫乮僨僢僪僞僀儉乯        */                       
float        Fc;                                                /* 僉儍儕傾廃攇悢                */
float        Status;                                                /* 1 : ON, 0 : OFF                */

/**********懍搙墘嶼梡曄悢**********/
volatile int counter, count, pin;                        /* 寁嶼梡丂                        */
float        cnt0, cntn;                                        /* 僇僂儞僞抣                        */
float        counterS;                                        /* 夞揮曽岦偺挷惍                */
float        dcnt;                                                /* 僇僂儞僞憹暘                        */
float        dcntmax;                                        /* 僇僂儞僞憹暘嵟戝抣                */
float        rpm;                                                /* 懍搙                        */
float        Krpm;                                                /* 懍搙墘嶼掕悢                        */
float        omega_r;                                        /* 夞揮巕妏懍搙                        */
float        Komega_r;                                        /* 夞揮巕妏懍搙墘嶼掕悢                */
float        omega_ref;                                        /* 夞揮悢巜椷乮rad/s乯rpm_ref傪傕偲偵寁嶼偡傞*/
float        rpm_ref;                                        /* 夞揮悢巜椷乮rpm乯                */
float        omega_limit;                                        /* 夞揮悢巜椷忋尷                */
float        omega_min;                                        /* 夞揮悢巜椷壓尷                */

/**********妏搙墘嶼梡曄悢**********/
float        omega_s;                                        /* 妸傝廃攇悢                        */
float        omega_e;                                        /* 揹尮妏廃攇悢                        */
float        theta;                                                /* 妏搙(dq曄姺梡)丂                */

MwZheV 发表于 2010-4-2 23:26

interrupt voidz_int(void)
{        counter++;                                        /* Add variable 'counter'        */
        watch_data();
}

interrupt voidcarrier_int(void)                        /* 僉儍儕傾摨婜妱傝崬傒張棟儖乕僠儞        */
{       
        pev_ad_start(0, 0);
        while (pev_ad_in_st(0, 0)) ;                        /* AD撉傒崬傒 */
            pev_ad_in_grp(0, 0, &vu, &vw, &iu, &iw);
       
        pev_ad_start(0, 1);                                /* AD撉傒崬傒        */
            while (pev_ad_in_st(0, 1)) ;
            pev_ad_in_grp(0, 1, &E, &Idc, &CH6, &CH7);        /* AD曄姺奐巒        */
       
        iu = iu + 0.24;                                        /* 揹棳岆嵎偺挷惍 */
        iw = iw + 0.08;                                        /* 揹棳岆嵎偺挷惍 */
        iv = -iu - iw;
       
        mwPIDcal(ppid_iu, iu);                                /* PID惂屼(iu)        */
        mwPIDcal(ppid_iu, iw);                                /* PID惂屼(iw)        */

        uw2ab (iu, iw, pia, pib);                        /* 憡弴偼u,v,w偲偡傞偙偲(dq曄姺偑惓偟偔側偝傟側偄) */
        ab2dq (ia, ib, theta, pid, piq);
       
        omega_ref = rpm_ref / ( PI(2) * 60);                /* 懍搙巜椷偺曄姺(rpm 仺 rad/s) */
       
        if (omega_ref > omega_limit) {omega_ref = omega_limit;}                /* 懍搙巜椷偺忋尷丆壓尷 */
        if (omega_ref < omega_min)
                {        omega_ref = omega_ref - omega_min;
                        if( omega_e < omega_min )
                        {         Status = 0.0;
                                pev_inverter_stop_pwm( BDN, CH );        /* Stop of 3-phase PWM        output        */
                        }
                                                                      
                }                      
        else { Status = 1.0;}

        torque = K_torque * ( omega_ref - omega_r );        /* 僩儖僋巜椷寁嶼 */
        if ( torque > 0.5) { torque = 0.5;}                /* 僩儖僋忋尷 */

        id_ref = flux / M;                                /* d幉揹棳巜椷抣丂id = 冇2 / M*/
        iq_ref = (torque * L2) / (2 * M * flux);        /* q幉揹棳巜椷抣丂iq = ( 冄 * L2 )/ ( 嬌懳悢(2) *M* 冇2丂) */

        d = K * ( K_d * (id_ref - id ) + r1 * id - omega_e * l1 *iq );                                                /* d幉揹埑巜椷 */
        q = K * ( K_q * (iq_ref - iq ) + omega_e * l1 * id + r1 * iq + (( omega_e * M * M )/ L2 ) * id );        /* q幉揹埑巜椷 */
       
        dq2ab (d, q, theta, pa, pb);
        ab2uvw (a, b, pu, pv, pw);
       
        if (u > umax) {u = umax;}
        if (u < umin) {u = umin;}

        if (v > vmax) {v = vmax;}
        if (v < vmin) {v = vmin;}

        if (w > wmax) {w = wmax;}
        if (w < wmin) {w = wmin;}

        pev_inverter_set_uvw( BDN, CH, u, v, w );        /* PWM signal setting                        */
        if (Status == 1.0) { pev_inverter_start_pwm( BDN, CH );        }       
                                                        /* Start of 3-phase PWM        output                */
       
       
        watch_data();                                        /* Send data to Wave display board        */
}

interrupt void        rpm_timer0(void)                        /* Interrupt routine of timer0                */
{        cnt0 = cntn;
        cntn = pev_abz_read(BDN);                        /* Read value of ABZ encoder's count        */
        dcnt = cntn - cnt0;
        if (dcnt> dcntmax) { dcnt = dcnt - RESOLUTION; }
        else if (dcnt < -dcntmax) { dcnt = dcnt + RESOLUTION; }
       
        if (dcnt <= 0.0 ) { dcnt = (-1.0) * dcnt;}                /* 愨懳抣 */
                                       
        rpm = Krpm * dcnt;                               
        omega_r = Komega_r * dcnt;
       
        omega_e = omega_r + (1.0 / tr) * (iq_ref / id_ref);
       

        theta += TM * 0.000001 * omega_e;                /* 愊暘婍 ( 兤 = 兤 + 儮t * wr ) 儮t偼僒儞僾儕儞僌娫妘 */

        if ( theta > PI(2.0) ) { theta -= PI(2.0); }
        else if ( theta < - PI(2.0) ) { theta += PI(2.0); }

        if (Status == 0.0) { theta = 0.0; }                                               
        watch_data();
}

void main(void)                        /* 曄悢弶婜壔                */
{       
        Fc = 5000.0;                /* Carrier frequency */
        DeadT = 3.5;                /* Deadtime [兪s]         */
       
        flux = 0.7735;
        torque = 0.0;                /* 僩儖僋弶婜抣 */

        kp_i = 1.0;                /* PID 斾椺學悢 */
        ki_i = 1.0;                /* PID 愊暘學悢 */
        kd_i = 0.0;                 /* PID 旝暘學悢 */       
        t_i = 1/(2*Fc);                /* PID 儘乕僷僗僼傿儖僞帪掕悢 */

        K_d = 0.2;               
        K_q = 0.2;
        K_torque = 1.0;       
        K=0.04;

        umax = vmax = wmax = 0.99 ;
        umin = vmin = wmin = -0.99 ;

        omega_limit = 52.36;        /* 懍搙忋尷 */
        omega_min = 0.0628;        /* 懍搙壓尷 */

        dcnt = 0.0;
        dcntmax = RESOLUTION * 0.5;
        Krpm = 60.0 * FM / RESOLUTION;
        Komega_r = PI(2) * FM / RESOLUTION;

        pu = &u;
        pv = &v;
        pw = &w;
        pa = &a;
        pb = &b;
       
        pia = &ia;
        pib = &ib;
        pid = &id;
        piq = &iq;
       
/**********弶婜忦審**********/
        d = 0.0;
        q = 0.0;
       
        id_ref = 0.0;
        iq_ref = 0.0;
        omega_ref = 0.0;
        rpm_ref = 0.0;
        counter = 0.0;
        cnt0 = cntn = 0.0;
        pin   = 0.0;
        u = v = w = 0.0;
        vu = vw = 0.0;
        iu = 0.0;
        iw = 0.0;
        iv = 0.0;
        CH6 = CH7 = 0.0;       
        omega_s = omega_e = omega_r = 0.0;
        theta =0.0;
        rpm = 0.0;       

        mwPIDinit(ppid_iu, kp_i, ki_i, kd_i, t_i, (1/Fc), 0.0, 0.0);        /* PID惂屼偺愝掕 iu */
        mwPIDinit(ppid_iw, kp_i, ki_i, kd_i, t_i, (1/Fc), 0.0, 0.0);        /* PID惂屼偺愝掕 iw */

        /* 1:ON SW, 0:OFF SW */
        while ( rpm_ref == 0.0) {Status = 0.0; watch_data();}       
               
        int_disable();                                        /* Prohibition of all interrupt                        */

        pev_init( BDN );
        pev_inverter_init( BDN, CH, Fc, 1000.0*DeadT );        /* Setting of 3-phase PWM function                 */
                                                        /* Carrier frequency = Fc(Hz) Deadtime         */
        pev_inverter_set_syncint( BDN, (1/(Fc*4.0)) );        /* Setting of carrier synchronization interrupt        */
        pev_inverter_set_uvw( BDN, CH, 0, 0, 0 );        /* Initialization of 3-phase reference        */
        int5_init_vector( carrier_int );                /* Setting of interrupt routine                        */
        pev_inverter_enable_up_int5( BDN );                /* Output start of signal of carrier synchronization interrupt        */

        int5_enable_int();                                /* Permission of interrupt by int5                */
        int_enable();                                        /* Permission of interrupt action                */       

        int6_init_vector( z_int );                        /* Selection of routine executed                */

        pev_abz_set_mode(BDN,0);                         /* Select 'Open collecter mode'                        */
        /* pev_abz_set_mode(BDN,2); */                        /* Select 'Defferential input mode'                */
        pev_abz_enable_int6(BDN);                        /* Permission of Z interrupt                        */
        int6_enable_int();                                /* Permission of interrupt by DSP                */
       
        wait(1000000.0/(Fc));                                /* Setting of 3-phase reference,                 */
                                                        /* then wait more than half of carrier period        */
        Status = 1.0;
        pev_inverter_start_pwm( BDN, CH );                /* Start of 3-phase PWM        output                        */

        /**************丂AD偺弶婜壔丂**************/

        pev_ad_set_range(0, 0, CH0_RANGE,CH1_RANGE,CH2_RANGE,CH3_RANGE);       
        pev_ad_set_range(0, 1, CH4_RANGE,CH5_RANGE,CH6_RANGE,CH7_RANGE);
       
        timer0_init(TM);                                /* RPM        */
        timer0_init_vector(rpm_timer0);                 /* Timer routine                        */
        timer0_start();                                       /* Start timer0                                */
        timer0_enable_int();                               /* Permission of timer0 interrupt        */

        int_enable();                                       /* Permission of interrupt                */
        while (1)                                         /* Repeat endlessly                        */
        {       
       
                pin   = pev_abz_in_pin(BDN);                /* Check status of ABZ encoder's signal */
               
                watch_data();                                /* Send data to Wave display board        */

           }

}

archdevil 发表于 2010-4-6 12:00

compile报了什么错误啊?ccs应该有提示的吧。把提示发来看看先。

cnhzjwq 发表于 2010-4-6 22:01

什么程序啊看不懂啊

MwZheV 发表于 2010-4-6 23:35

DSP是TI的,板子是其他的公司用TI的DSP包装过的。所以程序里面有好多都是用到那个公司自己开发的函数。而且用的也不是ccs。错误报告我忘了,似乎没什么启示似的。明天我发上来。谢谢两位了。我还想请问一下,矢量控制后的效果是不是就是把,电机启动的转矩加大啊?我第一次做这个,谢谢各位了。

archdevil 发表于 2010-4-7 15:33

矢量控制的目的是把励磁电流和力矩电流分开解耦控制,达到直流电机的控制效果。

MwZheV 发表于 2010-4-14 15:49

谢谢大家,编译通过了,可是电机为什么不转啊?

monitorli 发表于 2010-4-16 12:19

建议你还是静下心来仔细读下程序吧。这么急是做不好事情的。

stsaga 发表于 2010-4-17 13:07

编译通过也只说明程序语法没有错误,应该是算法上使功率管没有导通,同意楼上

MwZheV 发表于 2010-4-18 20:09

运行程序,电机冒烟儿了。。。郁闷啊。。。哪位做过这个啊?

archdevil 发表于 2010-4-19 11:30

按步就班的来测试啊,别什么都不清楚就上电啊。先测试pwm波形是不是正确,死区时间是否有,驱动的是同步还是异步机,电流环有没有调好。这些都要测试的啊。

MwZheV 发表于 2010-4-20 00:22

您说的这些都测试过了,没有问题。冒烟儿的原因可能是coupling没安好。今天重新测了一下等价电路的值,没有问题。用软件都测试过这些,都正常。只是电机有时候转,有时候不转。有时候加一下外力,可以转,有时候却不动。唉,只是比较急,最近有点儿没头绪了。刚学这个不到一个月。。。以前是弄机器人的。回复 11# archdevil

archdevil 发表于 2010-4-28 13:35

你的角度怎么测的?是估算的还是编码器测的?可以把角度信号通过DA输出显示看看是否正常,一般先调试电流环,不加速度环,看电机能否正常转,然后再加速度环调试。

lbz0123 发表于 2010-5-26 10:43

你看一下电机先吧 估计已经挂了 好像缺项 要不就是输出的角度有问题

飞鸿踏雪 发表于 2010-5-27 12:19

我是基于汇编的

mator 发表于 2010-5-28 20:34

回复 13# archdevil


    你说的角度是指的dq坐标变换时候的角度吗?

mator 发表于 2010-5-28 20:35

回复 14# lbz0123


    电机没问题,我重新测了一边。你说的输出角度指的是不是dq 变换时候的角度啊

xiaoqiang010203 发表于 2010-12-8 12:43

学习一下!!!谢谢!

liujihang029 发表于 2012-1-9 11:28

回复 12# MwZheV


    你还行,我以前学力学的,现在导师让设计个变频异步电动机,半年内,从不知道啥是电机,到现在懂一点点,悲催了啊!

腾飞中国 发表于 2012-2-13 09:52

首先应该把注释看懂
页: [1] 2
查看完整版本: 三相变频器驱动异步电机矢量控制C程序