⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cs5463.c

📁 著名的CS5463抄表模块
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -