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

📄 drv_timer0.c.bak

📁 CC1000 Rf modem C codes for philips sLpc213X ARM MCU.
💻 BAK
📖 第 1 页 / 共 2 页
字号:
////calculate Reactive Power Rate(Q),	QP = (Ui*Ir-Ur*Ii)
		ADC_QP = (ADU_Image*ADI_Real - ADU_Real*ADI_Image)/1000;

////calculate Power(S);					SP = sqrt(WP^2+QP^2)
		ADC_SP = ADC_WP*ADC_WP + ADC_QP*ADC_QP;
		ADC_SP = sqrt((double)ADC_SP);

///////////////////////////////////////////////////////////////
		ADC_U_Filter[ADC_FilterP]  = (int16)ADC_UAC;
		ADC_I_Filter[ADC_FilterP]  = (int16)ADC_IAC;
		ADC_WP_Filter[ADC_FilterP] = (int16)ADC_WP;
		ADC_QP_Filter[ADC_FilterP] = (int16)ADC_QP;
		ADC_SP_Filter[ADC_FilterP] = (int16)ADC_SP;
		
		ADC_UL_Filter[ADC_FilterP] = (int16)ADU_DCLevel;
		ADC_IL_Filter[ADC_FilterP] = (int16)ADI_DCLevel;

////
		ADC_FilterP++;
		if(ADC_FilterP >= AD_FILTER_SIZE){
			ADC_FilterP=0;
		}
		
		if(ADC_EventCounter <= AD_FILTER_SIZE){
			ADC_EventCounter++;
		}
		
////
		if((SysRunState==NORMAL_STATE)||(SysRunState==PRINT_STATE)){			//#define AD_SAMPLE_NUM	20
				ADC_Period_mS = AD_SAMPLE_NUM*AD_SPEED_LOW_;	//10 get 100 ad sample within 20/5 seconds
		}
		else{													//test and calibrate
				ADC_Period_mS = AD_SAMPLE_NUM*AD_SPEED_HIGH;	//get 100 ad sample within 10/5 seconds
		}

////////////////////////////////////////////////////////////////////////////////////
		CurVoltageOrg =  0;	CurCurrentOrg = 0;
		CurW_PowerOrg = 0;	CurQ_PowerOrg = 0;
		CurS_PowerOrg = 0;
		CurU_DCLevelOrg = 0;	CurI_DCLevelOrg = 0;
			
		for(i=0;i<AD_FILTER_SIZE;i++){
			CurVoltageOrg += ADC_U_Filter[i];
			CurCurrentOrg += ADC_I_Filter[i];
			CurW_PowerOrg += ADC_WP_Filter[i];
			CurQ_PowerOrg += ADC_QP_Filter[i];
			CurS_PowerOrg += ADC_SP_Filter[i];

			CurU_DCLevelOrg += ADC_UL_Filter[i];
			CurI_DCLevelOrg += ADC_IL_Filter[i];
		}

		CurVoltageOrg = CurVoltageOrg/AD_FILTER_SIZE;
		CurCurrentOrg = CurCurrentOrg/AD_FILTER_SIZE;

		CurW_PowerOrg = CurW_PowerOrg/AD_FILTER_SIZE;
		CurQ_PowerOrg = CurQ_PowerOrg/AD_FILTER_SIZE;
		CurS_PowerOrg = CurS_PowerOrg/AD_FILTER_SIZE;
		
		CurU_DCLevelOrg = CurU_DCLevelOrg/AD_FILTER_SIZE;	// voltage channel level
		CurI_DCLevelOrg = CurI_DCLevelOrg/AD_FILTER_SIZE;	// current channel level

///////////////////////////////////////////////////////////////////////////////////
		if(ADC_EventCounter>AD_FILTER_SIZE){

#ifdef  INCLUDE_DEBUGGING
			Uart0SendString("distribute data to CurInputScale_...");	
#endif
			CurInputScale_U = CurVoltageOrg;	//this two variables only for calibration
			CurInputScale_I = CurCurrentOrg;
		}

///////////////////////////////////////////////////////////////////////////////////
// get the final parameters
		CurVoltageOrg 	= ((CurVoltageOrg * ADC_UUK_Value)+500)/1000;  	//if(CurInput_UU<300) 	CurInput_UU=0;	//force to 0	
		CurCurrentOrg 	= ((CurCurrentOrg * ADC_IIK_Value)+500)/1000;  	//if(CurInput_II<300) 	CurInput_II=0;	//force to 0

		CurW_PowerOrg = CurW_PowerOrg * ADC_WPK_Value;
			if(CurW_PowerOrg<0) CurW_PowerOrg = -CurW_PowerOrg;	//reverse the negative

		CurQ_PowerOrg = ((CurQ_PowerOrg * ADC_QPK_Value)+500)/1000;  		//if(CurInput_QP<300) 	CurInput_QP=0;	//force to 0
			if(CurQ_PowerOrg<0) CurQ_PowerOrg = -CurQ_PowerOrg;	//reverse the negative
	
		CurS_PowerOrg = ((CurS_PowerOrg * ADC_SPK_Value)+500)/1000;  		//if(CurInput_SP<300) 	CurInput_SP=0;	//force to 0
		
		if(CurS_PowerOrg!=0){
			CurPFactorOrg	= CurW_PowerOrg/CurS_PowerOrg; 				//if(CurInput_PF>1000)	CurInput_PF=1000;
		}
		
		CurW_PowerOrg = (CurW_PowerOrg+500)/1000;  					//if(CurInput_WP<300) 	CurInput_WP=0;	//force to 0

// calculation the resistance of load.
		if(CurCurrentOrg != 0){
//			CurRO_LoadOrg  = (   1000*CurVoltageOrg)/CurCurrentOrg;
			CurRO_LoadOrg  = (   1000*2200)/CurCurrentOrg;
			CurLC_LoadOrg  = ((((1000*CurVoltageOrg)/CurCurrentOrg)
								  	   *CurQ_PowerOrg)/CurCurrentOrg);
		}
		
//(1)	(0.1*U)/(0.001*I)*10   =   1000* U/I(*220/U)=1000*220/I		(unit=0.1Ohm)
//(2)	(0.1*QP)/(0.001*I)/(0.001*I)*(0.1*U)/100*10 = 1000QU/I/I	(unit=0.1Ohm)
//													= 1000 U/I*Q/I
///////////////////////////////////////////////////////////////////////////
//// assigned to input channel parameter
		if((ChannelState==1)&&(ADC_EventCounter>AD_FILTER_SIZE)){
#ifdef  INCLUDE_DEBUGGING
			Uart0SendString("distribute data to CurInput_...");	
#endif
			CurInputULevel = CurU_DCLevelOrg;
			CurInputILevel = CurI_DCLevelOrg;

			CurInput_UU  	= CurVoltageOrg;
			CurInput_II  	= CurCurrentOrg;

			CurInput_WP 	= CurW_PowerOrg;
			CurInput_QP 	= CurQ_PowerOrg;

			CurInput_SP 	= CurS_PowerOrg;
			CurInput_PF		= CurPFactorOrg;
		}
//// assigned to output channel parameter
		else if((ChannelState==2)&&(ADC_EventCounter>AD_FILTER_SIZE)){
#ifdef  INCLUDE_DEBUGGING
			Uart0SendString("distribute data to CurOutput_...");	
#endif
			CurOutputULevel = CurU_DCLevelOrg;
			CurOutputILevel = CurI_DCLevelOrg;

			CurOutput_U  	 = CurVoltageOrg;
			CurOutput_I  	 = CurCurrentOrg;

			CurOutput_WP 	 = CurW_PowerOrg;
			CurOutput_QP 	 = CurQ_PowerOrg;

			CurOutput_SP 	 = CurS_PowerOrg;
			CurOutput_PF 	 = CurPFactorOrg;
		}

