三相变频器驱动异步电机矢量控制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曄姺梡)丂 */ 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 */
}
} compile报了什么错误啊?ccs应该有提示的吧。把提示发来看看先。 什么程序啊看不懂啊 DSP是TI的,板子是其他的公司用TI的DSP包装过的。所以程序里面有好多都是用到那个公司自己开发的函数。而且用的也不是ccs。错误报告我忘了,似乎没什么启示似的。明天我发上来。谢谢两位了。我还想请问一下,矢量控制后的效果是不是就是把,电机启动的转矩加大啊?我第一次做这个,谢谢各位了。 矢量控制的目的是把励磁电流和力矩电流分开解耦控制,达到直流电机的控制效果。 谢谢大家,编译通过了,可是电机为什么不转啊? 建议你还是静下心来仔细读下程序吧。这么急是做不好事情的。 编译通过也只说明程序语法没有错误,应该是算法上使功率管没有导通,同意楼上 运行程序,电机冒烟儿了。。。郁闷啊。。。哪位做过这个啊? 按步就班的来测试啊,别什么都不清楚就上电啊。先测试pwm波形是不是正确,死区时间是否有,驱动的是同步还是异步机,电流环有没有调好。这些都要测试的啊。 您说的这些都测试过了,没有问题。冒烟儿的原因可能是coupling没安好。今天重新测了一下等价电路的值,没有问题。用软件都测试过这些,都正常。只是电机有时候转,有时候不转。有时候加一下外力,可以转,有时候却不动。唉,只是比较急,最近有点儿没头绪了。刚学这个不到一个月。。。以前是弄机器人的。回复 11# archdevil 你的角度怎么测的?是估算的还是编码器测的?可以把角度信号通过DA输出显示看看是否正常,一般先调试电流环,不加速度环,看电机能否正常转,然后再加速度环调试。 你看一下电机先吧 估计已经挂了 好像缺项 要不就是输出的角度有问题 我是基于汇编的 回复 13# archdevil
你说的角度是指的dq坐标变换时候的角度吗? 回复 14# lbz0123
电机没问题,我重新测了一边。你说的输出角度指的是不是dq 变换时候的角度啊 学习一下!!!谢谢! 回复 12# MwZheV
你还行,我以前学力学的,现在导师让设计个变频异步电动机,半年内,从不知道啥是电机,到现在懂一点点,悲催了啊! 首先应该把注释看懂
页:
[1]
2