📄 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 + -