//// if light off, force all output to zero.
		if((StateValue & LIGHT_ON_FLG_BIT) != LIGHT_ON_FLG_BIT){	// if light is off
#ifdef  INCLUDE_DEBUGGING
			Uart0SendString("force data to zero");
#endif
			CurOutput_U  = 0;	CurOutput_I  = 0;
			CurOutput_WP = 0;	CurOutput_QP = 0;
			CurOutput_SP = 0;	CurOutput_PF = 0;

			OutReadyTimer=POWER_UP_READY_TIME;		//control alarm message
		}
		
		
	if(PW_FLAG==1)									//掉电报警的时候,所有电量清零
	{
		CurInputULevel  = 0;	CurInputILevel  = 0;
		CurInput_UU  	= 0;	CurInput_II   	= 0;
		CurInput_WP 	= 0;	CurInput_QP  	= 0;
		CurInput_SP 	= 0;	CurInput_PF		= 0;
		CurOutput_U		= 0;	CurOutput_I		= 0;
		CurOutput_WP	= 0;	CurOutput_QP 	= 0;
		CurOutput_SP	= 0;	CurOutput_PF 	= 0;
		
		
	}

///////////////////////////////////////////////////////////////////////////////
//// alarm bits setting area,	//uint16 StateValue;
	if(((StateValue&LIGHT_ON_FLG_BIT)==LIGHT_ON_FLG_BIT)&&(OutReadyTimer==0)){

//   I alarm
		if(CurInput_II < I_ALARM_LOW_LIMIT){	StateValue = StateValue|  IIII__ALARM_TYPE; }
		else{									StateValue = StateValue&(~IIII__ALARM_TYPE); }
//   U alarm
		if(CurInput_UU < U_ALARM_LOW_LIMIT){	StateValue = StateValue|  UUUU__ALARM_TYPE; }
		else{									StateValue = StateValue&(~UUUU__ALARM_TYPE);}
//   PF alarm
		if(CurInput_PF < PF_ALARM_LOW_LIMIT){	StateValue = StateValue|  PFPF__ALARM_TYPE; }
		else{									StateValue = StateValue&(~PFPF__ALARM_TYPE);}
	}
}

/////////////////////////////////////////////////////////////////////////////
void AD_ChannelSwitch(void)
{

////set the sample ok flag		
	if((ADCmS_Counter>=(AD_SAMPLE_NUM-1))&&	//check if 20 samples is ready
	   (ADC_Flag     != AD_AVAILABLE   )){	//check if the data last time already be used.

////(1) in normal and test state, change the ad channel.
		if((SysRunState==NORMAL_STATE)||
		   (SysRunState==TEST_STATE)  ||
		   (SysRunState==PRINT_STATE)){

			if(ADC_ChannelTimer<=Channel_Input_Time){
				if(ChannelState!=1){
//#ifdef  INCLUDE_DEBUGGING				
					Uart0SendString("To input U channel");
//#endif
					IO1CLR=DT__P1_31;		//measuring the input voltage
					ADC_EventCounter=0;
					ADC_FilterP=0;
					ChannelState=1;
					
				}
				
			}
			else{
				if(ChannelState!=2){
//#ifdef  INCLUDE_DEBUGGING
					Uart0SendString("To output U channel");
//#endif
					IO1SET=DT__P1_31;		//measuring the output voltage
					ADC_EventCounter=0;
					ADC_FilterP=0;
					ChannelState=2;
					if(ADC_Channel_num>0) 
					{
						ADC_Channel_num--;
						Channel_Max_Time=2*Channel_Input_Time;
					}
					else Channel_Max_Time=Channel_Input_Time+Channel_Output_Time;
				}
			}
			
		}
////(2) in calibration state, don't change the ad channel.
		else if(SysRunState==CALIBRATION_STATE){
			if(ChannelState!=1){
//#ifdef  INCLUDE_DEBUGGING			
				Uart0SendString("To input U channel");
//#endif				
				IO1CLR=DT__P1_31;		// measuring the input voltage
				ADC_EventCounter=0;		// before calibration
				ADC_FilterP=0;
				ChannelState=1;
				
			}
		}
////(3) in unknown state
		else{
			SysRunState=NORMAL_STATE;
//#ifdef  INCLUDE_DEBUGGING			
			Uart0SendString("Change RunState to NORMAL_STATE");	
//#endif			
		}
	}	
}
		
