变频器MCU C语言主文件

*=========================================================================

=========================================================================*/

//库文件包含

#include <stdlib.h>

#include <math.h>

#include <limits.h>

//==========================================================================

#pragma CODE_SECTION(main,"flashDFuncs")

#pragma CODE_SECTION(MainCycle,"flashDFuncs")

#pragma CODE_SECTION(MsTask,"ramfuncs")

#pragma CODE_SECTION(EQep1Isr,"ramfuncs")

#define TOPPWD 1218 //定义最高权限密码(厂家使用)

#define SOFT_VER 319 //2009-06 变更标志: ld-09-06-03 & sy0906

//头文件包含

#include "include\DSP2806_Device.h"

#include "AD200\include\Panel.h"

#include "AD200\include\globalQ.h"

#include "AD200\include\GlobalConst.h"

#include "AD200\include\GlobalVar.h"

#include "AD200\include\DSP2806_GlobalPrototypes.h"

#include "AD200\include\Parameter.h"

#include "AD200\include\GpioOut.h"

#include "AD200\include\93LC86.h"

#include "AD200\include\DigitalIO.h"

#include "AD200\include\AdcFunction.h"

#include "AD200\include\AnalogIO.h"

#include "AD200\include\PFunc.h"

#include "AD200\include\plc.h"

#include "AD200\include\PID.h"

#include "AD200\include\various.h"

#include "AD200\include\AdMathTable.h"

#include "AD200\include\wobble.h"

#include "AD200\include\modbus.h"

#include "AD200\include\MotorParaAutoMeas.h"

#include "AD200\include\MotorModel.h"

//==========================================================================

//源文件包含

#include "AD200\source\XInterrupt.c"

#include "AD200\source\AdMath.c"

#include "AD200\source\GlobalFunction.c"

#include "AD200\source\byTypePrar.c"

#include "AD200\source\93LC86.c"

#include "AD200\source\DigitalIO.c"

#include "AD200\source\AdcFunction.c"

#include "AD200\source\AnalogIO.c"

#include "AD200\source\Panel.c"

#include "AD200\source\PFunc.c"

#include "AD200\source\plc.c"

#include "AD200\source\PID.c"

#include "AD200\source\Dynamic.c"

#include "AD200\source\wobble.c"

#include "AD200\source\RunModeSel.c"

#include "AD200\source\MotorFormula.c"

#include "AD200\source\SvGendq.c"

#include "AD200\source\MotorParaAutoMeas.c"

#include "AD200\source\ASR.c"

#include "AD200\source\VectorCtrl.c"

#include "AD200\source\variblize.c"

#include "AD200\source\InverterCtrlnow.c"

#include "AD200\source\vvvfh.c"

#include "AD200\source\MotorModel.c"

#include "AD200\source\EPwm1Isr.c"

#include "AD200\source\pfo.c"

#include "AD200\source\PFI.c"

#include "AD200\source\ModBusInit.c"

#include "AD200\source\modbus.c"

#include "AD200\source\pgSpeed_now.c"

#include "AD200\source\torqCtrl.c"

//==========================================================================

//函数原型声明

extern Uint16 ramtable_loadstart;

extern Uint16 ramtable_loadend;

extern Uint16 ramtable_runstart;

extern Uint16 RamfuncsLoadStart;

extern Uint16 RamfuncsLoadEnd;

extern Uint16 RamfuncsRunStart;

extern interrupt void EQep1Isr(void);

extern interrupt void Xint1Isr(void);

extern interrupt void AdcIsr(void);

extern interrupt void EPwm1Isr(void);

extern interrupt void Ecap1Isr(void);

//extern interrupt void Ecap2Isr(void);

extern void MainCycle(void);

extern void PrarIndexAndMaxCarryFCal(Uint16 driveTypeTemp);

//==========================================================================

//主函数

//==========================================================================

void main(void)

{

DisableDog();

//======================================================================

InitSysCtrl(); //In DSP2806_SysCtrl.c

InitGpio(); //In DSP2806_Gpio.c

DINT; //Disable global interrupts

//======================================================================

InitPieCtrl(); //In DSP2806_PieCtrl.c

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable(); //In DSP2806_PieVectInit.c

//======================================================================

MemCopy(&ramtable_loadstart, &ramtable_loadend, &ramtable_runstart);

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

InitFlash(); //In DSP2806_Gpio.c

//======================================================================

InitCpuTimers(); //In DSP2806_CpuTimes.c

InitAdc(); //In DSP2806_ADC.c

// InitECan(); //In DSP2806_eCAN.c

// InitI2C(); //In DSP2806_I2C.c

InitSci(); //In DSP2806_SCI.c

InitSpi(); //In DSP2806_SPI.c

XIntCtrl(); //In DSP2806_XIntCtrl.c

InitEQep(); //In DSP2806_eQEP.c

InitECap(); //In DSP2806_eCAP.c

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

EDIS;

InitEPwm(); //In DSP2806_ePWM.c

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

EDIS;

BLOCK();

InitEPwmGpio();

//======================================================================

ReadAWord(&verToEEP, 800);

if(verToEEP != SOFT_VER)

{

WriteWords(0, pFacValue, paraNum);

verToEEP = SOFT_VER;

WriteAWord(800, verToEEP);

}

SELEEPROM();

BoardSpiState = EEPIdleE;

DELAY_MS(5);

InitPanel();

PrarIndexAndMaxCarryFCal(P.driveType); //参数表索引计算最大载频计算

//PType080625

BaseValueCalc(); //基值计算

FullScaleCalc(); //满幅值计算

CoeffOnlineCal(); //一些系数的计算

CoeffOfTcCal();

ParaToUsedCalc();

LmSatCalc();

fsHzUlti = MIN_CARRIER_F; //ysh090223

adType = DISP_b;//注:根据机型种类更改此显示值。

modbusStruct.setRefSpeed = 0;

digRefSpd = P.innerSpdVal0;

innerSpdVal0Old = P.innerSpdVal0;

powOnSelfRun = P.powOnSelfRunEn;

tmpMop32 = (long)P.mopValSave *1000 * 10;

Ad.iuAdSum = 0;

Ad.ivAdSum = 0;

Ad.iwAdSum = 0;

Ad.vdcAdSum = 0;

Ad.vuvAdSum = 0;

Ad.vvwAdSum = 0;

Ad.nAdSum = 0;

//=======================================================================

EALLOW;

//PieVectTable.TINT0 = &CpuTimer0Isr; //1ms中断

PieVectTable.ADCINT = &AdcIsr; // ADC中断

PieVectTable.XINT1 = &Xint1Isr; //外部中断1

PieVectTable.EPWM1_INT = &EPwm1Isr;

PieVectTable.ECAP1_INT = &Ecap1Isr;

PieVectTable.EQEP1_INT = &EQep1Isr;

EDIS;

//=======================================================================

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)

AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //起动AD转换

XIntruptRegs.XINT1CR.bit.ENABLE = 1; //使能XINT1中断

EQep1Regs.QEINT.bit.UTO = 1; //enable the UTO interrupt

//=======================================================================

//0113 ConfigCpuTimer0(1);

//=======================================================================

IER |= E_INT1 + E_INT3 + E_INT4 + E_INT5;

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1 + PIEACK_GROUP3 + PIEACK_GROUP4 + PIEACK_GROUP5;

//----------------------------------------------------------------------

//开放XINT10,ADCINT,TINT中断

PieCtrlRegs.PIEIER1.all = E_INT4 + E_INT6;

//开放Epwm1中断

PieCtrlRegs.PIEIER3.all = E_INT1;

//开放Ecap1中断

PieCtrlRegs.PIEIER4.all = E_INT1;

//开放EQEP1中断

PieCtrlRegs.PIEIER5.all = E_INT1;

//-----------------------------------------------------------------------

EnableDog();

EINT; // Enable Global interrupt INTM

asm(" CLRC OVC");

asm(" CLRC TC,C,SXM,OVM");

//===================================================

//通讯专用主控制字赋初值

modbusStruct.mainContrlWord.bit.onOff1 = 0;

modbusStruct.mainContrlWord.bit.off2 = 1;

modbusStruct.mainContrlWord.bit.emergencyStop = 1;

modbusStruct.mainContrlWord.bit.reserved2 = 0;

modbusStruct.mainContrlWord.bit.refDir = 0;

modbusStruct.mainContrlWord.bit.reserved3 = 0;

modbusStruct.mainContrlWord.bit.extErrIn = 0;

modbusStruct.mainContrlWord.bit.reset = 0;

modbusStruct.mainContrlWord.bit.fwdJog = 0;

modbusStruct.mainContrlWord.bit.revJog = 0;

modbusStruct.mainContrlWord.bit.extendOut1 = 0;

modbusStruct.mainContrlWord.bit.reserved6 = 0;

modbusStruct.mainContrlWord.bit.reserved7 = 0;

modbusStruct.mainContrlWord.bit.mopUp = 0;

modbusStruct.mainContrlWord.bit.mopDn = 0;

modbusStruct.mainContrlWord.bit.virtualTerm = 0;

//======================================================

for(;;)

{

MainCycle(); //主循环函数

}

}

//===========================================================================

//1ms任务

//===========================================================================

void MsTask(void)

{

long tmpL;

Uint16 tmpU;

Uint32 tmpU32;

Uint16 tmpMaxRunF;

Uint16 maxOutFTmp;

Uint16 i;

Uint16 k;

long wei900;

k++;

weik =iu;

if(k ==900)

{

k =0;

}

tmpMaxRunF = SpeedToF(P.maxRunSpd);

if(P.speedHiResolEn == 1)

{

tmpMaxRunF = tmpMaxRunF / 10;

}

maxOutFTmp = tmpMaxRunF;

//======================================================================

if(innerSpdVal0Old != P.innerSpdVal0)

{

digRefSpd = P.innerSpdVal0;

}

innerSpdVal0Old = P.innerSpdVal0; //ysh

ModBusInit(); //ysh

timer1ms++;

//======================================================================

MiscClock();

runClock();

//定时函数

//TimeSlice(&timer1ms, &timer10ms);

Timer32Inc(&powOnTimer);

Timer32Inc(&timeSinceStop);

//Timer16Inc(&freeStopTimer);

Timer32Inc(&noKeyDownTimer);

Timer32Inc(&dcBrakeStopTimer);

Timer16Inc(&twinkleTimer);

Timer16Inc(&eepSaveDispTimer);

Timer16Inc(&plcDOTime);

Timer32Inc(&sCurveTimer);

Timer32Inc(&resetItvlTimer);

Timer32Inc(&measureTimer);

Timer16Inc(&displaydelayTimer);//ld-09-06-03

//Timer16Inc(&preMagTimer);

if((P.motorDriveMode == 2) && (fRampRef == 0) && (fCur != 0) && (driveStat == StoppingE))

{//用于SLVC停机,防止不能停机的情况

Timer16Inc(&stopTimer);

}

//--------------------------------------------------------------------

UnitRampV();

if(powOnTimer > READY_TIME)

{

ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads

}

MotPolesCal();

//--------------------------------------------------------------------

RandomUint16();

revWobFSynInOld = diFuncSel.bit.revWobFSynIn;

extFaultResetOld = diFuncSel.bit.extErrRst;

forceCmdToTermOld = diFuncSel.bit.forceToDI;

triThreadStopOld = diFuncSel.bit.triRunStop;

virtualFwdOld = diFuncSel.bit.driveRun;

virtualRevOld = diFuncSel.bit.runDirCtrl;

// change posErrClearOld = diFuncSel.bit.posCntClear;

ctrlSpdOrTorqOld = diFuncSel.bit.modeSwitch;

//pidDisOld = diFuncSel.bit.pidDis;

//由串口通道切换出来时,清除相关命令

if(runCmdChan < CmdSerial1E)

{

modbusStruct.mainContrlWord.bit.onOff1 = 0;

modbusStruct.mainContrlWord.bit.off2 = 1;

modbusStruct.mainContrlWord.bit.emergencyStop = 1;

modbusStruct.mainContrlWord.bit.reserved2 = 0;

modbusStruct.mainContrlWord.bit.refDir = 0;

modbusStruct.mainContrlWord.bit.reserved3 = 0;

modbusStruct.mainContrlWord.bit.extErrIn = 0;

modbusStruct.mainContrlWord.bit.reset = 0;

modbusStruct.mainContrlWord.bit.fwdJog = 0;

modbusStruct.mainContrlWord.bit.revJog = 0;

modbusStruct.mainContrlWord.bit.extendOut1 = 0;

modbusStruct.mainContrlWord.bit.reserved6 = 0;

modbusStruct.mainContrlWord.bit.reserved7 = 0;

modbusStruct.mainContrlWord.bit.mopUp = 0;

modbusStruct.mainContrlWord.bit.mopDn = 0;

modbusStruct.mainContrlWord.bit.virtualTerm = 0;

MainCtlonOff1 = 0;

MainCtlOff2 = 1;

MainCtlEmergencyStop = 1;

MainCtlRunDir = 0;

MainCtlFwdJog = 0;

MainCtlRevJog = 0;

MainCtlMopUp = 0;

MainCtlMopDown = 0;

MainCtlVirtualTerm = 0;

}

off3 = (diFuncSel.bit.emergencyStop ^ 1) && MainCtlEmergencyStop;

//======================================================================

if(powOnTimer > READY_TIME + CTRL_DELAY + P.diFilterT)

{

keyFilter();

}

//======================================================================

if(powOnTimer > READY_TIME && paraCmd == noHandleE)

{

if(MainCtlVirtualTerm == 0)

{

//虚拟端子无效

ClearDIFuncSel();

DIRead();

DIFilter();

DIFunction();

}

else if(MainCtlVirtualTerm == 1)

{

//虚拟端子有效

for(i = 5; i <= 7; i++)

{

diFuncSel.diFuncArrayi = 0;

}

DIRead();

DIFilter();

if((P.x1FuncSel >= 5) && (P.x1FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x1FuncSel = diState.bit.X1 ^ ONES(P.diLogicSet1);

}

if((P.x2FuncSel >= 5) && (P.x2FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x2FuncSel = diState.bit.X2 ^ TENS(P.diLogicSet1);

}

if((P.x3FuncSel >= 5) && (P.x3FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x3FuncSel = diState.bit.X3 ^ HUNS(P.diLogicSet1);

}

if((P.x4FuncSel >= 5) && (P.x4FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x4FuncSel = diState.bit.X4 ^ KILOS(P.diLogicSet1);

}

if((P.x5FuncSel >= 5) && (P.x5FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x5FuncSel = diState.bit.X5 ^ TENKILOS(P.diLogicSet1);

}

if((P.x6FuncSel >= 5) && (P.x6FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x6FuncSel = diState.bit.X6 ^ ONES(P.diLogicSet2);

}

if((P.x7FuncSel >= 5) && (P.x7FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x7FuncSel = diState.bit.X7 ^ TENS(P.diLogicSet2);

}

if((P.x8FuncSel >= 5) && (P.x8FuncSel <= 7))

{

diFuncSel.diFuncArrayP.x8FuncSel = diState.bit.X8 ^ HUNS(P.diLogicSet2);

}

}

}

Modbus();

//======================================================================

if(isRunning == 1)

{

if(P.motorDriveMode <= 1)

{

Timer32Inc(&startingTimer);

}

else

{

if(P.startMode == 0)

{

if(startFHoldFlag == 1)

{

Timer32Inc(&startingTimer);

}

}

else

{

Timer32Inc(&startingTimer);

}

}

}

else

{

ReadyRunProcess();

}

//---------------------------------------------------------------------

//复位已复位次数

if(resetItvlTimer > RESET_ITVL_TIME)

{

resetTimes = 0;

}

//---------------------------------------------------------------------

if(diFuncSel.bit.extErrIn == 1)

{

AE_UPDATE(EEEFE);

// ErrorHead = errE;

}

//参数写EEP完成

if(paraCmd == noHandleE && AWordToSave == 0)

{

ramSaveToEep();

}

if(AWordToSave == 1)

{

(*pWriteToEepwriteToEepProcess)(writeAWordAddress, (Uint16)writeAWordValue);

if(writeToEepProcess == WriteToEepIdleE)

{

MenuLevel = eepSaveEndE;

if(eepSaveDispTimer > EEP_DISP_TIME)

{

if(varPointer == (&P.userPwd - pVar))

{

MenuLevel = noMenuE;

}

else if(writeAWordAddress == (Uint16)((Uint16*) &P.mopValSave - pVar))

{//进行MOP存储时保持当前显示不变sy081103

MenuLevel = noMenuE;

}

else

{

twinkleBit = onesE;

MenuLevel = sonMenuE;

sonMenuPointer++;

if(sonMenuPointer > menuNummainMenuPointer - 1)

{

sonMenuPointer = 0;

}

varPointer = VarPointerCalu();

}

AWordToSave = 0;

}

}

}

else

{

writeToEepProcess = WriteToEepIdleE;

eepSaveDispTimer = 0;

}

//======================================================================

if(PanelSpiState == EEPIdleE)

{

PanelDriver();

}

//======================================================================

//参数上传或者下载完成时候的处理

if(paraCmdActOld > paraCmdAct && paraCmdOld < faultLoghandleE && paraCmd == noHandleE)

// && ErrorCode == noErrorE

{

MenuLevel = sonMenuE;

twinkleBit = onesE;

sonMenuPointer++;

}

else if(paraCmdActOld > paraCmdAct && paraCmdOld >= faultLoghandleE && paraCmd == noHandleE)

// && ErrorCode == noErrorE

{

MenuLevel = noMenuE;

}

//======================================================================

paraCmdActOld = paraCmdAct;

//======================================================================

FanControl();

//======================================================================

//充电继电器

if(powOnTimer > SHORT_DLY_MS)

{

ShortControl();

}

//======================================================================

if(((KeyUse.all == ONLY_STOP_RESET) && (KeyUseOld.all == NO_KEY_DOWN)) || (diFuncSel.bit.extErrRst > extFaultResetOld))

{

reset = 1;

}

else

{

reset = 0;

}

if((reset == 1) && (ErrorCode != noErrorE))

//ysh

{

modbusStruct.mainContrlWord.bit.onOff1 = 0;

modbusStruct.mainContrlWord.bit.off2 = 1;

modbusStruct.mainContrlWord.bit.emergencyStop = 1;

modbusStruct.mainContrlWord.bit.extErrIn = 0;

modbusStruct.mainContrlWord.bit.reset = 0;

MainCtlonOff1 = 0;

MainCtlOff2 = 1;

MainCtlEmergencyStop = 1;

}

PanelResponse();

//======================================================================

FastModify();

Display();

//======================================================================

//保存参数到主控板EEP,参数拷贝,恢复出厂值时不显示单位

if(PanelSpiState == EEPBusyE)

// || BoardSpiState == EEPBusyE

{

ClearUnit();

}

Seperate();

if(powOnTimer > DISP_ALL_TIME)//sy0906

{

HandleTwinkle();

}

if(ErrorCode != noErrorE)

{

if(ErrorCode == AECFEE)

{

if(reset == 1)

{

ErrorCode = noErrorE;

ErrorHead = alarmE;

sciaTimeoutTimer = 0;

}

}

else if(ErrorCode == AEEEPE)

{

if(reset == 1)

{

ErrorCode = noErrorE;

ErrorHead = alarmE;

}

}

if(ErrorCode == AEPnLE && alamFreeStop == 0)

{

if(panelResumeTimer > PANEL_RESUME_TIME)

{

ErrorCode = noErrorE;

ErrorHead = alarmE;

}

}

else if(ErrorCode == AEPLoE && alamFreeStop == 0)

{

if(timerOutPL >= (T_CHECK_OUT_PL - 100))

{

ErrorCode = noErrorE;

ErrorHead = alarmE;

}

}

else if(ErrorCode == AEPGoE && alamFreeStop == 0)

{

if(reset == 1)

{

ErrorCode = noErrorE;

ErrorHead = alarmE;

}

}

else if(ErrorHead == alarmE && alamFreeStop == 0)

{

ErrorCode = noErrorE;

ErrorHead = alarmE;

}

}

if(powOnTimer > READY_TIME)

{

Timer(&P.timer1InSel); //定时器1

Timer(&P.timer2InSel); //定时器2

//--------------------------------------------------------------------

LogicUint(&P.logicU1In1Sel); //逻辑单元1

LogicUint(&P.logicU2In1Sel); //逻辑单元2

LogicUint(&P.logicU3In1Sel); //逻辑单元3

LogicUint(&P.logicU4In1Sel); //逻辑单元4

//--------------------------------------------------------------------

Compare(); //比较器

//--------------------------------------------------------------------

Counter(); //计数器

//--------------------------------------------------------------------

CalUint(&P.calU1In1); //算术单元1

CalUint(&P.calU2In1); //算术单元2

}

//======================================================================

//载频计算及载频自动调整

CarryFToTBPRDCal();

//======================================================================

//散热器温度处理

LpfInMs(&P.heatSink1Temp, &heatSink1Temp32, td1Raw, T_DISP_FLT);

//======================================================================

//Vdc滤波for AVR

LpfInMs(&vdcAvrFlt,&vdcAvrFlt32, vdc, T_VDC_FLT);

////sy20081102 if(P.spdValSetMode != 2)

////sy20081102 {

////sy20081102 tmpMop32 = (long)P.mopValSave *1000 * 10;

////sy20081102 }

////sy20081102 else if(P.spdValSetMode == 2)

//ysh

////sy20081102 {

MopModify();

////sy20081102 }

//保存频率给定通道值

refFChanOld = refFChan;

RunCmdChanSel(); //运行命令通道

RefFChanSel(); //速度给定通道选择.

if((isRunning == 1) && (P.ctrlMode == 1) && (diFuncSel.bit.pidDis == 0)

&& ((P.motorDriveMode >= 2 && preMagTimer > preMagTime) || (P.motorDriveMode < 2))) //ysh0908

{//PIDimprove

PidCtrl();

if((P.pidFbOverLimCtl == 1) || ((P.pidFbOverLimCtl == 0) && (PidStartT >= (Uint32)P.pidStartDelayT)))

{

if(((pidFb / 10) >= P.pidFbUpLim) || ((pidFb / 10) <= P.pidFbLoLim))

{

Timer32Inc(&pidFbOverLimT);

}

else

{

pidFbOverLimT = 0;

}

}

else

{

pidFbOverLimT = 0;

}

Timer32Inc(&PidStartT);

}

else

{

pidErr = 0;

runTimer = 1;

fbErrCnt = 0;

P.pidFb = 0;

P.pidRef = 0;

P.pidErr = 0;

P.pidOut = 0;

pidOut = 0; //PIDimprove

pidFbOverLimT = 0; //PIDimprove

PidStartT = 0; //PIDimprove

}

if(innerSpdVal0Old != P.innerSpdVal0)

{

digRefSpd = P.innerSpdVal0;

}

RunMode();

//======================================================================

// if(disSCurve == 1 || isRunning == 0)//(disSCurve == 1 || isRunning == 0)

// {

AccDecTSel(); //加减速时间的选择

// }

Disp.bit.RUN = 0;

Disp.bit.REV = 0;

//---------------------------------------------------------------------

//操作盘的LED刷新

StatusLedHandle();

//--------------------------------------------------------------------

AIFunction(&P.ai1TypeSel);

AIFunction(&P.ai2TypeSel);

pfiSel();

//控制信号生成

MainStatusWordRefresh(); //ysh

ExpStatusWordRefresh(); //ysh

ProcessStatMs();

//======================================================================

//脉冲封锁的刷新

isRunningOld = isRunning;

isRunning = (driveStat == ReadyRunE || driveStat == FaultE) ? 0 : 1;

enPulseOld = enPulse;

enPulse = isRunning &enPulseStarting &enPulseDcBrake &enPulseLowFRef; //// &enPulseRevDeatT

//---------------------------------------------------------------------

if(enPulseOld < enPulse)

{

DISBLOCK();

}

else if(enPulse == 0)

{

BLOCK();

}

StallAvoid();

WobbleFunc();

//---------------------------------------------------------------------

//故障检出函数

TimeScheduling();

InputPhaseLoss();

OutputPhaseLoss();

HandlePwrLost();

FaultPolling();

motOverLoad();

PreOverLoadChkOut();

UnderLoadChkOut();

MotorTempCheck();

pgMotor();

ErrorCodeHandle();

//---------------------------------------------------------------------

//制动单元控制

BrakeUnit();

//---------------------------------------------------------------------

//给定频率的计算(反转有效)

fRefPosNegOld = fRefPosNeg; //用于跳频

fRefPosNeg = sumRefF << Q15;

if(P.speedHiResolEn == 1)

{

fRefPosNeg = fRefPosNeg / 10;

}

AllCritFreqJump();

//ysh0904

//fSharpRef = (1L - enSteadyStall) *fDigRefAfterStopMux;

fSharpRef = fDigRefAfterStopMux;

//-----------------------------------------------------------------

wcSyncCur = P.synFFltSet << WC_SYNC_CUR_Q;

//-----------------------------------------------------------------

//当前频率选择和显示滤波

fCurLpfMsOld = fCurLpfMs; //用于故障记录

fCurLpfMs = fCurLpf;

fStatorMsOld = fStatorMs; //用于故障记录

fStatorMs = fStator;

outVMsOld = outVMs; //用于故障记录

outVAmp = AmpCal(vsAl, vsBe);

outVMs = PhaseToLine(PeakToRms(puToReal((short)((long)outVAmp *vdc / vdcAvr), V_Q, vBase, V_BASE_Q, 10)));

//---------------------------------------------------------------------

//速度显示 , ysh

tmpL = WToF(wrFbk);

LpfLInMs(&fFbkLpf, tmpL, T_F_FBK_DISP_FLT);

if(measureStep > RsMeasureLowCurE && measureStep < IdleLoadE)

{

fCur = 0;

fCurLpf = 0;

}

else if(measureStep >= IdleLoadE)

{

fCur = fRun;

fCurLpf = fRun;

}

else

{

if(P.motorDriveMode >= 1)

{

if(P.motorDriveMode == 2)

{//无感矢量,预励磁时应把速度显示为零,零速运行时也显示为零 ysh090223

if(preMagTimer <= preMagTime)

{

fCur = 0;

fCurLpf = 0;

}

else if((driveStat==StartingE || driveStat==RunningE) && (wAsrRef == 0)

&& (preMagTimer > preMagTime) && (isTorqCtrl == 0))

{

fCur = 0;

fCurLpf = 0;

}

else

{

fCur = tmpL;

fCurLpf = fFbkLpf;

}

}

else

{

fCur = tmpL;

fCurLpf = fFbkLpf;

}

}

else

{

fCur = fRun;

fCurLpf = fRun;

}

}

//--------------------------------------------------------------------

tmpU = P.accDecMode;

statusRampOld = statusRamp;

if(tmpU == 0 || (tmpU == 1 && disSCurve == 1))

{

fRampRefOld = fRampRef;

Ramp((short*)(&statusRamp), &fRampRef, fSharpRef, (long)maxOutFTmp *(1L << Q15), tAcc, tDec, controlRamp);

}

else if(tmpU == 1 && disSCurve == 0)

{

SCurve((short*)(&statusRamp), controlRamp);

}

else

//加减速方式为自动加速,直线减速时的情况

{

}

//--------------------------------------------------------------------

//转矩显示滤波

{

outTorqLpfOld = outTorqLpf;

}

//========================================================================

//用于ASR

wAsrRefOld = wAsrRef;

//tmpL = fRampRef - Droop(torqRef);

if((P.ctrlMode == 1) && (P.pidCtrlSet == 3) && (driveStat != StoppingE) && (PidStartT >= (Uint32)P.pidStartDelayT))

{//PID对加减速斜坡后的速度修正 ysh0908

tmpL = SAT(fRampRef + ((long)fPidTrim << Q15)); //加直接修正

}

else

{

tmpL = fRampRef;

}

tmpL = FToW(SAT32(tmpL, (long)maxOutFTmp << F100_Q));

if(P.runDirLock == 1)

{

tmpL = DN_LIM_ZERO32(tmpL);

}

else if(P.runDirLock == 2)

{

tmpL = UP_LIM_ZERO32(tmpL);

}

wRampRef = tmpL;

//-----------------------------------------------------------------

//转矩控制相关

RefTorqSel(); //ysh 08-10-21

//ST切换延迟

if (ctrlSpdOrTorqDelay == diFuncSel.bit.modeSwitch)

{//ysh 08-09-16

spdTorqSwitchTimer = 0;

}

else

{

Timer16Inc(&spdTorqSwitchTimer);

}

if ((spdTorqSwitchTimer) >= P.S_TSwitchDelayT)

{

ctrlSpdOrTorqDelay = diFuncSel.bit.modeSwitch;

}

//-----------------------------------------------------------

//--------------------------------------------------------------

if(P.motorDriveMode >= 1 && P.motorDriveMode <= 3 && measureStep == RsMeasureInitE) //ysh0214

{//"有PG速度控制"或"无PG但为矢量控制"

if(P.motorDriveMode != 2)

{//带PG,用实测速度

wrFbk = WrfdFlt*(motPoles>>1);

}

else

{//无PG矢量控制,反馈速度为计算的转子转速

wrFbk = wrCalFlt;

}

//速度调节器

if((driveStat==StartingE || driveStat==RunningE || driveStat==StoppingE || driveStat==EmStoppingE) && (preMagTimer>=preMagTime))

{

TorqLimCalc();

LineAsrParaCalcu();

wAsrRef = wRampRef;

//------------------------------------------------------------------

if(P.motorDriveMode >= 2) //yshDebug

{//矢量控制

////////////////////////////////////////////////////////////////////////////////

//SensorlessWake(); //ysh0908

TorqCtrl();

if (needTorqCtrl == 0)

{//命令为非转矩控制

wAsrRef = wRampRef;

}

else

{//命令为转矩控制

if (fHiLim == 1)

{//转矩控制发生超限,ASR给定为速度极限

//--------------------------------------

//ysh design 增加一个专用速度斜坡函数 08-10-16

if(needTorqCtrlOld < needTorqCtrl || isTorqCtrlOld > isTorqCtrl)

{

fRampRefSpdLim = fCur;

}

RampSpdLim(&fRampRefSpdLim, (tmpFwdSpdLim << F100_Q), (long)maxOutFTmp *(1L << Q15), tAcc, tDec);

wAsrRef = FToW(fRampRefSpdLim);

//---------------------------------------

}

else if (fLoLim == 1)

{//转矩控制发生超限,ASR给定为速度极限

//------------------------------------------

//ysh design 增加一个专用速度斜坡函数 08-10-16

if(needTorqCtrlOld < needTorqCtrl || isTorqCtrlOld > isTorqCtrl)

{

fRampRefSpdLim = fCur;

}

RampSpdLim(&fRampRefSpdLim, (tmpRevSpdLim << F100_Q), (long)maxOutFTmp *(1L << Q15), tAcc, tDec);

wAsrRef = FToW(fRampRefSpdLim);

//-------------------------------------------

}

fRampShadow = WToF(wrFbk); //ysh 08-12-25

}

if (isTorqCtrlOld > isTorqCtrl)

{//切换转矩控制到速度控制

asrInteg = torqRefRampL;

wErrLpfInner = 0;

fRampShadow = WToF(wrFbk);

}

else if (isTorqCtrlOld < isTorqCtrl)

{//切换速度控制到转矩控制

torqRefRampL = (long)torqRef << 16;

}

TorqRamp(&torqRefRampL, (TorqSharpRef << 16), tAccTorq, tDecTorq); //ysh 08-10-21

TorqBiasCtrl();

////////////////////////////////////////////////////////////////////////////////

if (isTorqCtrl == 0)

{//速度控制

Asr(asrKp, asrTi, wAsrRef, wAsrRefOld, wrFbk, (Uint32)torqLim);

tmpL = (long)asrOut+(long)torqBias*10; //torqBias为零, 暂时保留

tmpL = __sat32(tmpL,LONG_MAX-torqLim*10);

if(labs(tmpL)>=torqLim*10)

{

doFuncSel.bit.torqLimiting = 1;

}

else

{

doFuncSel.bit.torqLimiting = 0;

}

}

else if (isTorqCtrl == 1)

{//转矩控制

asrOut = 0;

tmpL = (long)(HIGH16(torqRefRampL));

tmpL = __sat32(tmpL, LONG_MAX - torqLim * 10);

if (labs(tmpL) >= torqLim *10)

{

torqRefRampL = __sat32(torqRefRampL, LONG_MAX - ((long)torqLim *(10L << 16)));

doFuncSel.bit.torqLimiting = 1;

}

else

{

doFuncSel.bit.torqLimiting = 0;

}

}

torqRef = (long)tmpL*torqNPu/(100*100);

}

else if(P.motorDriveMode == 1) //yshDebug

{//有PG的VF控制

tmpU32 = ((Uint32)P.asrOutFLim *maxOutFTmp)/(Uint32)(WToF(wSlipN)>>F100_Q); //(×1000)

Asr(asrKp, asrTi, wAsrRef, wAsrRefOld, wrFbk, tmpU32);

torqRef = __sat32((long)asrOut*torqNPu/(100*100),LONG_MAX-SHRT_MAX);

doFuncSel.bit.torqLimiting = 0;

}

}

else

{

asrOut = 0;

asrInteg = 0;

wErr = 0;

wErrLpfInner = 0;

fRampShadow = WToF(wrFbk);//转矩偏置运行向速度控制切换的处理 ysh

}

}

else

{

asrOut = 0;

wAsrRef = 0;

torqRef = 0;

wErr = 0;

wErrLpfInner = 0;

doFuncSel.bit.torqLimiting = 0;

}

//-----------------------------------------------------------------

Timer16Inc(&preMagTimer);

//-----------------------------------------------------------------

//计算转矩电流

if(P.motorDriveMode >= 2)

{

wcSyncCur = P.vcSynFFltSet<<WC_SYNC_CUR_Q;

//功率限制

PowerLimit();

//预励磁

if(preMagTimer<(long)preMagTime ||(P.startMode == 2 && driveStat==StartingE)) //09-07-22

{

isqRef=0;

asrInteg=0;

fRampShadow=WToF(wrFbk); //ysh

}

else

{

//转矩电流计算及限幅

tmpL = IsqRefCal(torqRef, fluxrOpn);

if(driveStat != DcBrakeStopE)

{//ysh 08-09-22

isqRef = __sat32(tmpL, LONG_MAX -((1L<<I_Q)/100)*P.driveMaxCurLim);

}

}

//弱磁

FluxWeak();

}

else

{

wcSyncCur = P.synFFltSet<<WC_SYNC_CUR_Q;

}

//=======================================================================

//转矩显示及滤波

outTorqCent = torq * 100L * 10L / torqNPu;

if(P.motorDriveMode >= 1)

{// ysh: for 14_14 display

LpfInMs(&asrOutLpf,&asrOutLpf32, asrOut,T_DISP_FLT);

}

if(P.motorDriveMode >= 2)

{//ysh: for 14_02, 14_12, 14_13 display

torq=TorqCal(1,isq,fluxr);

LpfInMs(&outTorqLpf,&outTorqLpf32, outTorqCent,T_DISP_FLT);

LpfInMs(&isqLpf,&isqLpf32, isq,T_DISP_FLT);

LpfInMs(&isdLpf,&isdLpf32, isd,T_DISP_FLT);

}

else

{

torq = torqEm;

outTorqLpf = torqEmLpf*100L*10L/torqNPu;

outTorqLpf32 = 0;

}

//--------------------------------------------------------------------

//电流显示换算和滤波

curRmsOld = (Uint16)curRms;

curRms = puToReal(PeakToRms(curAmp), I_Q, iBase, I_BASE_Q, 10);

LpfInMs(&curRmsFlt, &curRmsFlt32, curRms, T_CUR_DISP_FLT);

//--------------------------------------------------------------------

//母线电压显示滤波

vdcMsOld = vdcMs;

vdcMs = vdc;

LpfInMs(&vdcFlt, &vdcFlt32, vdc, T_VDC_DISP_FLT);

//--------------------------------------------------------------------

//输出电压/输出功率/给定转矩的显示滤波

torqRefCent = (long)torqRef *100L * 10L / torqNPu;

LpfInMs(&outVLpf, &outVLpf32, (short)outVMs, T_DISP_FLT);

// LpfInMs(&outPwLpf, &outPwLpf32, (short)((PDispCal(outVLpf, curRmsFlt))/(2L * (long)P.motorRatedP)), T_DISP_FLT);

// LpfInMs(&outPwLpf, &outPwLpf32, (short)(((long)p *powBase >> (P_Q - P_BASE_NEGQ)) / (100 / 10)), 1000);

LpfInMs(&outPwLpf, &outPwLpf32, (short)((PDispCal(outVLpf, curRmsFlt))/(2L * (long)P.motorRatedP)), T_DISP_FLT);

// LpfInMs(&outPwLpf, &outPwLpf32, DN_LIMIT((short)(((long)p *powBase >> (P_Q - P_BASE_NEGQ)) / (100 / 10)), 0), 1000);

LpfInMs(&torqRefLpf, &torqRefLpf32, torqRefCent, T_DISP_FLT);

//--------------------------------------------------------------------

//PG检测转速的显示滤波

PgDetSpeed = 60L *((WToF(labs(WrfdFlt)) + (1L << (F100_Q - 1))) >> F100_Q);

if(P.pgUseMode == 0 || P.pgUseMode == 1)

{

PgDetSpeed = PgDetSpeed * SIGN_PN32(WrfdFlt);

}

LpfLInMs(&PgDetSpeedFlt, PgDetSpeed, T_F_FBK_DISP_FLT);

//----------------------------------------------------------------------

//减速AVR操作

if(statusRamp == RampDecE)

{

GeneralRamp(&avrRampInteg, SHRT_MAX, (Uint32)(P.outVRecoT *(100 / 6)));

}

else

{

GeneralRamp(&avrRampInteg, 0, (Uint32)(P.outVRecoT *(100)));

}

//------------------------------------------------------------------------

//curAmp = AmpCal(isAl, isBe); //ysh0904

pOld = p;

p = PCal(vsAl, vsBe, isAl, isBe);

q = QCal(vsAl, vsBe, isAl, isBe);

//--------------------------------------------------------------------

UpdateParaValue();

AdSignProcess();

AOFunction(P.ao1FuncSel, &P.ao1TypeSel);

AOFunction(P.ao2FuncSel, &P.ao2TypeSel);

AOFuncUpdate();

pfo();

//======================================================================

if(powOnTimer > READY_TIME)

{

PartDoTerm();

DOFunction();

}

//=================================================

// for eQEP

tmpPgUseModeOld = tmpPgUseMode;

tmpPgUseMode = P.pgUseMode;

if(tmpPgUseModeOld != tmpPgUseMode)

{

if(P.pgUseMode == 0 || P.pgUseMode == 1)

{

EQep1Regs.QDECCTL.bit.QSRC = 0; //Quadrature-count mode

}

else if(P.pgUseMode == 2)

{

EQep1Regs.QDECCTL.bit.QSRC = 2; //direct count mode:up count mode

}

}

//------------------------------------------------------

}

//===========================================================================

//===========================================================================

//EQep1中断(ms)

//===========================================================================

interrupt void EQep1Isr(void)

{

DirMeas = EQep1Regs.QEPSTS.bit.QDF;

//------------------------------------------------------------

IER |= E_INT1 + E_INT3 + E_INT4;

EINT;

//------------------------------------------------------------

KickDog();

if(pgLostTimer > P.pgMisDetT*100)

{//断线检测

Wrfd = 0;

WrfdTmp = 0;

WrfdFlt = 0;

PGLostAct();

}

else

{

if(P.pgUseMode == 0 || P.pgUseMode == 1)

{//正交编码器

if(EQep1Regs.QFLG.bit.QDC | EQep1Regs.QFLG.bit.PHE | EQep1Regs.QFLG.bit.PCO | EQep1Regs.QFLG.bit.PCU)

{

EQep1Regs.QCLR.bit.QDC = 1;

EQep1Regs.QCLR.bit.PHE = 1;

EQep1Regs.QCLR.bit.PCO = 1;

EQep1Regs.QCLR.bit.PCU = 1;

EQep1Regs.QCLR.bit.UTO = 1;

EQep1Regs.QCLR.bit.INT = 1;

}

else

{

eQepTmpL = (DirMeas == 1) ? (long)EQep1Regs.QPOSLAT : (long)(EQep1Regs.QPOSMAX - EQep1Regs.QPOSLAT);

Wrfd = eQepTmpL*1000L*(1L<<Wr_Q-13-2+1)/(long)P.numOfPGPulse*(long)(PI*(1L<<13));

if(Wrfd != 0)

{

pgLostTimer = 0;

}

if(P.pgUseMode == 1)

{

DirMeas = DirMeas^1;

}

if(DirMeas == 0)

{

WrfdTmp = -Wrfd;

}

if(DirMeas == 1)

{

WrfdTmp = Wrfd;

}

}

}

else if(P.pgUseMode == 2)

{//单通道编码器

if(EQep1Regs.QFLG.bit.PCO | EQep1Regs.QFLG.bit.PCU)

{

EQep1Regs.QCLR.bit.PCO = 1;

EQep1Regs.QCLR.bit.PCU = 1;

EQep1Regs.QCLR.bit.UTO = 1;

EQep1Regs.QCLR.bit.INT = 1;

}

else

{

eQepTmpL = (long)EQep1Regs.QPOSLAT;

Wrfd = (long)eQepTmpL*1000L*(1L<<Wr_Q-13-2+2)/(long)P.numOfPGPulse*(long)(PI*(1L<<13));

if(Wrfd != 0)

{

pgLostTimer = 0;

}

WrfdTmp = Wrfd;

}

}

}

MsTask();

EQep1Regs.QCLR.bit.UTO = 1; //clear the UTO interrupt flag

EQep1Regs.QCLR.bit.INT = 1; //clear the global interrupt flag and enables further interrupts

PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;

}

//==========================================================================

//==========================================================================

//主循环函数

//==========================================================================

void MainCycle(void)

{

extern Uint16 tdAd;

Uint16 tmpU = 0;

//温度检测

KickDog(); //now

if(powOnTimer > READY_TIME + CTRL_DELAY)

{

PwrOffToSave();

}

td1Raw = TempFromSensitive(tdAd, P.TD1Zf, P.TD1Scale); //AdcRegs.ADCRESULT4

if(powOnTimer > READY_TIME)

{

if(P.heatSink1Temp >= P.heatSink1ProtTemp)

{

AE_UPDATE(EoHIE); //过热故障

// ErrorHead = errE;

}

}

if((paraCmd != noHandleE || paraCopySerialCmd != noHandleE) && isRunning == 0 && BoardSpiState == EEPIdleE)

{

if(paraCmd == clean2InfoE)

{

BoardSpiState = EEPBusyE;

Clean2Info();

tmpU = (Uint16)((Uint16*) &P.mopValSave - pVar); //torqWrapStartT

paraCmdAct = paraCmdActtingE;

WriteWords(tmpU, (Uint16*) &P.mopValSave, 5); //torqWrapStartT

}

else if(paraCmd == clean12InfoE)

{

BoardSpiState = EEPBusyE;

Clean12Info();

tmpU = &P.lastErrType - pVar;

MenuLevel = recoveryingE;

paraCmdAct = paraCmdActtingE;

WriteWords(tmpU, &P.lastErrType, 10);

}

else if(paraCmd == resumeFacValueE)

{

BoardSpiState = EEPBusyE;

MenuLevel = recoveryingE;

paraCmdAct = paraCmdActtingE;

ResumeFacValue(P.driveType);

}

else if((paraCmd == paraUpLoadE || paraCopySerialCmd == paraUpLoadE) && PanelState == TransmitE)

{

BoardSpiState = EEPBusyE;

MenuLevel = upLoadingE;

paraCmdAct = paraCmdActtingE;

ParaUpLoading();

paraCopySerialCmd = noHandleE;

}

else if((paraCmd == partParaDownLoadE || paraCopySerialCmd == partParaDownLoadE) && PanelState == TransmitE)

{

BoardSpiState = EEPBusyE;

MenuLevel = downLoadingE;

paraCmdAct = paraCmdActtingE;

ParaDownLoading();

paraCopySerialCmd = noHandleE;

}

else if((paraCmd == paraDownLoadE || paraCopySerialCmd == paraDownLoadE) && PanelState == TransmitE)

{

BoardSpiState = EEPBusyE;

MenuLevel = downLoadingE;

paraCmdAct = paraCmdActtingE;

ParaDownLoading();

paraCopySerialCmd = noHandleE;

}

else if(paraCmd == driveModelSetE)

{

BoardSpiState = EEPBusyE;

MenuLevel = recoveryingE;

paraCmdAct = paraCmdActtingE;

ResumeFacValue(P.driveModel);

}

else if(paraCmd == motTypeParaSetE)

{

BoardSpiState = EEPBusyE;

paraCmdAct = paraCmdActtingE;

WriteWords(motTypeParaNum, &P.motorRatedP, 13);

}

else if(paraCmd == facOperate1E)

{

BoardSpiState = EEPBusyE;

MenuLevel = recoveryingE;

paraCmdAct = paraCmdActtingE;

WriteWords(0, pFacValue, paraNum);

}

else if(paraCmd == faultLoghandleE)

{

BoardSpiState = EEPBusyE;

paraCmdAct = paraCmdActtingE;

WriteWords((&P.lastErrType - pVar), &P.lastErrType, 10);

}

if(ErrorCode == AEEEPE || ErrorCode == EcoPE)

{

BoardSpiState = EEPBusyE;

errToDisplay = displayE;

}

paraCmdOld = paraCmd;

paraCmd = noHandleE;

paraCmdAct = noParaCmdActE;

BoardSpiState = EEPIdleE;

}

//--------------------------------------------------------------------

zfAl = ((long)P.alDcComp *realCarrierF + FS_DC_CALI / 2) / FS_DC_CALI;

zfBe = ((long)P.beDcComp *realCarrierF + FS_DC_CALI / 2) / FS_DC_CALI;

//---------------------------------------------------------------------

//设定死区时间

if(P.deadT >= 30)

{

EPwm1Regs.DBRED = P.deadT * 5;

EPwm2Regs.DBRED = P.deadT * 5;

EPwm3Regs.DBRED = P.deadT * 5;

EPwm1Regs.DBFED = P.deadT * 5;

EPwm2Regs.DBFED = P.deadT * 5;

EPwm3Regs.DBFED = P.deadT * 5;

}

else

{

EPwm1Regs.DBRED = 150;

EPwm2Regs.DBRED = 150;

EPwm3Regs.DBRED = 150;

EPwm1Regs.DBFED = 150;

EPwm2Regs.DBFED = 150;

EPwm3Regs.DBFED = 150;

}

//--------------------------------------------------------------------

BaseValueCalc(); //基值计算

FullScaleCalc(); //满幅值计算

CoeffOnlineCal(); //一些系数的计算

ParaToUsedCalc();

//=================================================

//设置硬件过流保护点

OCRefGenerate(P.hwOCProtectP);

//=================================================

}

相关推荐
反转180度6 小时前
Qt 6 + C++17 实现 SFTP 批量部署:工业设备运维工具实战解析
运维·c++·qt
Fluxart.ai6 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
why技术7 小时前
AI 写的文章,可能都带着手敲一遍都去不掉的“隐形水印”。
前端·人工智能·后端
雨辰AI7 小时前
RAG 知识库搭建:基于人大金仓构建信创运维问答机器人|全栈国产化落地完整版
运维·ai·机器人·ai编程
愚公搬代码7 小时前
【愚公系列】《Android应用案例开发大全》016-LBS类应用掌上杭州(辅助工具类的开发)
android·前端
CodeSheep7 小时前
又一个华为天才少年,离职了!
前端·后端·程序员
-今昭-7 小时前
Ansible
linux·运维·ansible
星野川崎2067 小时前
电商多店运维:云机长期挂机频繁掉线、账号无故风控原因剖析与解决方案
大数据·运维·云计算·电商
kyriewen7 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
mounter6258 小时前
MACsec 全景解析:从技术演进、核心架构到 DPU 硬件卸载与 K8s 大规模调度实战
linux·kubernetes·linux kernel·kernel·macsec