📄 cs5463.c
字号:
g_iAdcPulseUpdateFlag =0;
//************SSP接收中断********************
pgsVic->regIntSelect |=0x01 << INT_CH_SSP1; //as FIQ
pgsVic->regIntEnable = 0x01 << INT_CH_SSP1;
//********初始化脉冲计数中断,通过P0口对应的管脚,引起下降沿中********
//P0,P2口中断与EINT3共用一个中断SLOT
// pgsFPort0->regDirCtrl &= 0X181FFFFF; //P21 P22 P23 P24 P25 P26 P29 P30 P31 as inut
pgsFPort0->regDirCtrl &= ~ (P21|P22|P23|P24|P25|P26|P29|P30|P31) ; //P21 P22 P23 P24 P25 P26 P29 P30 P31 as inut
pgsPort0Int->regFallingEnable |= P22|P23|P25|P26|P30|P31; // EPA EQA EPB EQB EPC EQC falling edge
pgsPort0Int->regIntClr = P22|P23|P25|P26|P30|P31;
pgsVic->regIntSelect |= (0x01 << INT_CH_EXTINT3); //as FIQ
pgsVic->regIntEnable =0x01 << INT_CH_EXTINT3;
//**********初始化外部中断1,AD转换完成中断**********
pgsExInt->regMode |= 0x02; //EXINT1 edge sensitive
pgsExInt->regPolar &= 0xFD; //EXINT1 //falling edge sensitive
pgsExInt->regIntFlag = 0x02;// mod zhw 2007-4-19 pgsExInt->regIntFlag |= 0x02 this bit in the EXTINT register must be cleared!
pgsVic->regIntSelect |=0x01 << INT_CH_EXTINT1; //as FIQ
pgsVic->regIntEnable =0x01 << INT_CH_EXTINT1;
pgsSsp1->regIntClr = 0x03; // mod zhw 2007-4-19 pgsSsp1->regIntClr |= 0x03; //clear the RORIC and RTIC bits
pgsSsp1->regIntMaskSetClr = 0x04;//interrupt,when Rx FIFO is at least half full
// Delay(10);
}
void ReadAddressData(DWORD dwAddress, DWORD *pRet)
{
DWORD *ptr;
ptr = (DWORD*)dwAddress;
*pRet = *ptr;
}
void ReadADData(BYTE byReg, DWORD *pdwResult)
{
pgsVic->regIntEnableClr = 0x01 << INT_CH_EXTINT1;
pgsVic->regIntEnableClr = 0x01 << INT_CH_EXTINT2;
pgsVic->regIntEnableClr = 0x01 << INT_CH_EXTINT3;
pgsVic->regIntEnableClr = 0x01 << INT_CH_SSP1;
pgsFPort0->regDirCtrl |=ADCSA| ADCSB | ADCSC |ADCSO |ADRST; //out
pgsFPort0->regOutSet = ADCSA |ADCSB |ADCSC | ADCSO;//disable chipA chipB,chipC, cs5460A
// pgsFPort0->regOutClr = ADRST; //hardware reset cs5460a
InitSSp1();//初始化SSP1口
SelectAdc(0);
ReadAdc24Bits(byReg, pdwResult);
UnSelAdc(0);
}
BOOL IsMainPowerOff(void)
{
return (!(pgsFPort2->regPinVal & P12));
}
//***********************************************************************************
void Calibration(BYTE byCmd, BYTE byReg, DWORD *pdwResult, INT32 iIndex)
{
DWORD dwStatus;
DWORD dwTemp;
float fRealVal;
DWORD *pdwResult2;
SelectAdc(iIndex);
WriteSTATUS(0xffffff);
// WriteAdcCommand(0xa0);
WriteAdcCommand(byCmd);
while(1)
{
Delay(30);
ReadAdc24Bits(STATUSR,&dwStatus);
if(dwStatus & 0x800000) //N coversions is complete
{
WriteSTATUS(0x800000); //
break;
}
}
ReadAdc24Bits(byReg,pdwResult);
UnSelAdc(iIndex);
}
/* 针对AD标定的初始化函数
1.与InitAdc的区别在于,本函数中不使能中断
*/
static void InitAdc_coef(SADCoef *pADCoef,INT32 iChipSum) //pdwOffset,pdwGain==NULL时,gain及offset采用CS5460A硬件复位时的默认参数
{
#define DEBUG_ADC_COEF
INT32 i;
DWORD dwTemp;
INT32 iTemp;
//为了安全期见,在初始化AD之前,先把用到的中断禁止,
pgsVic->regIntEnableClr = 0x01 << INT_CH_EXTINT1;
pgsVic->regIntEnableClr = 0x01 << INT_CH_EXTINT2;
pgsVic->regIntEnableClr = 0x01 << INT_CH_EXTINT3;
pgsVic->regIntEnableClr = 0x01 << INT_CH_SSP1;
pgsFPort0->regDirCtrl |=ADCSA| ADCSB | ADCSC |ADCSO |ADRST; //out
pgsFPort0->regOutSet = ADCSA |ADCSB |ADCSC |ADCSO;//disable chipA chipB,chipC, cs5460A
pgsFPort0->regOutClr = ADRST;
InitSSp1_1();//初始化SSP1口
//脱离硬件复位状态
Delay(60); //must be at least 60ms, delay wait
pgsFPort0->regOutSet = ADRST;
Delay(60); //this line must use for safe reset
for(i=0; i<iChipSum; i++)//iChipSum
{
SelectAdc(i);
if(i<3) //前三片为CS5463
{
//WriteAdc24Bits(,0x000003);//写页地址寄存器为0
WriteSTATUS(0xffffff);
WriteAdc24Bits(MASKR,0x000000); //WriteAdc24Bits(MASKR,0x100000);
//add zhw 2007-4-17
iTemp = pADCoef->iPhaseOffset << 17;
iTemp |=0x001001; //k=1 、下降沿(INT 通常处于高电平)
WriteAdc24Bits(CONFR,iTemp);////k=1 、下降沿(INT 通常处于高电平)
// WriteAdc24Bits(CONFR,0x001001); //k=1 、下降沿(INT 通常处于高电平)
WriteAdc24Bits(CYCCONT,2000); //N=2000;
// WriteAdc24Bits(MODER,0x000061); //;操作寄存器
WriteAdc24Bits(MODER,0x000001); //;操作寄存器
pADCoef++;
}
else //初始化CS5460A
{
WriteSTATUS(0xffffff);
WriteAdc24Bits(MASKR,0x000000); //
WriteAdc24Bits(CONFR,0x000061); //k=1 、低电平
WriteAdc24Bits(CYCCONT,2000); //N=2000;
}
UnSelAdc(i);
}
}
//#################################################################################################
BOOL AdcVoltCal(SADCoef *pADCoef,INT32 iChipSum)
{
BYTE i;
int iIndex;
SADCoef *pADCoefTemp;
DWORD dwValue[2];
INT32 iValue;
pADCoefTemp = pADCoef;
iIndex = 0 ;
while(1)
{
Print("\r\n HRJ803 标定程序");
Print("\r\n1. 三相电压电流标定");
Print("\r\n2. 零序电压电流标定");
Print("\r\n3. 直流量的标定");
Print("\r\n4. PT100温度传感器的标定");
Print("\r\nx. 退出");
pADCoefTemp = pADCoef;
iIndex =0;
switch(GetChar())
{
case '1':
InitAdc_coef(pADCoef,iChipSum);
while(1)
{
Print("\r\n << 三相电压电流标定 >>");
// Print("\r\n 1 A相、B相电压的交流偏置标定");
Print("\r\n 1 A相、B相电压的直流偏置标定");
Print("\r\n 2. A相、B相电压的交流增益标定 ");
Print("\r\n 3 C相电压的直流偏置标定");
// Print("\r\n 3. C相电压的交流偏置标定");
Print("\r\n 4. C相电压的交流增益标定 ");
Print("\r\n 5. A相、B相、C相电流的直流偏置标定");
// Print("\r\n 5. A相、B相、C相电流的交流偏置标定");
Print("\r\n 6. A相、B相、C相电流的交流增益标定");
Print("\r\n x. 退出");
pADCoefTemp = pADCoef;
i = GetChar();
iIndex =0;
switch(i)
{
//*****************以下为电压标定*****************
case '1':
Print("\r\n A相、B相电压的直流偏置标定");
Print("\r\n A相、B相电压输入为0.0V, 就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
for(i=0; i<2; i++)
{
Calibration(0xd1, VDCOFF,&pADCoefTemp->dwVDCOffset,i); //0xd5=VAC offset
pADCoefTemp++;
}
Print("标定成功...");
break;
case '2':
Print("\r\n A相、B相电压的交流增益标定 ");
Print("\r\n A相、B相电压 输入 AC 250.0V, 就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
for(i=0; i<2; i++)
{
Calibration(0xd6, VGN,&pADCoefTemp->dwVACGain, i); //0xd6=VAC gain
pADCoefTemp++;
}
Print("标定成功...");
break;
/* case '1':
Print("\r\n A相、B相电压的交流偏置标定");
Print("\n A相、B相电压输入为0.0V, 就绪后键入 'g':"); pADCoefTemp = pADCoef;
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
for(i=0; i<2; i++)
{
Calibration(0xd5, VACOFFR,&pADCoefTemp->dwVACOffset,i); //0xd5=VAC offset
iIndex++;
pADCoefTemp++;
}
Print("标定成功...");
break;
*/
case '3':
Print("\r\n C相电压的直流偏置标定");
Print("\r\n C相电压电压输入为0.0V, 就绪后键入 'g':");
pADCoefTemp = pADCoef +2;
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
Calibration(0xd1, VDCOFF,&pADCoefTemp->dwVDCOffset,2); //0xd5=VAC offset
Print("标定成功...");
break;
case '4':
Print("\r\n C相电压的交流增益标定 ");
Print("\r\n C相电压电压输入为250.0V, 就绪后键入 'g':");
pADCoefTemp = pADCoef +2;
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
Calibration(0xd6, VGN,&pADCoefTemp->dwVACGain, 2);
Print("标定成功...");
Print("\r\n 如果要保存以上的标定参数,请键入 'y';否则复位系统:");
while (GetChar() != 'y') OSTimeDly(10);
SaveParam((DWORD)&p_gcSysParam->sADCoef[0],(BYTE*)pADCoef,sizeof(SADCoef)*3);
break;
/* case '3':
Print("\r\n C相电压的交流偏置标定");
Print("\n C相电压输入为0, 就绪后键入 'g':");
pADCoefTemp = pADCoef + 2;
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
Calibration(0xd5, VACOFFR,&pADCoefTemp->dwVACOffset,2); //0xd5=VAC offset
// Print("\r\n 如果要保存以上的标定参数,请键入 'y';否则复位系统:");
// while (GetChar() != 'y') OSTimeDly(10);
// SaveParam((DWORD)&p_gcSysParam->sADCoef[0],(BYTE*)pADCoef,sizeof(SADCoef)*3);
break;
*/
//*****************以下为电流标定*****************
case '5':
Print("\r\n A相、B相、C相电流的直流偏置标定");
Print("\r\n A B C相电流输入为0.0A,就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
for(i=0; i<3; i++)
{
Calibration(0xc9, IDCOFF, &pADCoefTemp->dwIDCOffset, i); //0xcd=IAC offset
iIndex++;
pADCoefTemp++;
}
Print("标定成功...");
break;
case '6':
Print("\r\n A相、B相、C相电流的交流增益标定 ");
Print("\r\n A B C相电流输入为6.00A, 就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
for(i=0; i<3; i++)
{
Calibration(0xce, IGN, &pADCoefTemp->dwIACGain, i); //0xce=IAC gain
iIndex++;
pADCoefTemp++;
}
Print("标定成功...");
Print("\r\n 如果要保存以上的标定参数,请键入 'y';否则复位系统:");
while (GetChar() != 'y') OSTimeDly(10);
SaveParam((DWORD)&p_gcSysParam->sADCoef[0],(BYTE*)pADCoef,sizeof(SADCoef)*3);
break;
/* case '5':
Print("\r\n A相、B相、C相电流的交流偏置标定");
Print("\n A B C相电流输入为0.00A,就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
for(i=0; i<3; i++)
{
Calibration(0xcd, IACOFFR, &pADCoefTemp->dwIACOffset, i); //0xcd=IAC offset
iIndex++;
pADCoefTemp++;
}
//Print("\r\n 如果要保存以上的标定参数,请键入 'y';否则复位系统:");
//while (GetChar() != 'y') OSTimeDly(10);
//SaveParam((DWORD)&p_gcSysParam->sADCoef[0],(BYTE*)pADCoef,sizeof(SADCoef)*3);
break;
*/
case 'x':
break;
default:
break;
}
if(i == 'x')
{
break;
}
}
break;
case '2':
InitAdc_coef(pADCoef,iChipSum);
while(1)
{
Print("\r\n << 零序电压电流标定 >>");
Print("\r\n 1 零序电压交流偏置标定");
Print("\r\n 2. 零序电压交流增益标定");
Print("\r\n 3. 零序电流交流偏置标定");
Print("\r\n 4. 零序电流交流增益标定");
Print("\r\n x. 退出零序标定");
pADCoefTemp = pADCoef +3;;
i = GetChar();
iIndex =3;
switch(i)
{
case '1':
Print("\r\n 零序电压交流偏置标定");
Print("\r\n零序电压输入为0V,就绪后键入'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
Calibration(0xd5, VACOFFR,&pADCoefTemp->dwVACOffset,iIndex); //0xd5=VAC offset
Print("标定成功...");
break;
case '2':
Print("\r\n零序电压交流增益标定 ");
Print("\r\n零序电压输入 250.0V, 就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
Calibration(0xd6, VGN,&pADCoefTemp->dwVACGain, iIndex); //0xd6=VAC gain
break;
case '3':
Print("\r\n零序电流交流偏置标定");
Print("\r\n零序电流输入为0A,就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
Calibration(0xcd, IACOFFR, &pADCoefTemp->dwIACOffset, iIndex); //0xcd=IAC offset
Print("标定成功...");
break;
case '4':
Print("\r\n 零序电流交流增益标定");
Print("\r\n零序电流输入为6.00A, 就绪后键入 'g':");
while (GetChar() != 'g') OSTimeDly(10);
Print("\r\n 请等待几秒钟...");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -