📄 initial.c
字号:
{
asm(" EALLOW");
/* Configure eCAN RX and TX pins for eCAN transmissions using eCAN regs*/
ECanaRegs.CANMC.bit.CCR = 1 ; // Set CCR = 1
while(ECanaRegs.CANES.bit.CCE != 1 ) {} // Wait for CCE bit to be set..
ECanaRegs.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANRIOC.bit.RXFUNC = 1;
/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */
// HECC mode also enables time-stamping feature
ECanaRegs.CANMC.bit.SCB = 1;
ECanaRegs.CANBTC.bit.BRPREG = 9;
ECanaRegs.CANBTC.bit.TSEG2REG = 2;
ECanaRegs.CANBTC.bit.TSEG1REG = 10;
ECanaRegs.CANMC.bit.CCR = 0 ; // Set CCR = 0
while(ECanaRegs.CANES.bit.CCE == !0 ) {} // Wait for CCE bit to be cleared..
while(ECanaRegs.CANBTC.bit.TSEG2REG ==0 || ECanaRegs.CANBTC.bit.TSEG1REG == 0){}
/* Initialize all bits of 'Master Control Field' to zero */
// Some bits of MCF register come up in an unknown state. For proper operation,
// all bits (including reserved bits) of MCF must be initialized to zero
ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
// as a matter of precaution.
/* Clear all TAn bits */
ECanaRegs.CANTA.all = 0xFFFFFFFF;
/* Clear all RMPn bits */
ECanaRegs.CANRMP.all = 0xFFFFFFFF;
/* Clear all interrupt flag bits */
ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
/* Configure bit timing parameters */
// ECanaRegs.CANMC.bit.CCR = 1 ; // Set CCR = 1
//
// while(ECanaRegs.CANES.bit.CCE != 1 ) {} // Wait for CCE bit to be set..
//
// ECanaRegs.CANBTC.bit.BRPREG = 9;
// ECanaRegs.CANBTC.bit.TSEG2REG = 2;
// ECanaRegs.CANBTC.bit.TSEG1REG = 10;
//
// ECanaRegs.CANMC.bit.CCR = 0 ; // Set CCR = 0
// while(ECanaRegs.CANES.bit.CCE == !0 ) {} // Wait for CCE bit to be cleared..
/* Disable all Mailboxes */
ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs
}
/*-----------------------------------------------------------------------------
Name: sADCalibration
Function: AD calibration
Execute frequency: only once after power on reset
-----------------------------------------------------------------------------*/
void sADCalibration(void)
{
unsigned long wChannelSum[16];
long Ltemp=27951104;
unsigned int wSampleCnt;
volatile unsigned int *wP1;
int k;
/*int wREF125A;
int wREF250A;*/
int wREF125B;
int wREF250B;
//static int wInvVoltMidPointValueSet; //030327 hanson
//static int wInvDcVoltMidPointValueSet; //030327 hanson
wP1=(volatile unsigned int *)0x7108; //pointer to Result 0
hoAD_SW1=1;
hoAD_SW2=0;
DelayUs(20000);
DelayUs(20000);
DelayUs(20000);
DelayUs(20000);
DelayUs(312); // Delay 10us
for(k=0;k<16;k++) wChannelSum[k]=0; //clear buffer
for(wSampleCnt=0;wSampleCnt<32;wSampleCnt++)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //Start AD convert
asm(" RPT #110 || NOP");
while(AdcRegs.ADCST.bit.SEQ1_BSY==1); //wait convert
asm(" RPT #110 || NOP");
for(k=0;k<16;k++)
{
wChannelSum[k]+=(*(wP1+k))>>4; //read & sum AD result
}
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //reset to AD channel 0
}
wREF125A=(int)((long)wChannelSum[6]>>5);
wREF250A=(int)((long)wChannelSum[7]>>5);
wREF125B=(int)((long)wChannelSum[14]>>5);
wREF250B=(int)((long)wChannelSum[15]>>5);
//wADCCoefB=wREF250A;
wADCCoefA=(int)(Ltemp/(long)(wREF250A-wREF125A));
wADCCoefB=(int)(Ltemp/(long)(wREF250B-wREF125B));
wADCOffsetA=2*wREF125A-wREF250A;
wADCOffsetB=2*wREF125B-wREF250B;
hoAD_SW1=1;
hoAD_SW2=1;
DelayUs(312); // Delay 10us
for(k=0;k<16;k++) wChannelSum[k]=0; //clear buffer
for(wSampleCnt=0;wSampleCnt<32;wSampleCnt++)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //Start AD convert
while(AdcRegs.ADCST.bit.SEQ1_BSY==1); //wait convert
asm(" RPT #110 || NOP");
for(k=0;k<16;k++)
{
wChannelSum[k]+=(*(wP1+k))>>4; //read & sum AD result
}
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //reset to AD channel 0
}
//ac signal channel calibration
wR_IsP_Bias=(int)((long)wChannelSum[3]>>5);
wR_IsN_Bias=(int)((long)wChannelSum[4]>>5);
wS_IsP_Bias=(int)((long)wChannelSum[5]>>5);
wS_IsN_Bias=(int)((long)wChannelSum[8]>>5);
wT_IsP_Bias=(int)((long)wChannelSum[9]>>5);
wT_IsN_Bias=(int)((long)wChannelSum[10]>>5);
hoAD_SW1=0;
hoAD_SW2=1;
DelayUs(312); // Delay 10us
for(k=0;k<16;k++) wChannelSum[k]=0; //clear buffer
for(wSampleCnt=0;wSampleCnt<32;wSampleCnt++)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //Start AD convert
while(AdcRegs.ADCST.bit.SEQ1_BSY==1); //wait convert
asm(" RPT #110 || NOP");
for(k=0;k<16;k++)
{
wChannelSum[k]+=(*(wP1+k))>>4; //read & sum AD result
}
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //reset to AD channel 0
DelayUs(625); // Delay 20us
}
//ac signal channel calibration
wRInvVoltSampleMidPoint=(int)(wChannelSum[0]>>5);
wSInvVoltSampleMidPoint=(int)(wChannelSum[1]>>5);
wTInvVoltSampleMidPoint=(int)(wChannelSum[2]>>5);
wRInvLCurrSampleMidPoint=(int)(wChannelSum[3]>>5);
wSInvLCurrSampleMidPoint=(int)(wChannelSum[4]>>5);
wTInvLCurrSampleMidPoint=(int)(wChannelSum[5]>>5);
wSInvDcVoltSampleMidPoint=(int)(wChannelSum[6]>>5);
wRInvDcVoltSampleMidPoint=(int)(wChannelSum[7]>>5);
wRLoadCurrentSampleMidPoint=(int)(wChannelSum[8]>>5);
wSLoadCurrentSampleMidPoint=(int)(wChannelSum[9]>>5);
wTLoadCurrentSampleMidPoint=(int)(wChannelSum[10]>>5);
wTInvDcVoltSampleMidPoint=(int)(wChannelSum[15]>>5);
}
/*********************************************************************
* Function: DelayUs() *
* Description: Implements a time delay. *
* DSP: TMS320F2812 *
* Last Modified: 06/28/02 *
* Include files: none *
* Function Prototype: void DelayUs(volatile Uint16) *
* Useage: DelayUs(Usec); *
* Input Parameters: Uint16 Usec = time delay in microseconds *
* Return Value: none *
* Notes: The execution time of this routine is rough, based upon a *
* 150MHz CPUCLK. It has been tested using all optimization *
* levels of the compiler to give approximately a 1us inner *
* loop. *
*********************************************************************/
void DelayUs( volatile unsigned int Usec )
{
while( Usec-- ) // 1us loop at 150MHz CPUCLK
{
asm(" RPT #139 || NOP");
}
} // end DelayUs()
INT16U swGetUpsInputModule(void)
{
return(wInputModule);
}
INT16U swGetUpsOutputModule(void)
{
return(wOutputModule);
}
void sSysFreqInit(void)
{
INT16U wSysFreqDetectCnt=90;
INT16U wSysFreqChkTime=30;
INT16U wInputPeriod;
while(wSysFreqChkTime>0)
{
if(swGetSinePoint()<4)
{
wInputPeriod=swGetLinePeriodNew();
wSysFreqChkTime--;
if(wInputPeriod>=cPeriod55Hz && wInputPeriod<cPeriod40Hz)
wSysFreqDetectCnt--; //50Hz
if(wInputPeriod<cPeriod55Hz && wInputPeriod>cPeriod70Hz)
wSysFreqDetectCnt++; //60Hz
while(swGetSinePoint()<300){}
}
}
if(swGetEEConvertMode()==true)
{
if(swGetEepromInverterPS()==cDSPPeriod50Hz)
{
sSet50HzParameter();
sSetEepromInverterPS(cFreq50Hz);
}
else if(swGetEepromInverterPS()==cDSPPeriod60Hz)
{
sSet60HzParameter();
sSetEepromInverterPS(cFreq60Hz);
}
}
else if(wSysFreqDetectCnt<80) // 50Hz system
{
sSet50HzParameter();
sSetEepromBypassFHLoss(cFreq70Hz);
sSetEepromBypassFLLoss(cFreq40Hz);
sSetEepromBypassFHBack(cFreq69Hz5);
sSetEepromBypassFLBack(cFreq40Hz5);
sSetEepromLineFHLoss(cFreq70Hz);
sSetEepromLineFLLoss(cFreq40Hz);
sSetEepromLineFHBack(cFreq69Hz5);
sSetEepromLineFLBack(cFreq40Hz5);
sSetEepromBypassFreeRunHLoss(cFreq54Hz);
sSetEepromBypassFreeRunLLoss(cFreq46Hz);
sSetEepromBypassFreeRunHBack(cFreq53Hz5);
sSetEepromBypassFreeRunLBack(cFreq46Hz5);
sSetEepromLineFreqRunHLoss(cFreq54Hz);
sSetEepromLineFreqRunLLoss(cFreq46Hz);
sSetEepromLineFreqRunHBack(cFreq53Hz5);
sSetEepromLineFreqRunLBack(cFreq46Hz5);
sSetEepromInverterPS(cFreq50Hz);
}
else if(wSysFreqDetectCnt>100) // 60Hz system
{
sSet60HzParameter();
sSetEepromBypassFHLoss(cFreq70Hz);
sSetEepromBypassFLLoss(cFreq40Hz);
sSetEepromBypassFHBack(cFreq69Hz5);
sSetEepromBypassFLBack(cFreq40Hz5);
sSetEepromLineFHLoss(cFreq70Hz);
sSetEepromLineFLLoss(cFreq40Hz);
sSetEepromLineFHBack(cFreq69Hz5);
sSetEepromLineFLBack(cFreq40Hz5);
sSetEepromBypassFreeRunHLoss(cFreq64Hz);
sSetEepromBypassFreeRunLLoss(cFreq56Hz);
sSetEepromBypassFreeRunHBack(cFreq63Hz5);
sSetEepromBypassFreeRunLBack(cFreq56Hz5);
sSetEepromLineFreqRunHLoss(cFreq64Hz);
sSetEepromLineFreqRunLLoss(cFreq56Hz);
sSetEepromLineFreqRunHBack(cFreq63Hz5);
sSetEepromLineFreqRunLBack(cFreq56Hz5);
sSetEepromInverterPS(cFreq60Hz);
}
else
{
if(swGetEepromInverterPS()==cDSPPeriod50Hz)
{
sSetEepromInverterPS(cFreq50Hz);
sSet50HzParameter();
sSetEepromBypassFHLoss(cFreq70Hz);
sSetEepromBypassFLLoss(cFreq40Hz);
sSetEepromBypassFHBack(cFreq69Hz5);
sSetEepromBypassFLBack(cFreq40Hz5);
sSetEepromLineFHLoss(cFreq70Hz);
sSetEepromLineFLLoss(cFreq40Hz);
sSetEepromLineFHBack(cFreq69Hz5);
sSetEepromLineFLBack(cFreq40Hz5);
sSetEepromBypassFreeRunHLoss(cFreq54Hz);
sSetEepromBypassFreeRunLLoss(cFreq46Hz);
sSetEepromBypassFreeRunHBack(cFreq53Hz5);
sSetEepromBypassFreeRunLBack(cFreq46Hz5);
sSetEepromLineFreqRunHLoss(cFreq54Hz);
sSetEepromLineFreqRunLLoss(cFreq46Hz);
sSetEepromLineFreqRunHBack(cFreq53Hz5);
sSetEepromLineFreqRunLBack(cFreq46Hz5);
}
else if(swGetEepromInverterPS()==cDSPPeriod60Hz)
{
sSetEepromInverterPS(cFreq60Hz);
sSet60HzParameter();
sSetEepromBypassFHLoss(cFreq70Hz);
sSetEepromBypassFLLoss(cFreq40Hz);
sSetEepromBypassFHBack(cFreq69Hz5);
sSetEepromBypassFLBack(cFreq40Hz5);
sSetEepromLineFHLoss(cFreq70Hz);
sSetEepromLineFLLoss(cFreq40Hz);
sSetEepromLineFHBack(cFreq69Hz5);
sSetEepromLineFLBack(cFreq40Hz5);
sSetEepromBypassFreeRunHLoss(cFreq64Hz);
sSetEepromBypassFreeRunLLoss(cFreq56Hz);
sSetEepromBypassFreeRunHBack(cFreq63Hz5);
sSetEepromBypassFreeRunLBack(cFreq56Hz5);
sSetEepromLineFreqRunHLoss(cFreq64Hz);
sSetEepromLineFreqRunLLoss(cFreq56Hz);
sSetEepromLineFreqRunHBack(cFreq63Hz5);
sSetEepromLineFreqRunLBack(cFreq56Hz5);
}
}
}
void sInitEXTIO(void)
{
setLocRecg();
clearPChgVoltBit();
clearNChgVoltBit();
clearChgOffBit();
}
INT16S swGetwADCOffsetA()
{
return wADCOffsetA;
}
INT16S swGetwADCCoefA()
{
return wADCCoefA;
}
INT16S swGetwREF125A()
{
return wREF125A;
}
INT16S swGetwREF250A()
{
return wREF250A;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -