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

📄 ade7758.c

📁 ade7758 测量三项参数初始化和计算的源代码
💻 C
字号:
/***********************************************************88
           ADE778的相关程序
**************************************************************/
#include<ADE7758.h>
#include<stdio.h>
#include<reg52.h>
//注意这些标号都是针对7758的如果是CPU放入话有些刚好相反
sbit IRQ  = P2^0;
sbit CS   = P2^1;
sbit CLK  = P2^3;
sbit DIN  = P2^5;
sbit DOUT = P2^7;
/*****************************************************************
             电压有效值(RMS)测量
        ADC 部分的参考电压为2.385V			  
*****************************************************************/
unsigned long M_Volt_Init(unsigned char PH_X)
{
	unsigned long Vrms = 0;
	unsigned int Voffset = 0;
	unsigned char flag = 0;	
	unsigned int  tee = 0;
	CS = 0;	
	// 操作寄存器配置
	//shift_in(OPMODE&0xff);
	//shift_in(0x03);	//有功,无功对应管脚输出计数脉冲
	//设置可编程增益寄存器	   这个放大器位于输入端
	shift_in(GAIN|0x80);delay(5);
	shift_in(0x20);delay(5);//input*2->ADC Block
	//0x00:input*1  0x20:input*2  0x40:input*4  for voltage channel
	//A相有效值测量增益寄存器设置  该寄存器为12位
	shift_in((AVRMSGAIN+PH_X)|0x80);delay(10);
	shift_in(0x07);delay(10);
	shift_in(0xff);delay(5);   //ADC_OUTPUT = input*1.5  */
	/* */
	shift_in(AVRMSGAIN+PH_X);delay(5);
	tee = shift_out();delay(5);
	tee <<=8;					  
	tee |= shift_out();delay(10); 
	shift_in(0x0d+PH_X);delay(5);
	Vrms  = (unsigned long)shift_out();delay(5);
	Vrms <<=8;
	Vrms |= (unsigned long)shift_out();delay(5);
	Vrms <<=8;
	Vrms |= (unsigned long)shift_out();delay(5);
	//读取校正寄存器的值对电压RMS校正  注意这个校正结果是个有符号数
	shift_in(AVRMSOS+PH_X);delay(5);
	Voffset = (unsigned int)shift_out();delay(5);
	Voffset <<= 8;
	Voffset |= (unsigned int)shift_out();delay(5);
	if(Voffset&0x0800)
		{
			Voffset &= 0x07ff;//消去符号位的影响
			Vrms -= (unsigned long)Voffset*64;
		} 
    else
		Vrms += (unsigned long)Voffset*64; 
	Vrms /= 3;
	CS = 1;
	return Vrms;
}
/********************************************************
				电流有效值(CRMS)测量	
电流校正寄存器的校正里面有乘法和开方 51实现有些困难啊
而且电流较输入端扩大了1.5倍
*********************************************************/
unsigned long M_Cur_Init(unsigned char PH_X)
{
  	unsigned long Crms;
	unsigned int Coffset = 0;
	unsigned char flag = 0;
	CS = 0;
	//设置可编程增益寄存器	   这个放大器位于输入端
	shift_in(GAIN|0x80);delay(10);
	shift_in(0x80);delay(10);//input*1->ADC Block  0.5V input gain = 1
	//
	shift_in((AIGAIN+PH_X)|0x80);delay(10);
	shift_in(0x07);delay(10);
	shift_in(0xFF);delay(10);//		ADC_OUTPUT*1.5
	//读取电流有效值
	shift_in(AIRMS+PH_X);delay(10);
	Crms = (unsigned long)shift_out();delay(10);
	Crms <<= 8;
	Crms |= (unsigned long)shift_out();delay(10);
	Crms <<= 8;
	Crms |= (unsigned long)shift_out();delay(10);
	Crms /= 15;
	Crms *= 10;
	CS = 1;
	 return Crms;
}
/*****************************************************8
                     频率测量
			频率寄存器是12位的
*********************************************************/
unsigned int M_freq(void)
{   unsigned int m_freq=0;
    //unsigned char ee3=0;
	CS = 0;
   //先写测量寄存器  确定用哪一相电压作为基准
	shift_in(MMODE|0x80);
	delay(10);
	shift_in(0x02);	 	delay(10); //0x00  Phase A  0x01  Phase B  0x02 Phase C 
	/*测试
	shift_in(LCYCMODE);delay(10);
	ee3 = shift_out();delay(10);*/
   // 再写测量项目寄存器
	shift_in(LCYCMODE|0x80);	delay(10);
	shift_in(0x80);	delay(10);// 0x80  测周期 0x00 测频率
   //读取频率值
   shift_in(FREQ);
   delay(10); 
   m_freq = (unsigned int)shift_out();//
   m_freq <<=8;
   m_freq = m_freq+(unsigned int)shift_out(); //
   CS = 1;
   return m_freq;	
}
/***************************************************************8
					温度测量
*******************************************************/
unsigned char M_tem(void)
{
	unsigned char tem=0;
	CS = 0;
	shift_in(TEMP);
	delay(20);  
   tem= shift_out();
	CS = 1;
	return tem;
}
/******************************************************
  功能:向ADE7758中写入数据  参数为要写入的 8位无符号型数据
********************************************************/
void shift_in(unsigned char data_in)
 {
 	unsigned char in_i=0;
	for(in_i = 0;in_i<8;in_i++)
	{
		DIN = 0;
		CLK = 1;
		_nop_();
		if(0x80&data_in)DIN = 1;
		data_in<<=1;
		_nop_();
		CLK = 0;//下降沿写入数据
		_nop_();
	}
}
/******************************************************
  功能:从ADE7758中读取数据  返回值为 8位无符号型
********************************************************/
unsigned char shift_out()
{	
	unsigned char out_i=0,data_out=0;
	DOUT = 0;
		CLK = 0;
	for(out_i=0;out_i<8;out_i++)
	{
		CLK = 1;  //上升沿移出数据
		_nop_();
		data_out<<=1;//
		if(DOUT == 1)
			data_out |= 0x01;
		else 
			data_out &= 0xfe;
		_nop_();
		CLK = 0;
		
	}
	return data_out;
}
/********************************************
   串口初始化
*******************************************/
void Init_RS232()
{
   ES = 0;
   TMOD = 0x20;//
   SCON = 0x50;
   TH1 = 0xfd;
   TL1 = 0xfd;//9600
   RI = 0;
   TI = 0;

   TR1 =1;
   EA = 1;
   ES = 1;
}
/**************************************
         串口发送字符函数
***************************************/
void Send_Data(unsigned char result)
{
//	printf("The result is: ");
	TI = 1;
	SBUF = result;
	while(!TI);
	TI =0;
}
void delay(unsigned char dell)
{	
     
	while(dell--) 
       _nop_();
} 	

⌨️ 快捷键说明

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