/////////////////////////////////////////////////////////////////////////////
void ClearFilter(void)
{
uint8 i;

	ADC_Period_mS = AD_SAMPLE_NUM*AD_SPEED_HIGH;	//get 100 ad sample within 10/5 seconds
	ADCmS_Counter=0;
	ADC_EventCounter=0;
	ADC_FilterP=0;

	ADC_Flag = AD_AVAILABLE+1;

	for(i=0;i<AD_FILTER_SIZE;i++){

		ADC_U_Filter[i]  = 0;		ADC_I_Filter[i]  = 0;
		ADC_WP_Filter[i] = 0;		ADC_QP_Filter[i] = 0;
		ADC_SP_Filter[i] = 0;
		ADC_UL_Filter[i] = 0;		ADC_IL_Filter[i] = 0;
	}

////
		CurInputULevel  = 0;		CurInputILevel  = 0;
		CurInput_UU  	 = 0;		CurInput_II   	= 0;
		CurInput_WP 	 = 0;		CurInput_QP  	= 0;
		CurInput_SP 	 = 0;		CurInput_PF		= 0;

		CurOutputULevel = 0;		CurOutputILevel = 0;
		CurOutput_U  	 = 0;		CurOutput_I  	= 0;
		CurOutput_WP 	 = 0;		CurOutput_QP 	= 0;
		CurOutput_SP 	 = 0;		CurOutput_PF 	= 0;
}

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void TimerInitialize(void)
{
/* 定时器0初始化 */
	T0TC   = 0;				/* 定时器设置为0							*/
	T0PR   = 0;				/* 时钟不分频								*/
	T0MCR  = 0x03;			/* 设置T0MR0匹配后复位T0TC,并产生中断标志	*/
	T0MR0  = LPC_FPCLK /1000;	/* 1/1000秒钟定时							*/
	T0TCR  = 0x01;			/* 启动定时器								*/
	
/* 设置定时器0中断IRQ */
//	VICIntSelect = 0x00000000;			/* 所有中断通道设置为IRQ中断*/
	VICVectCntl5 = 0x20|INT_TIMER0;		/* 设置定时器0中断通道分配最高优先级*/
	VICVectAddr5 = (uint32)IRQ_Timer0;	/* 设置中断服务程序地址*/
	VICIntEnable = 1<<INT_TIMER0;		/* 使能定时器0中断*/
}

/*************************************************************************
** 函数名称 :main()
** 函数功能 :进行3通道电压ADC转换,并把结果转换成电压值,发送到串口。
** 调试说明 :在config.h中包含stdio.h
**************************************************************************/
void ADC_Init(void)
{
	
	PINSEL1=(PINSEL1&(~(0x03<<26)))|(1<<26);	// P0.29连接到AD0.2
	PINSEL1=(PINSEL1&(~(0x03<<28)))|(1<<28);	// P0.30连接到AD0.3
}

//////////////////////////////////////////////////////////////////////////
void TestADC(void){
uint8 i;
uint32 dbuff=0;
char   dbuffer[100];

	Uart0SendString("TestADC()");	
	RF_SendString  ("TestADC()");
////
	for(i=0;i<AD_SAMPLE_NUM;i++){

		ADI[i]=(ADI[i]>>6)&0x3ff;	// 10 bits A/D
		ADI[i]= ADI[i]*3000;		// 参考电压3000 mV
		ADI[i]= ADI[i]/1024;
		dbuff+= ADI[i];		// A/D sample working buffer for I
	}
	dbuff=dbuff/AD_SAMPLE_NUM;
	sprintf(dbuffer,"ADC(I)=%d(mV)",dbuff);
	Uart0SendString(dbuffer);	RF_SendString  (dbuffer);

////
	for(i=0;i<AD_SAMPLE_NUM;i++){

		ADU[i]=(ADU[i]>>6)&0x3ff;	// 10 bits A/D
		ADU[i]= ADU[i]*3000;		// 参考电压3000 mV
		ADU[i]= ADU[i]/1024;
		dbuff+= ADU[i];		// A/D sample working buffer for I
	}
	dbuff=dbuff/AD_SAMPLE_NUM;
	sprintf(dbuffer,"ADC(U)=%d(mV),",dbuff);
	Uart0SendString(dbuffer);	RF_SendString  (dbuffer);
}
//////////////////////////////////////////////////////////////////////////
// end of file //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -