666 lines
15 KiB
C
666 lines
15 KiB
C
/**************************************************************************
|
|
Description: Ïðîãðàììà ìîäåëèðóåò ðàáîòó ïðîöåññîðà - îñóùåñòâëÿåò
|
|
âûçîâ ôóíêöèé init28335, detcoeff, isr.
|
|
Òàêæå ìîäåëèðóåò ðàçëè÷íûå ïåðèôåðèéíûå óñòðîéñòâà ïðîöåññîðà
|
|
TMS320F28335/TMS320F28379D (ADC, PWM, QEP è ò.ä.).
|
|
|
|
Àâòîð: Óëèòîâñêèé Ä.È.
|
|
Äàòà ïîñëåäíåãî îáíîâëåíèÿ: 2021.11.08
|
|
**************************************************************************/
|
|
|
|
|
|
#include "simstruc.h"
|
|
#include "wrapper_inu.h"
|
|
#include "def.h"
|
|
#include "controller.h"
|
|
|
|
|
|
extern void init28335(void);
|
|
extern void detcoeff(void);
|
|
extern void isr(void);
|
|
extern void input_param(unsigned short num, unsigned short val);
|
|
|
|
|
|
void controller(SimStruct *S, const real_T *u, real_T *xD, real_T *rW, int_T *iW) {
|
|
// ÂÕÎÄÛ (begin)
|
|
nn = 0;
|
|
// àíàëîãîâûå âåëè÷èíû
|
|
udc1_ml = u[nn++];//Â
|
|
ia1_ml = u[nn++];//À
|
|
ib1_ml = u[nn++];//À
|
|
ic1_ml = u[nn++];//À
|
|
wm_ml = u[nn++];//ðàä/ñ
|
|
// óïðàâëåíèå (íàïðèìåð, ñ ÂÓ)
|
|
mst.faultReset = (unsigned short)u[nn++];
|
|
mst.start = (unsigned short)u[nn++];
|
|
mst.pzMode = (unsigned short)u[nn++];
|
|
mst.wmZz = u[nn++];//o.e. (îò N_BAZ)
|
|
mst.pmZz = u[nn++]*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
|
|
mst.wmLim = u[nn++];//o.e. (îò N_BAZ)
|
|
mst.pmLim = u[nn++]*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
|
|
mst.pIncrMaxTy = u[nn++]*TY*DECIM_PSI_WM_PM*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
|
|
mst.pDecrMaxTy = u[nn++]*TY*DECIM_PSI_WM_PM*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
|
|
iref = u[nn++];//î.å.
|
|
// ïàðàìåòðû (íàïðèìåð, ñ ÏÓ)
|
|
paramNo = FIRST_WRITE_PAR_NUM;
|
|
paramNew[paramNo++] = (unsigned short)u[nn++];
|
|
paramNew[paramNo++] = (unsigned short)u[nn++];
|
|
// ÂÕÎÄÛ (end)
|
|
|
|
//wm_ml = wm_ml_0*wm_err;//óãëîâàÿ ñêîðîñòü ñ ó÷åòîì ïîãðåøíîñòè
|
|
|
|
|
|
// îáðàáàòûâàåì ïàðàìåòðû S-Function êàæäûé ðàç, êîãäà îíè èçìåíèëèñü
|
|
if ( iW[0] == 1 ) {
|
|
iW[0] = 0;
|
|
kkk = 0;
|
|
for ( lll = 0; lll < NPARAMS; lll++ ) {
|
|
// îïðåäåëÿåì êîë-âî ýëåìåíòîâ â ïàðàìåòðå
|
|
dimen = mxGetNumberOfElements(ssGetSFcnParam(S,lll));
|
|
// îáðàáàòûâàåì ïàðàìåòð â çàâèñèìîñòè îò åãî ðàçìåðà
|
|
if ( dimen > LEN_PARAM_MATR*2 ) {
|
|
ssSetErrorStatus(S,"Â ïàðàìåòðå-ìàññèâå ñëèøêîì ìíîãî ýëåìåíòîâ");
|
|
return;
|
|
}
|
|
else if ( dimen > 1 ) {
|
|
// çàïîìèíàåì êîë-âî ýëåìåíòîâ ïàðàìåòðà-ìàòðèöû
|
|
paramMatrDimen = dimen;
|
|
// çàïîìèíàåì çíà÷åíèÿ ýëåìåíòîâ ïàðàìåòðà-ìàòðèöû
|
|
for ( mmm = 0; mmm < dimen; mmm++ )
|
|
paramMatr[mmm] = mxGetPr(ssGetSFcnParam(S,lll))[mmm];
|
|
}
|
|
else {
|
|
// çàïîìèíàåì çíà÷åíèÿ ïàðàìåòðîâ-ñêàëÿðîâ
|
|
paramScal[kkk++] = mxGetPr(ssGetSFcnParam(S,lll))[0];
|
|
}
|
|
}
|
|
// ÏÀÐÀÌÅÒÐÛ (begin)
|
|
nn = 0;
|
|
dt = paramScal[nn++];//øàã äèñêðåòèçàöèè (âñåãäà äîëæåí ïåðåäàâàòüñÿ â S-function ïîñëåäíèì!)
|
|
// ÏÀÐÀÌÅÒÐÛ (end)
|
|
} //if ( iW[0] == 1 )
|
|
|
|
|
|
|
|
|
|
// êîå-÷òî âûïîëíÿåì îäèí ðàç ïðè çàïóñêå ìîäåëè
|
|
if ( iW[1] == 1 ) {
|
|
iW[1] = 0;
|
|
|
|
// èíèöèàëèçàöèÿ ïðîöåññîðà
|
|
init28335();
|
|
|
|
// èìèòàöèÿ ñ÷èòûâàíèÿ ïàðàìåòðîâ èç EEPROM
|
|
// ... ïàðàìåòðû èç ìîäåëè (ñì. áëîê "Parameters")
|
|
for ( j = FIRST_WRITE_PAR_NUM; j < paramNo; j++ ) {
|
|
param[j] = paramNew[j];
|
|
}
|
|
// ... ïàðàìåòðû èç ôàéëà
|
|
param[180] = 930;//rf.PsiZ, %*10 îò PSI_BAZ
|
|
|
|
param[200] = 2048;//offset.Ia1, åä. ÀÖÏ
|
|
param[201] = 2048;//offset.Ib1, åä. ÀÖÏ
|
|
param[202] = 2048;//offset.Ic1, åä. ÀÖÏ
|
|
param[203] = 2048;//offset.Udc1, åä. ÀÖÏ
|
|
param[206] = 2048;//offset.Ia2, åä. ÀÖÏ
|
|
param[207] = 2048;//offset.Ib2, åä. ÀÖÏ
|
|
param[208] = 2048;//offset.Ic2, åä. ÀÖÏ
|
|
param[209] = 2048;//offset.Udc2, åä. ÀÖÏ
|
|
|
|
param[210] = 100;//cc.Kp, %
|
|
param[211] = 100;//cc.Ki, %
|
|
param[212] = 100;//cf.Kp, %
|
|
param[213] = 100;//cf.Ki, %
|
|
param[214] = 100;//csp.Kp, %
|
|
param[215] = 100;//csp.Ki, %
|
|
|
|
param[220] = 99;//protect.IacMax, % îò IAC_SENS_MAX
|
|
param[221] = 130;//protect.UdcMax, % îò U_NOM
|
|
param[222] = 110;//IzLim, % îò I_BAZ (ä.á. áîëüøå cf.IdLim)
|
|
param[223] = 105;//cf.IdLim, % îò I_BAZ (ä.á. ìåíüøå IzLim)
|
|
param[224] = 105;//csp.IqLim, % îò I_BAZ
|
|
param[225] = 97;//protect.UdcMin, % îò U_NOM
|
|
param[226] = 115;//protect.WmMax, % îò N_NOM
|
|
param[228] = 103;//rf.WmNomPsi, % îò N_NOM
|
|
param[229] = 97;//rf.YlimPsi, % îò Y_LIM
|
|
param[231] = 300;//protect.TudcMin, ìñ
|
|
param[233] = 1000;//protect.TwmMax, ìñ
|
|
|
|
param[244] = 26000;//rs.WlimIncr, ìñ
|
|
param[245] = 2000;//csp.IlimIncr, ìñ
|
|
param[248] = 6000;//rp.PlimIncr, ìñ
|
|
|
|
param[269] = 9964;//9700;//KmeCorr, %*100
|
|
|
|
param[285] = 10;//Kudc, ìñ*10
|
|
param[286] = 700;//Kwm, ìñ*10
|
|
param[288] = 250;//rs.Kwmz, ìñ
|
|
param[289] = 50;//rf.Kpsiz, ìñ
|
|
param[290] = 40;//Kme, ìñ
|
|
param[292] = 80;//rp.Kpmz, ìñ
|
|
|
|
param[303] = (unsigned short)(19200.);//sgmPar.Rs, ìêÎì
|
|
param[304] = (unsigned short)(19364.);//sgmPar.Lls, ìêÃí*10
|
|
param[305] = (unsigned short)(8500.);//sgmPar.Rr, ìêÎì
|
|
param[306] = (unsigned short)(10212.);//sgmPar.Llr, ìêÃí*10
|
|
param[307] = (unsigned short)(35810.);//sgmPar.Lm, ìêÃí
|
|
|
|
// èíèöèàëèçàöèÿ ïðîãðàììû
|
|
detcoeff();
|
|
|
|
// äëÿ ìîäåëèðîâàíèÿ òàéìåðîâ
|
|
T1Pr = (double)EPwm1Regs.TBPRD;
|
|
T2Pr = (double)EPwm2Regs.TBPRD;
|
|
T3Pr = (double)EPwm3Regs.TBPRD;
|
|
T4Pr = (double)EPwm4Regs.TBPRD;
|
|
T5Pr = (double)EPwm5Regs.TBPRD;
|
|
T6Pr = (double)EPwm6Regs.TBPRD;
|
|
t1cntAux = (double)EPwm1Regs.TBCTR;
|
|
t2cntAux = (double)EPwm2Regs.TBCTR;
|
|
t3cntAux = (double)EPwm3Regs.TBCTR;
|
|
t4cntAux = (double)EPwm4Regs.TBCTR;
|
|
t5cntAux = (double)EPwm5Regs.TBCTR;
|
|
t6cntAux = (double)EPwm6Regs.TBCTR;
|
|
// ... ïðèðàùåíèå ñ÷¸ò÷èêîâ òàéìåðîâ çà øàã äèñêðåòèçàöèè
|
|
TxCntPlus = FTBCLK*dt;
|
|
|
|
// äëÿ ìîäåëèðîâàíèÿ eQEP
|
|
Qposmax = (double)EQep2Regs.QPOSMAX;
|
|
qposcnt = 1.;//(double)EQep2Regs.QPOSCNT;
|
|
|
|
// äëÿ ìîäåëèðîâàíèÿ ÀÖÏ
|
|
// (íà ñ÷¸ò 1e-6 ñì. SetupAdc(), õîòÿ òàì ñêîðåå íå 1.0 ìêñ, à 0.8 ìêñ)
|
|
Tadc = (int)(1e-6/dt);
|
|
// ... íà âñÿêèé ñëó÷àé
|
|
if ( Tadc < 1 )
|
|
Tadc = 1;
|
|
tAdc = 0;
|
|
// ... ÷òîáû ÀÖÏ æäàë çàïóñêà
|
|
nAdc = 10;
|
|
|
|
// äëÿ ìîäåëèðîâàíèÿ Dead-Band Unit
|
|
CntDt = (int)(DT/dt);
|
|
stateDt1 = stateDt2 = stateDt3 = stateDt4 = stateDt5 = stateDt6 = 1;
|
|
cntDt1 = cntDt2 = cntDt3 = cntDt4 = cntDt5 = cntDt6 = 0;
|
|
|
|
// äëÿ çàùèò
|
|
DI_24V_SOURCE_FAULT = 0;
|
|
|
|
// äëÿ âûâîäà
|
|
inuWork = 0;
|
|
ivc.psi = 0;
|
|
rf.psiZ = 0;
|
|
rs.wmZ = 0;
|
|
csp.wmLimZi = 0;
|
|
pm = 0;
|
|
rp.pmZ = 0;
|
|
csp.pmLimZi = 0;
|
|
id1 = 0;
|
|
iq1 = 0;
|
|
idZ = 0;
|
|
iqZ = 0;
|
|
cf.idP = 0;
|
|
cf.idFF = 0;
|
|
cf.idI = 0;
|
|
csp.iqP = 0;
|
|
csp.iqFF = 0;
|
|
csp.iqI = 0;
|
|
cc.yd1 = 0;
|
|
cc.yq1 = 0;
|
|
cc.y1 = 0;
|
|
} //if ( iW[1] == 1 )
|
|
|
|
|
|
|
|
|
|
// Ìîäåëèðóåì Time-Base Submodule, Counter-Compare Submodule è
|
|
// Event-Trigger Submodule
|
|
// ePWM1 (up-down-count mode)
|
|
// -------------------------
|
|
t1cntAuxPrev = t1cntAux;
|
|
t1cntAux += TxCntPlus;
|
|
if ( t1cntAux > T1Pr ) {
|
|
t1cntAux -= T1Pr*2.;
|
|
// active CMPA load from shadow when TBCTR == TBPRD
|
|
cmp1A = (double)EPwm1Regs.CMPA.half.CMPA;
|
|
// çàïóñê ÀÖÏ
|
|
tAdc = Tadc;
|
|
nAdc = 0;
|
|
}
|
|
if ( (t1cntAuxPrev < 0) && (t1cntAux >= 0) ) {
|
|
// active CMPA load from shadow when TBCTR == 0
|
|
cmp1A = (double)EPwm1Regs.CMPA.half.CMPA;
|
|
// çàïóñê ÀÖÏ
|
|
tAdc = Tadc;
|
|
nAdc = 0;
|
|
}
|
|
t1cnt = fabs(t1cntAux);
|
|
|
|
// ePWM2 (up-down-count mode)
|
|
// -------------------------
|
|
t2cntAuxPrev = t2cntAux;
|
|
t2cntAux += TxCntPlus;
|
|
if ( t2cntAux > T2Pr ) {
|
|
t2cntAux -= T2Pr*2.;
|
|
// active CMPA load from shadow when TBCTR == TBPRD
|
|
cmp2A = (double)EPwm2Regs.CMPA.half.CMPA;
|
|
}
|
|
if ( (t2cntAuxPrev < 0) && (t2cntAux >= 0) ) {
|
|
// active CMPA load from shadow when TBCTR == 0
|
|
cmp2A = (double)EPwm2Regs.CMPA.half.CMPA;
|
|
}
|
|
t2cnt = fabs(t2cntAux);
|
|
|
|
// ePWM3 (up-down-count mode)
|
|
// -------------------------
|
|
t3cntAuxPrev = t3cntAux;
|
|
t3cntAux += TxCntPlus;
|
|
if ( t3cntAux > T3Pr ) {
|
|
t3cntAux -= T3Pr*2.;
|
|
// active CMPA load from shadow when TBCTR == TBPRD
|
|
cmp3A = (double)EPwm3Regs.CMPA.half.CMPA;
|
|
}
|
|
if ( (t3cntAuxPrev < 0) && (t3cntAux >= 0) ) {
|
|
// active CMPA load from shadow when TBCTR == 0
|
|
cmp3A = (double)EPwm3Regs.CMPA.half.CMPA;
|
|
}
|
|
t3cnt = fabs(t3cntAux);
|
|
|
|
// ePWM4 (up-down-count mode)
|
|
// -------------------------
|
|
t4cntAuxPrev = t4cntAux;
|
|
t4cntAux += TxCntPlus;
|
|
if ( t4cntAux > T4Pr ) {
|
|
t4cntAux -= T4Pr*2.;
|
|
// active CMPA load from shadow when TBCTR == TBPRD
|
|
cmp4A = (double)EPwm4Regs.CMPA.half.CMPA;
|
|
}
|
|
if ( (t4cntAuxPrev < 0) && (t4cntAux >= 0) ) {
|
|
// active CMPA load from shadow when TBCTR == 0
|
|
cmp4A = (double)EPwm4Regs.CMPA.half.CMPA;
|
|
}
|
|
t4cnt = fabs(t4cntAux);
|
|
|
|
// ePWM5 (up-down-count mode)
|
|
// -------------------------
|
|
t5cntAuxPrev = t5cntAux;
|
|
t5cntAux += TxCntPlus;
|
|
if ( t5cntAux > T5Pr ) {
|
|
t5cntAux -= T5Pr*2.;
|
|
// active CMPA load from shadow when TBCTR == TBPRD
|
|
cmp5A = (double)EPwm5Regs.CMPA.half.CMPA;
|
|
}
|
|
if ( (t5cntAuxPrev < 0) && (t5cntAux >= 0) ) {
|
|
// active CMPA load from shadow when TBCTR == 0
|
|
cmp5A = (double)EPwm5Regs.CMPA.half.CMPA;
|
|
}
|
|
t5cnt = fabs(t5cntAux);
|
|
|
|
// ePWM6 (up-down-count mode)
|
|
// -------------------------
|
|
t6cntAuxPrev = t6cntAux;
|
|
t6cntAux += TxCntPlus;
|
|
if ( t6cntAux > T6Pr ) {
|
|
t6cntAux -= T6Pr*2.;
|
|
// active CMPA load from shadow when TBCTR == TBPRD
|
|
cmp6A = (double)EPwm6Regs.CMPA.half.CMPA;
|
|
}
|
|
if ( (t6cntAuxPrev < 0) && (t6cntAux >= 0) ) {
|
|
// active CMPA load from shadow when TBCTR == 0
|
|
cmp6A = (double)EPwm6Regs.CMPA.half.CMPA;
|
|
}
|
|
t6cnt = fabs(t6cntAux);
|
|
|
|
|
|
// Ìîäåëèðóåì ðàáîòó ñ÷¸ò÷èêà â eQEP
|
|
qposcnt += wm_ml/PI2*NOP*4.*dt;
|
|
if ( qposcnt >= (Qposmax + 1.) )
|
|
qposcnt -= (Qposmax + 1.);
|
|
else if ( qposcnt < 0 )
|
|
qposcnt += (Qposmax + 1.);
|
|
EQep2Regs.QPOSCNT = (short)qposcnt;
|
|
|
|
|
|
/* Ìîäåëèðóåì ïðåîáðàçîâàíèÿ èçìåðÿåìûõ âåëè÷èí äàò÷èêàìè,
|
|
îïåðàöèîííèêàìè è ÀÖÏ (ñ ïîìîùüþ nAdc ó÷èòûâàåì ñäâèã ïî âðåìåíè
|
|
ìåæäó ÀÖÏ ðàçíûõ ñèãíàëîâ) */
|
|
if ( tAdc < Tadc ) {
|
|
tAdc++;
|
|
}
|
|
else {
|
|
tAdc = 1;
|
|
nAdc++;
|
|
switch ( nAdc ) {
|
|
case 5:
|
|
// Udc1
|
|
if ( udc1_ml > UDC_SENS_MAX )
|
|
udc1_ml = UDC_SENS_MAX;
|
|
else if ( udc1_ml < -UDC_SENS_MAX )
|
|
udc1_ml = -UDC_SENS_MAX;
|
|
AdcMirror.ADCRESULT0 =
|
|
(unsigned short)(udc1_ml/UDC_SENS_MAX*2048. + (float)offset.Udc1);
|
|
// Ic1
|
|
if ( ic1_ml > IAC_SENS_MAX )
|
|
ic1_ml = IAC_SENS_MAX;
|
|
else if ( ic1_ml < -IAC_SENS_MAX )
|
|
ic1_ml = -IAC_SENS_MAX;
|
|
AdcMirror.ADCRESULT2 =
|
|
(unsigned short)(ic1_ml/IAC_SENS_MAX*2048. + (float)offset.Ic1);
|
|
break;
|
|
case 6:
|
|
// Ia1
|
|
if ( ia1_ml > IAC_SENS_MAX )
|
|
ia1_ml = IAC_SENS_MAX;
|
|
else if ( ia1_ml < -IAC_SENS_MAX )
|
|
ia1_ml = -IAC_SENS_MAX;
|
|
AdcMirror.ADCRESULT4 =
|
|
(unsigned short)(ia1_ml/IAC_SENS_MAX*2048. + (float)offset.Ia1);
|
|
// Ib1
|
|
if ( ib1_ml > IAC_SENS_MAX )
|
|
ib1_ml = IAC_SENS_MAX;
|
|
else if ( ib1_ml < -IAC_SENS_MAX )
|
|
ib1_ml = -IAC_SENS_MAX;
|
|
AdcMirror.ADCRESULT6 =
|
|
(unsigned short)(ib1_ml/IAC_SENS_MAX*2048. + (float)offset.Ib1);
|
|
break;
|
|
case 7:
|
|
// êàê áû ñ ÏÓ
|
|
for ( j = FIRST_WRITE_PAR_NUM; j < paramNo; j++ ) {
|
|
if ( paramNew[j] != param[j] ) {
|
|
input_param((short)j, paramNew[j]);
|
|
break;
|
|
}
|
|
}
|
|
// ïîñëå çàâåðøåíèÿ ñåðèè ÀÖÏ âûçûâàåì isr()
|
|
isr();
|
|
break;
|
|
} //switch ( nAdc )
|
|
} //tAdc
|
|
|
|
|
|
// Ìîäåëèðóåì Action-Qualifier Submodule
|
|
// ... ePWM1
|
|
if ( cmp1A > t1cnt ) {
|
|
ci1A = 1;
|
|
ci1B = 0;
|
|
}
|
|
else if ( cmp1A < t1cnt ) {
|
|
ci1A = 0;
|
|
ci1B = 1;
|
|
}
|
|
// ... ePWM2
|
|
if ( cmp2A < t2cnt ) {
|
|
ci2A = 1;
|
|
ci2B = 0;
|
|
}
|
|
else if ( cmp2A > t2cnt ) {
|
|
ci2A = 0;
|
|
ci2B = 1;
|
|
}
|
|
// ... ePWM3
|
|
if ( cmp3A > t3cnt ) {
|
|
ci3A = 1;
|
|
ci3B = 0;
|
|
}
|
|
else if ( cmp3A < t3cnt ) {
|
|
ci3A = 0;
|
|
ci3B = 1;
|
|
}
|
|
// ... ePWM4
|
|
if ( cmp4A < t4cnt ) {
|
|
ci4A = 1;
|
|
ci4B = 0;
|
|
}
|
|
else if ( cmp4A > t4cnt ) {
|
|
ci4A = 0;
|
|
ci4B = 1;
|
|
}
|
|
// ... ePWM5
|
|
if ( cmp5A > t5cnt ) {
|
|
ci5A = 1;
|
|
ci5B = 0;
|
|
}
|
|
else if ( cmp5A < t5cnt ) {
|
|
ci5A = 0;
|
|
ci5B = 1;
|
|
}
|
|
// ... ePWM6
|
|
if ( cmp6A < t6cnt ) {
|
|
ci6A = 1;
|
|
ci6B = 0;
|
|
}
|
|
else if ( cmp6A > t6cnt ) {
|
|
ci6A = 0;
|
|
ci6B = 1;
|
|
}
|
|
|
|
|
|
// Ìîäåëèðóåì Dead-Band Submodule
|
|
// ... ePWM1
|
|
if ( stateDt1 == 1 ) {
|
|
ci1A_DT = ci1A;
|
|
ci1B_DT = 0;
|
|
if ( ci1A == 1 )
|
|
cntDt1 = CntDt;
|
|
if ( cntDt1 > 0 )
|
|
cntDt1--;
|
|
else
|
|
stateDt1 = 2;
|
|
}
|
|
else if ( stateDt1 == 2 ) {
|
|
ci1A_DT = 0;
|
|
ci1B_DT = ci1B;
|
|
if ( ci1B == 1 )
|
|
cntDt1 = CntDt;
|
|
if ( cntDt1 > 0 )
|
|
cntDt1--;
|
|
else
|
|
stateDt1 = 1;
|
|
}
|
|
// ... ePWM2
|
|
if ( stateDt2 == 1 ) {
|
|
ci2A_DT = ci2A;
|
|
ci2B_DT = 0;
|
|
if ( ci2A == 1 )
|
|
cntDt2 = CntDt;
|
|
if ( cntDt2 > 0 )
|
|
cntDt2--;
|
|
else
|
|
stateDt2 = 2;
|
|
}
|
|
else if ( stateDt2 == 2 ) {
|
|
ci2A_DT = 0;
|
|
ci2B_DT = ci2B;
|
|
if ( ci2B == 1 )
|
|
cntDt2 = CntDt;
|
|
if ( cntDt2 > 0 )
|
|
cntDt2--;
|
|
else
|
|
stateDt2 = 1;
|
|
}
|
|
// ... ePWM3
|
|
if ( stateDt3 == 1 ) {
|
|
ci3A_DT = ci3A;
|
|
ci3B_DT = 0;
|
|
if ( ci3A == 1 )
|
|
cntDt3 = CntDt;
|
|
if ( cntDt3 > 0 )
|
|
cntDt3--;
|
|
else
|
|
stateDt3 = 2;
|
|
}
|
|
else if ( stateDt3 == 2 ) {
|
|
ci3A_DT = 0;
|
|
ci3B_DT = ci3B;
|
|
if ( ci3B == 1 )
|
|
cntDt3 = CntDt;
|
|
if ( cntDt3 > 0 )
|
|
cntDt3--;
|
|
else
|
|
stateDt3 = 1;
|
|
}
|
|
// ... ePWM4
|
|
if ( stateDt4 == 1 ) {
|
|
ci4A_DT = ci4A;
|
|
ci4B_DT = 0;
|
|
if ( ci4A == 1 )
|
|
cntDt4 = CntDt;
|
|
if ( cntDt4 > 0 )
|
|
cntDt4--;
|
|
else
|
|
stateDt4 = 2;
|
|
}
|
|
else if ( stateDt4 == 2 ) {
|
|
ci4A_DT = 0;
|
|
ci4B_DT = ci4B;
|
|
if ( ci4B == 1 )
|
|
cntDt4 = CntDt;
|
|
if ( cntDt4 > 0 )
|
|
cntDt4--;
|
|
else
|
|
stateDt4 = 1;
|
|
}
|
|
// ... ePWM5
|
|
if ( stateDt5 == 1 ) {
|
|
ci5A_DT = ci5A;
|
|
ci5B_DT = 0;
|
|
if ( ci5A == 1 )
|
|
cntDt5 = CntDt;
|
|
if ( cntDt5 > 0 )
|
|
cntDt5--;
|
|
else
|
|
stateDt5 = 2;
|
|
}
|
|
else if ( stateDt5 == 2 ) {
|
|
ci5A_DT = 0;
|
|
ci5B_DT = ci5B;
|
|
if ( ci5B == 1 )
|
|
cntDt5 = CntDt;
|
|
if ( cntDt5 > 0 )
|
|
cntDt5--;
|
|
else
|
|
stateDt5 = 1;
|
|
}
|
|
// ... ePWM6
|
|
if ( stateDt6 == 1 ) {
|
|
ci6A_DT = ci6A;
|
|
ci6B_DT = 0;
|
|
if ( ci6A == 1 )
|
|
cntDt6 = CntDt;
|
|
if ( cntDt6 > 0 )
|
|
cntDt6--;
|
|
else
|
|
stateDt6 = 2;
|
|
}
|
|
else if ( stateDt6 == 2 ) {
|
|
ci6A_DT = 0;
|
|
ci6B_DT = ci6B;
|
|
if ( ci6B == 1 )
|
|
cntDt6 = CntDt;
|
|
if ( cntDt6 > 0 )
|
|
cntDt6--;
|
|
else
|
|
stateDt6 = 1;
|
|
}
|
|
|
|
|
|
// Ìîäåëèðóåì Trip-Zone Submodule
|
|
// ... clear flag for one-shot trip latch
|
|
if ( EPwm1Regs.TZCLR.all == 0x0004 ) {
|
|
EPwm1Regs.TZCLR.all = 0x0000;
|
|
EPwm1Regs.TZFRC.all = 0x0000;
|
|
}
|
|
if ( EPwm2Regs.TZCLR.all == 0x0004 ) {
|
|
EPwm2Regs.TZCLR.all = 0x0000;
|
|
EPwm2Regs.TZFRC.all = 0x0000;
|
|
}
|
|
if ( EPwm3Regs.TZCLR.all == 0x0004 ) {
|
|
EPwm3Regs.TZCLR.all = 0x0000;
|
|
EPwm3Regs.TZFRC.all = 0x0000;
|
|
}
|
|
if ( EPwm4Regs.TZCLR.all == 0x0004 ) {
|
|
EPwm4Regs.TZCLR.all = 0x0000;
|
|
EPwm4Regs.TZFRC.all = 0x0000;
|
|
}
|
|
if ( EPwm5Regs.TZCLR.all == 0x0004 ) {
|
|
EPwm5Regs.TZCLR.all = 0x0000;
|
|
EPwm5Regs.TZFRC.all = 0x0000;
|
|
}
|
|
if ( EPwm6Regs.TZCLR.all == 0x0004 ) {
|
|
EPwm6Regs.TZCLR.all = 0x0000;
|
|
EPwm6Regs.TZFRC.all = 0x0000;
|
|
}
|
|
|
|
// ... forces a one-shot trip event
|
|
if ( EPwm1Regs.TZFRC.all == 0x0004 )
|
|
ci1A_DT = ci1B_DT = 0;
|
|
if ( EPwm2Regs.TZFRC.all == 0x0004 )
|
|
ci2A_DT = ci2B_DT = 0;
|
|
if ( EPwm3Regs.TZFRC.all == 0x0004 )
|
|
ci3A_DT = ci3B_DT = 0;
|
|
if ( EPwm4Regs.TZFRC.all == 0x0004 )
|
|
ci4A_DT = ci4B_DT = 0;
|
|
if ( EPwm5Regs.TZFRC.all == 0x0004 )
|
|
ci5A_DT = ci5B_DT = 0;
|
|
if ( EPwm6Regs.TZFRC.all == 0x0004 )
|
|
ci6A_DT = ci6B_DT = 0;
|
|
|
|
|
|
|
|
|
|
// ÂÛÕÎÄÛ (begin)
|
|
nn = 0;
|
|
// Óïðàâëåíèå
|
|
// ... INU1
|
|
xD[nn++] = ci1A_DT;
|
|
xD[nn++] = ci2A_DT;
|
|
xD[nn++] = ci1B_DT;
|
|
xD[nn++] = ci2B_DT;
|
|
|
|
xD[nn++] = ci3A_DT;
|
|
xD[nn++] = ci4A_DT;
|
|
xD[nn++] = ci3B_DT;
|
|
xD[nn++] = ci4B_DT;
|
|
|
|
xD[nn++] = ci5A_DT;
|
|
xD[nn++] = ci6A_DT;
|
|
xD[nn++] = ci5B_DT;
|
|
xD[nn++] = ci6B_DT;
|
|
|
|
// Òîëüêî äëÿ ïðîñìîòðà
|
|
xD[nn++] = state;
|
|
xD[nn++] = faultNo;
|
|
|
|
xD[nn++] = mst.start;
|
|
xD[nn++] = inuWork;
|
|
xD[nn++] = mst.pzMode;
|
|
|
|
xD[nn++] = psi;
|
|
xD[nn++] = rf.psiZ;
|
|
|
|
xD[nn++] = wm;
|
|
xD[nn++] = rs.wmZ;
|
|
xD[nn++] = csp.wmLimZi;
|
|
|
|
xD[nn++] = pm*S_BAZ/P_NOM;
|
|
xD[nn++] = rp.pmZ*S_BAZ/P_NOM;
|
|
xD[nn++] = csp.pmLimZi*S_BAZ/P_NOM;
|
|
|
|
xD[nn++] = id1;
|
|
xD[nn++] = iq1;
|
|
xD[nn++] = idZ;
|
|
xD[nn++] = iqZ;
|
|
|
|
xD[nn++] = me*M_BAZ/M_NOM;
|
|
|
|
xD[nn++] = sqrt(idZ*idZ + iqZ*iqZ);
|
|
xD[nn++] = IzLim;
|
|
|
|
xD[nn++] = sqrt(cc.yd1*cc.yd1 + cc.yq1*cc.yq1);
|
|
xD[nn++] = Y_LIM;
|
|
|
|
xD[nn++] = theta_out;
|
|
// ÂÛÕÎÄÛ (end)
|
|
|
|
} //void controller(SimStruct ...
|