基于以太网用电监控系统设计案例.docx
- 文档编号:15996115
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:20
- 大小:51.80KB
基于以太网用电监控系统设计案例.docx
《基于以太网用电监控系统设计案例.docx》由会员分享,可在线阅读,更多相关《基于以太网用电监控系统设计案例.docx(20页珍藏版)》请在冰点文库上搜索。
基于以太网用电监控系统设计案例
第1章基于以太网的智能用电监控系统设计
1.1总体框架
本系统以ARM7TDMI-S内核单片机LPC2148为核心,结合CS5460A计量芯片模块、ENC28J60网络接口模块实现用电监控系统设计,其只要配置见表1-1。
表1-1基于以太网的智能用电监控系统硬件配置一览表
模块
主要配置
功能
LPC2148核心板
LPC2148、MAX811
系统的主控
CS5460A计量模块
CS5460A
用电情况的计量
ENC28J60模块
ENC28J60
网络数据传输接口
电源模块
LM2596,LM1117
DC-DC转换芯片
1.2设计原理
该设计中,核心部件是美国CirrusLogic公司生产的电能计量芯片CS5460A。
该芯片具有如下特点:
(1)转换精度高,自身转换精度达到0.1级,可以实现0.2级的测量仪表;
(2)片内功能强,具有瞬时电流、瞬时电压、瞬时功率、电流有效值、电压有效值、功率有效值等;
(3)具有智能“自引导”,不需要控制器
(4)使用方便的SPI接口与控制器通信,外围接口少。
(5)校准过程简单,支持AC或DC系统校准
为了实现以太网数据传输,系统中使用了Microchip公司的独立以太网控制器ENC28J60,该芯片实现了以太网分层结构中的物理层,使用SPI接口与控制器通信,控制器读取到的是最原始的标准以太网帧数据,还需要对该帧数据进行解析才能获得有效的用户数据。
反之,控制器需要用软件按照以太网数据帧协议将需要发送的用户数据一层一层包装好,写入到ENC28J60中,才能由该芯片发送到网络中去。
整体的设计原理是,LPC2148控制CS5460A读取用电情况,并将数据打包写入到ENC28J60中发送到网络。
系统框图见图1-1。
图1-1系统框图
1.3模块设计
1.3.1电源模块设计
该系统中使用了开关型的DC-DC电源转换芯片LM2596和低压差的电压调节器LM1117,设计原理图见图1-1。
图1-1
在使用LM2596时,它的外围器件应根据数据手册的说明来选取,在LM1117的输出应加上电源滤波电容。
1.3.2CS5460A模块
CS5460A结合少量的外围和前置调理电路,在控制器的控制下就可以工作。
本方案使用了互感器处理前端的高压和大电流调理,也可以使用分压和电流采样来处理。
(1)前端调理电路设计
见图1-2,高压调理部分采用了变比为2mA:
2mA的电压互感器ZMPT101B,假设市电维持在220V左右,通过一个120K的电阻,得到1.8mA的电流,为了不超过芯片的测量范围(这一点与CS5460A的寄存器配置有关),在互感器的另一侧串联一个精密电阻将电流信号转换为电压信号。
该电路中的电容电阻组成了滤波电路,对信号进行了初步的模拟滤波。
见图1-2,大电流部分采用了变比为2000:
1的电流互感器ZMCT102,互感器另一侧的一只精密电阻将电流信号转换成了电压信号,电阻的取值与绕线匝数,芯片测量范围有关。
在该电路中也有滤波电路。
对信号进行了初步的模拟滤波。
由于互感器的相差作用,送入CS5460A的信号可能存在相位差,而CS5460A内部有相位补偿的功能,大大提高了有功功率的测量准确性,也弥补了互感器在使用过程中会产生相移的不足。
图1-2前端调理电路
(2)CS5460A最小系统
见图1-3,CS5460A的外围电路非常简单,只要连接晶振和电源即可。
需要注意的是PFMON电源监控这只引脚,该引脚的电压必须维持在3.3V以上,本设计中用电源电压分压得到。
前级调理的信号经VIN+、VIN-、CIN-、CIN+进入CS5460A。
CS5460A的引脚描述参见官方数据手册。
图1-3CS5460A最小系统
1.3.3LPC2148最小系统
LPC2148是基于一个支持实时仿真和嵌入式跟踪的32位ARM7TDMI-SCPU的微控制器,并带有512KB嵌入式的高速Flash存储器。
内置了USB2.0Device、多个UART、SPI、SSP、I2C和40KB的片内SRAM。
多个32位定时器,1个10位ADC、10位DAC、PWM通道、45个高速GPIO口以及多大9个边沿或电平触发的外部中断管脚。
核心板电路主要包括供电、复位、晶振、JATG和USB从设备。
1.供电由底板供电3.3V,核心板载滤波电容和LED指示灯。
图1-4
2.所有MCU均有一个复位逻辑,它负责将MCU初始化为某个确定的状态,复位信号会使MCU初始化为某个确定的状态,所以这个信号的稳定性非常重要。
该系统采用手动复位,复位使用复位芯片MAX811,MAX811结合简单的外围就可以组成复位电路,输出端连接至CPU的复位引脚。
图1-5
3.MCU需要晶体振荡器来提供一个时钟信号,这里采用12M晶振,RTC时钟也需要晶振电路,这里采用32.768K,核心板上还有一个JTAG接口电路。
图1-6
4.LPC2148带有USB从设备控制器,只要在MCU外围加上这么一个USB从设备
接口,就可以实现USB通信。
图1-7
5.将CPU其他功能性引脚外扩;所有VDD连接至3.3V电源(注意加上滤波电容,使电源更加稳定);所有VSS和VSSA连接至电源地;VDDA和VDD之间用电感隔离;VREF是AD/DA的参考电压,可以用TL431组成一个基准源,也可以直接连接至3.3V电源。
VBAT是RTC时钟电源,可以直接连接至3.3V电源,也可以在板子上加上纽扣电池,一直给它供着电。
需要注意的I2C功能引脚和P0.14引脚,请仔细阅读引脚描述。
1.3.4ENC28J60模块
图1-8
上图为ENC28J60的典型应用电路,在其他系统中可以移植使用,只需修改相应的驱动程序。
ENC28J60引脚简单,SPI接口与控制器通信,输出与RJ-45接口相联,ENC28J60具有上电复位的功能,初始化过程需要10ms左右,为了ENC28J60的可靠复位,将复位引脚接到了控制器的IO上。
需要特别指出的是,ENC28J60的内部模拟电路需要在RBIAS引脚与地之间接一个2K的电阻。
1.4软件设计
系统软件主要包括了系统初始化,CS5460A转换数据、ENC28J60传输数据、下位机显示,人机交互。
其中系统初始化包括了LPC2148初始化、CS5460A配置、ENC28J60初始化、EEPROM读写测试。
1.4.1LPC2148初始化
LPC2148在上电复位后应进行PLL的初始化。
初始化代码如下:
voidPLL_Init(void)
{
PLLCON=1;
#if((Fcclk/4)/Fpclk)==1
VPBDIV=0;
#endif
#if((Fcclk/4)/Fpclk)==2
VPBDIV=2;
#endif
#if((Fcclk/4)/Fpclk)==4
VPBDIV=1;
#endif
#if(Fcco/Fcclk)==2
PLLCFG=((Fcclk/Fosc)-1)|(0<<5);
#endif
#if(Fcco/Fcclk)==4
PLLCFG=((Fcclk/Fosc)-1)|(1<<5);
#endif
#if(Fcco/Fcclk)==8
PLLCFG=((Fcclk/Fosc)-1)|(2<<5);
#endif
#if(Fcco/Fcclk)==16
PLLCFG=((Fcclk/Fosc)-1)|(3<<5);
#endif
PLLFEED=0xaa;
PLLFEED=0x55;
while((PLLSTAT&(1<<10))==0);
PLLCON=3;
PLLFEED=0xaa;
PLLFEED=0x55;
//Memorymapinitflashmemoryismapedon0address
MEMMAP_bit.MAP=1;
}
1.4.2CS5460A配置
CS5460A的操作主要是通过一个SPI接口进行数据读写操作。
CS5460A与单片机实现数据通信的底层函数包括:
externvoidPort_Init(void);//LPC2148与CS5460A通信的端口初始化
staticvoidCS5460_Write_Byte(UINT8dat);//写一字节到CS5460A中
staticUINT8CS5460_Read_Byte(void);//从CS5460A中读取一字节
externvoidCS5460_WriteCommand(UINT8CS5460_command);//写命令到CS5460A中
externvoidCS5460_ReadReg(UINT8CS5460_reg,UINT8*p);//读取CS5460A的内部寄存器数据
externvoidCS5460_WriteReg(UINT8CS5460_reg,UINT8*p);//写CS5460A的内部寄存器
内部包括状态寄存器、配置寄存器、控制寄存器、校准寄存器,数据寄存器等16个寄存器,要对特定的寄存器写入适当的值才能完成配置。
内部寄存器的具体内容参见CS5460A的官方数据手册。
voidCS5460_Init(void)
{
//IO1DIR|=SCK|CS|SDI|RESET;
Port_Init();
IO1CLR|=CS;
IO1CLR|=RESET;
Delay_1ms(10);
IO1SET|=RESET;
CS5460_WriteCommand(SYNC1);
CS5460_WriteCommand(SYNC1);
CS5460_WriteCommand(SYNC1);
CS5460_WriteCommand(SYNC0);
}
voidCS5460_Config(void)
{
UINT8buf[3];
buf[0]=0x00;//GI=1电流50增益
buf[1]=0x00;
buf[2]=0x01;//DCLK=MCLK/1,高通
CS5460_WriteReg(CONFIG|WRITE,buf);//写配置寄存器
buf[0]=0x00;
buf[1]=0x00;
buf[2]=0x00;
CS5460_WriteReg(WRITE|I_AC_OFFSET,buf);//电流交流偏置校准寄存器
buf[0]=0x00;//0x3e;
buf[1]=0x00;//0x68;
buf[2]=0x00;
CS5460_WriteReg(WRITE|V_AC_OFFSET,buf);//电压交流偏置校准寄存器
buf[0]=0x00;
buf[1]=0x00;
buf[2]=0x00;
CS5460_WriteReg(WRITE|I_DC_OFFSET,buf);//电流交流偏置校准寄存器
buf[0]=0x00;//0x3e;
buf[1]=0x00;//0x68;
buf[2]=0x00;
CS5460_WriteReg(WRITE|V_DC_OFFSET,buf);//电压交流偏置校准寄存器
buf[0]=0X40;//0x40;
buf[1]=0x00;
buf[2]=0x00;
CS5460_WriteReg(WRITE|I_GAIN,buf);//电流增益校准寄存器**
buf[0]=0X40;//0x40;
buf[1]=0x00;
buf[2]=0x00;
CS5460_WriteReg(WRITE|V_GAIN,buf);//电压增益校准寄存器**/
buf[0]=0xFF;
buf[1]=0xFF;
buf[2]=0xFF;
CS5460_WriteReg(0x5e,buf);//清除状态寄存器
}
在CS645460A运行的过程中,有某些时刻需要查询与清除DRDY标志位,实现的程序如下:
voidClear_DRDY(void)
{
UINT8buf[3];
buf[0]=0xff;
buf[1]=0xff;
buf[2]=0xff;
CS5460_WriteReg(STATUS|WRITE,buf);//写状态寄存器
}
voidWait_DRDY_High(void)
{
UINT8buf[3];
while
(1)
{
CS5460_ReadReg(STATUS,buf);
if(buf[0]&0x80)
break;//假如DRDY=1,退出返回
}
}
1.4.3ENC28J60配置
ENC28J60的操作主要是通过一个SPI接口进行数据读写操作。
ENC28J60与单片机实现数据通信的底层函数包括:
externvoidNETHwInit(void);//网络硬件初始化
staticvoiddelay_ms(UINT8ms);//延时
staticvoid_delay_us(UINT8us);//延时
staticvoidCSACTIVE(void);//ENC28J60片选
staticvoidCSPASSIVE(void);//ENC28J60片选关闭
staticvoidenc28j60HWreset(void);//ENC28J60硬件复位
staticUINT16SAMspiSend(UINT8ch,UINT16data);//SPI发送或接受数据
externUINT8enc28j60ReadOp(UINT8op,UINT8address);//ENC28J60指定地址读操作
externvoidenc28j60WriteOp(UINT8op,UINT8address,UINT8data);//ENC28J60指定地址写操作
externvoidenc28j60ReadBuffer(UINT16len,UINT8*data);//读取ENC28J60数据缓冲区
externvoidenc28j60WriteBuffer(UINT16len,UINT8*data);//写ENC28J60数据缓冲区
externvoidenc28j60SetBank(UINT8address);//设置ENC28J60内部地址块
externUINT8enc28j60Read(UINT8address);//读取ENC28J60,调用enc28j60ReadOp()
externvoidenc28j60Write(UINT8address,UINT8data);//写ENC28J60,调用enc28j60WriteOp()
externvoidenc28j60PhyWrite(UINT8address,UINT16data);//设置ENC28J60的PHY
externvoidenc28j60clkout(UINT8clk);//设置ENC28J60的输出时钟频率
externUINT8enc28j60getrev(void);//获取ENC28J60的版本号
externvoidenc28j60Init(UINT8*macaddr);//ENC28J60初始化
externvoidenc28j60PacketSend(UINT16len,UINT8*packet);//ENC28J60发送网络数据包
externUINT16enc28j60PacketReceive(UINT16maxlen,UINT8*packet);//ENC28J60接受网络数据包
1.4.4EEPROM读写测试
系统使用的是AT24C02,该芯片的接口符合IIC协议,在系统运行之初,要在空闲地址进行一次EEPROM的读写测试,EEPROM的需要的底层函数如下:
externvoidI2C_Init(void);//i2c总线初始化
staticvoidI2C_Start(void);//发送起始信号
staticvoidI2C_Stop(void);//发送结束信号
staticvoidWriteByte(UINT8data);//写8位数据
staticvoidWriteAddr(UINT8ReadMode);//写器件地址和读写信号
staticvoidWriteData(UINT8data);//写数据
staticUINT8ReadByte(UINT8last);//读8位数据
externvoidWriteToC02(UINT8Addr,UINT8*p,UINT8num);//写num个字节到24c02
externvoidReadFromC02(UINT8Addr,UINT8*p,UINT8num);//从24c02地址读num个字节数据
EEPROM测试程序,测试通过返回0:
UINT8EEPROM_Test(void)
{
UINT8i;
UINT8sendbuf[5]={1,2,3,4,5};
UINT8revbuf[5]={0,0,0,0,0};
WriteToC02(EEPROM_TEST_ADDR,sendbuf,5);
Delay_1ms(10);
ReadFromC02(EEPROM_TEST_ADDR,revbuf,5);
for(i=0;i<5;i++)
{
if(revbuf[i]!
=sendbuf[i])
{
return1;//EEPROMError
}
}
return0;
}
1.4.5CS5460A的偏置校准与增益标定
CS5460A内部具有校准寄存器,一旦启动校准程序,内部就自动产生修正值,用户可以读取这些值存取EEPROM中,在系统下次启动时读取这些值写入到相应的寄存器中而不必重复校准过程。
若用户需要进行校准,在设计系统的时候该考虑如何触发校准程序,可以是按键、上位机发命令、定时等途径,并将新获得的修正值更新至EEPROM。
在实际应用,一般只进行AC、DC的偏置校准,在这个基础上进行增益标定,来获得电流电压有效值寄存器的值与实际值的关系。
在校准之前CS5460A必须处于有效的活动状态,并清除DRDY位,在电流电压通道加入零信号(接地),发送启动校准命令,检查DRDY位,在该位置1之后读取相应的寄存器值。
若不能确定CS5460A是否处于转换状态,应发送一个POWER_HALT命令来终止转换再进行校准程序。
相关的程序如下:
voidSystem_Offset_Adj(void)
{
UINT8i;
UINT8DC_I_OFFSET[3];
UINT8DC_V_OFFSET[3];
UINT8AC_I_OFFSET[3];
UINT8AC_V_OFFSET[3];
Start_AC_OFFSET_Adj(DC_I_OFFSET,DC_V_OFFSET,AC_I_OFFSET,AC_V_OFFSET);//start
Delay_1ms(10);
WriteToC02(DC_I_OFFSET_ADDR,DC_I_OFFSET,3);//writeDC_I_OFFSETTOEEPROM
Delay_1ms(10);
WriteToC02(DC_V_OFFSET_ADDR,DC_V_OFFSET,3);//writeDC_V_OFFSETTOEEPROM
Delay_1ms(10);
WriteToC02(AC_I_OFFSET_ADDR,AC_I_OFFSET,3);//writeAC_I_OFFSETTOEEPROM
Delay_1ms(10);
WriteToC02(AC_V_OFFSET_ADDR,AC_V_OFFSET,3);//writeAC_V_OFFSETTOEEPROM
}
voidStart_AC_OFFSET_Adj(UINT8*a,UINT8*b,UINT8*p,UINT8*q)
{
Clear_DRDY();
CS5460_WriteCommand(POWER_HALT);
Clear_DRDY();
CS5460_WriteCommand(DC_I_ADJ);
Wait_DRDY_High();
CS5460_ReadReg(I_DC_OFFSET,a);
Clear_DRDY();
CS5460_WriteCommand(DC_V_ADJ);
Wait_DRDY_High();
CS5460_ReadReg(V_DC_OFFSET,b);
Clear_DRDY();
CS5460_WriteCommand(AC_I_ADJ);
Wait_DRDY_High();
CS5460_ReadReg(I_AC_OFFSET,p);
Clear_DRDY();
CS5460_WriteCommand(AC_V_ADJ);
Wait_DRDY_High();
CS5460_ReadReg(I_AC_OFFSET,q);
}
增益标定过程需要在电压电流通道加入标准的电压电流信号,假设为
和
,在进行之前所述的校准之后,开启转换,分别获得转换结果
和
再通过计算就可以得到电压电流关系系数
和
:
按上述方法就可以将读取到的数据,转换成实际的电压电流值。
程序如下:
FP32Get_VRMS(void)
{
UINT8i,j;
UINT8p[3];
FP32G=1.0/2.0,temp=0.0;
FP32VoltRMS;
Wait_DRDY_High();
CS5460_ReadReg(LAST_V_RMS,p);
Clear_DRDY();
for(i=0;i<=2;i++)
{
for(j=1;j<=7;j++)
{
if((p[i]&(1<<(8-j)))!
=0)
temp+=G;
G=G/2;
}
}
VoltRMS=V*temp;//黑体V为电压关系系数
returnVoltRMS;
}
FP32Get_IRMS(void)
{
UINT8i,j;
UINT8p[3];
FP32G=1.0/2.0,temp=0.0;
FP32CurrentRMS;
Wait_DRDY_High();
CS5460_ReadReg(LAST_I_RMS,p);
Clear_DRDY();
for(i=0;i<=2;i++)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 以太网 用电 监控 系统 设计 案例