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

📄 ade7758.c

📁 This the Firmware code for the ADE7758 for the PIC Micro controller for the computation of three pha
💻 C
字号:

void main()
{
	1. char *ptr3;
	2. SYSTEM_init();
	3. UART_1_CPutString(" ADE 7758 Measurement\n\n\r");
	4. ADE7758_init();	

	while(1)
	{	
		//phaseA();

	1.	write_8bit(0x97,0x0D);// LCYMODE reg for Pahse A
		delay(20);
	2.	write_16bit(0x9C,100); // No of Half Line cycles		
		delay(20);
	3.	read_24bit(0x1A);// Restting the Status Register 
	4.	while( !((read_24bit(0x19)) & 0x1000));  // Checking the LENGRY bit ie energy accumulted 
	5.		read_16value = read_16bit(0x01);
			awatt = read_16value;
	6.		read_16value = read_16bit(0x07);
			ava = read_16value;
	7.		UART_1_CPutString(" AWEnergy:");		
			UART_1_PutSHexInt(awatt);
			UART_1_PutCRLF();
	8.		UART_1_PutSHexInt(ava);
			UART_1_PutCRLF();
		
	9.	/*f1 = awatt;
		f1 = ((f1/60192.00)*115600.00);
		ptr1 = ftoa(f1,&sta1);
		if(!sta1)
		{
		UART_1_PutString(ptr1);
		UART_1_PutCRLF();
		}*/
		read_24bit(0x1A); //Restting the Status Register		
		UART_1_PutCRLF();
	}
}		

void SYSTEM_init(void)
{
	M8C_EnableGInt;
 	I2C_CFG &= 0xFC;   	
	UART_1_Start(UART_1_PARITY_EVEN);		
	SPIM_1_Start(SPIM_1_SPIM_MODE_0 | SPIM_1_SPIM_MSB_FIRST);
	
	Timer16_1_EnableInt ();
	Timer16_1_WritePeriod(2000);	
	Timer16_1_WriteCompareValue(0);	
	Timer16_1_Start();

}
void ADE7758_init(void)
{
	PRT0DR &= (~4);// salve select P0.3
	
	1. write_8bit(0xA3,0x00);// 00000000b - intergrator disable,0.5v ref // Gain Reg
	delay(50);
	
	2. write_8bit(0xC2,0x00);// Making The WDIV for ZERO for accumulation reg at .524 sec
	delay(50);	
	
	3. write_16bit(0xAA,0x000);// writing the WGAN for 000
	delay(50);
	
	4. write_16bit(0xB9,0x00);// writing the AWATTOS for 000
	delay(50);	
	
	5. write_8bit(0xC4,0x00);//Making The VADIV for ZERO for accumulation reg at 1.05 sec
	delay(50);
	
	6. write_16bit(0xB0,0x000);// writing the AVAG for 000
	delay(50);
	
	7. write_16bit(0xBC,0x00);// writing the AVASOS for 000
	delay(50);
	
	8. write_16bit(0xA7,0x00);// writing the VRMSOSfor 000
	delay(50);
	
	9.write_8bit(0x93,0x04);// 00000100b Enable HPF and LPF is selected 
	delay(50);
	
	10. write_8bit(0x96,0x00);//COMPMODE Reg for AWATTHR FOR VA*IA..ABS disabled and No load Disabled
	delay(50);
	
	
	
} 

void phaseA(void)
{
	1. write_8bit(0x94,0x04);
	2. read_24bitvalue = read_24bit(0x0D);	 // To read the VRMS Reg
	3. f1 = (((read_24bitvalue * 500.00)/0x193504)/1.4145);// for 50 Hz 193504 // 60Hz- 1902BD
	ptr1 = ftoa(f1,&sta1);	
		if(!sta1)
		{
			UART_1_CPutString("\n\rVRMS A  : ");
			UART_1_PutString(ptr1);
			UART_1_PutCRLF();
			f1 =0.0;		
		}			
	
	1.write_8bit(0x93,0x04);// 00000100b Enable HPF and default LPF is selected .//OPMODE Reg
	2. read_24bitvalue = read_24bit(0x0A);	// to Read the IRMS reg
	3. f1 = (((read_24bitvalue * 500.00)/0x1D51C1)/1.4145);// for 50 Hz 193504 // 60Hz- 1902BD
	ptr1 = ftoa(f1,&sta1);	// converting to floating string
		if(!sta1)
		{
			UART_1_CPutString("\n\rIRMS A : ");
			UART_1_PutString(ptr1);
			UART_1_PutCRLF();			
		}
}	

void phaseB(void)
{
	write_8bit(0x94,0x04);
	read_24bitvalue = read_24bit(0x0E);	 // To read the VRMS Reg
	f1 = (((read_24bitvalue * 500.00)/0x193504)/1.4145);// for 50 Hz 193504 // 60Hz- 1902BD
	ptr1 = ftoa(f1,&sta1);	
		if(!sta1)
		{
			UART_1_CPutString("\n\rVRMS B  : ");
			UART_1_PutString(ptr1);
			UART_1_PutCRLF();
			f1 =0.0;		
		}			
	
	write_8bit(0x93,0x04);// 00000100b Enable HPF and default LPF is selected .//OPMODE Reg
	read_24bitvalue = read_24bit(0x0B);	// to Read the IRMS reg
	f1 = (((read_24bitvalue * 500.00)/0x1D51C1)/1.4145);// for 50 Hz 193504 // 60Hz- 1902BD
	ptr1 = ftoa(f1,&sta1);	// converting to floating string
		if(!sta1)
		{
			UART_1_CPutString("\n\rIRMS B : ");
			UART_1_PutString(ptr1);
			UART_1_PutCRLF();			
		}
}		

void intoa(unsigned char *p,int value,int base)
{
	int i=0,j=0,t=0,bit=0;
	
	if(value & 8000)
		value = 0x10000 - value,bit=1;		
	while(value)
	{
		p[j++]=value%10+'0';
		value /= 10;
	}	
	if(bit)
		p[j] = '-';
	p[j+1] =0;
	
	while(i<j)
		t=p[i],p[i]=p[j],p[j]=t,++i,--j;	

}

void transmit_read(unsigned char cmd)
{
	while( ! (SPIM_1_bReadStatus() & SPIM_1_SPIM_TX_BUFFER_EMPTY ) );
	SPIM_1_SendTxData(cmd);
}    	


void transmit_write(unsigned char cmd)
{
	while( ! (SPIM_1_bReadStatus() & SPIM_1_SPIM_TX_BUFFER_EMPTY ) );
	SPIM_1_SendTxData(0);
	SPIM_1_SendTxData(cmd);
}	 

unsigned char receive ()
{
	while( ! (SPIM_1_bReadStatus() & SPIM_1_SPIM_RX_BUFFER_FULL   ) );
	rxvalue  = SPIM_1_bReadRxData();
	return rxvalue;
}	

void write_8bit(unsigned char reg,unsigned char value)
{
	unsigned char rv=0;
	timeoutcnt=0;	
	while(1)
	{
	write_8bit1(reg,value);
	delay(100);
	rv = read_8bit(reg);
	if( (rv == value) || (timeoutcnt > 50))
		break;	
	}
}

void write_8bit1(unsigned char reg1,unsigned char value1)
{
	transmit_write(reg1);
	delay(20);
	receive();	
	transmit_write(value1);
	delay(20);
	receive();
	delay(10);
}


unsigned char read_8bit(unsigned char reg)
{

	unsigned char regvalue0=0;
	transmit_read(reg);
	delay(10);
	receive();	
	transmit_read(0x00);	
	delay(10);
	regvalue0 = receive();
	return(regvalue0);
}

void write_16bit(unsigned char reg,unsigned int value1)
{
	unsigned int read_16value = 0;
	timeoutcnt=0;
	while(1)
	{
	write_16bit1(reg,value1);
	delay(100);
	read_16value = read_16bit(reg);
	if((read_16value == value1) || (timeoutcnt > 50))
		break;
	}
}

void write_16bit1(unsigned char reg,unsigned int value1)
{
	unsigned int read_16value;
	unsigned char a1,a2;
	a1 = value1 >> 8;
	a2 = (unsigned char)value1;
	
	transmit_write(reg);
	delay(10);
	transmit_read(a1);
	delay(10);
	transmit_read(a2);
	delay(10);
	receive();
	delay(10);	
}

void write_24bit(unsigned char reg,long  value1)
{
	unsigned int read_16value;
	unsigned char a1,a2,a3;
	a1 = value1 >> 16;
	a2 = value1 >> 8;
	a2 = (unsigned char)value1;
	
	transmit_write(reg);
	delay(10);
	transmit_read(a1);
	delay(10);
	transmit_read(a2);
	delay(10);
	transmit_read(a3);
	delay(10);
	receive();
	delay(10);	
}


unsigned int read_16bit(unsigned char reg)
{
	unsigned int read_16value=0;
	unsigned char read_value,regvalue1,regvalue2;
	
	transmit_read(reg);
	delay(10);
	receive();
	transmit_read(0x00);
	delay(10);
	regvalue1 = receive();
	delay(10);
	transmit_read(0x00);
	delay(10);
	regvalue2 = receive();
	read_16value = regvalue1;
	read_16value <<= 8;
	read_16value |= regvalue2; 
	regvalue1 = 0;
	regvalue2 = 0;
	return(read_16value);	
}

unsigned long read_24bit(unsigned char reg)
{
	unsigned char regvalue0,regvalue1,regvalue2;
	long read_24bitvalue = 0;
	
	transmit_write(reg);
	delay(10);
	receive();
	transmit_read(0x00);
	delay(10);
	regvalue0 = receive();
	delay(10);
	transmit_read(0x00);
	delay(10);
	regvalue1 = receive();
	delay(10);
	transmit_read(0x00);
	delay(10);
	regvalue2 = receive();
	
	read_24bitvalue = regvalue0 ;
	read_24bitvalue <<=  16;
	read_24bitvalue |= (((unsigned int)regvalue1) << 8);
	read_24bitvalue |= regvalue2;	
	
	regvalue0 = 0;
	regvalue1 = 0;
	regvalue2 = 0;
	return (read_24bitvalue);
}


void delay(long wait)
{
	while(wait--);
}

⌨️ 快捷键说明

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