版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1章 基于以太网的智能用电监控系统设计21.1 总体框架21.2 设计原理21.3 模块设计31.3.1 电源模块设计31.3.2 CS5460A模块41.3.3 LPC2148最小系统51.3.4 ENC28J60模块71.4 软件设计71.4.1 LPC2148初始化71.4.2 CS5460A配置81.4.3 ENC28J60配置101.4.4 EEPROM读写测试101.4.5 CS5460A的偏置校准与增益标定111.4.6 网络数据解析121.4.7 操作系统任务与软件流程131.5 开发环境的使用151.5.1 生成新的工作区151.5.2 生成新的项目151.5.3给项目添加
2、文件151.5.4 设置项目选项151.5.4 编译链接和调试应用15第1章 基于以太网的智能用电监控系统设计1.1 总体框架 本系统以ARM7TDMI-S内核单片机LPC2148为核心,结合CS5460A计量芯片模块、ENC28J60网络接口模块实现用电监控系统设计,其只要配置见表1-1。表1-1 基于以太网的智能用电监控系统硬件配置一览表模块主要配置功能LPC2148核心板LPC2148、MAX811系统的主控CS5460A计量模块CS5460A用电情况的计量ENC28J60模块ENC28J60网络数据传输接口电源模块LM2596,LM1117DC-DC转换芯片1.2 设计原理该设计中,核
3、心部件是美国Cirrus Logic公司生产的电能计量芯片CS5460A。该芯片具有如下特点:(1) 转换精度高,自身转换精度达到0.1级,可以实现0.2级的测量仪表;(2) 片内功能强,具有瞬时电流、瞬时电压、瞬时功率、电流有效值、电压有效值、功率有效值等;(3) 具有智能“自引导”,不需要控制器(4) 使用方便的SPI接口与控制器通信,外围接口少。(5) 校准过程简单,支持AC或DC系统校准为了实现以太网数据传输,系统中使用了Microchip公司的独立以太网控制器ENC28J60,该芯片实现了以太网分层结构中的物理层,使用SPI接口与控制器通信,控制器读取到的是最原始的标准以太网帧数据,
4、还需要对该帧数据进行解析才能获得有效的用户数据。反之,控制器需要用软件按照以太网数据帧协议将需要发送的用户数据一层一层包装好,写入到ENC28J60中,才能由该芯片发送到网络中去。整体的设计原理是,LPC2148 控制CS5460A读取用电情况,并将数据打包写入到ENC28J60中发送到网络。系统框图见图1-1。 图1-1 系统框图1.3 模块设计1.3.1 电源模块设计该系统中使用了开关型的DC-DC电源转换芯片LM2596和低压差的电压调节器LM1117,设计原理图见图1-1。图1-1在使用LM2596时,它的外围器件应根据数据手册的说明来选取,在LM1117的输出应加上电源滤波电容。1.
5、3.2 CS5460A模块CS5460A结合少量的外围和前置调理电路,在控制器的控制下就可以工作。本方案使用了互感器处理前端的高压和大电流调理,也可以使用分压和电流采样来处理。(1) 前端调理电路设计见图1-2,高压调理部分采用了变比为2mA:2mA的电压互感器ZMPT101B,假设市电维持在220V左右,通过一个120K的电阻,得到1.8mA的电流,为了不超过芯片的测量范围(这一点与CS5460A的寄存器配置有关),在互感器的另一侧串联一个精密电阻将电流信号转换为电压信号。该电路中的电容电阻组成了滤波电路,对信号进行了初步的模拟滤波。见图1-2,大电流部分采用了变比为2000:1的电流互感器
6、ZMCT102,互感器另一侧的一只精密电阻将电流信号转换成了电压信号,电阻的取值与绕线匝数,芯片测量范围有关。在该电路中也有滤波电路。对信号进行了初步的模拟滤波。由于互感器的相差作用,送入CS5460A的信号可能存在相位差,而CS5460A内部有相位补偿的功能,大大提高了有功功率的测量准确性,也弥补了互感器在使用过程中会产生相移的不足。图1-2 前端调理电路(2) CS5460A最小系统见图1-3, CS5460A的外围电路非常简单,只要连接晶振和电源即可。需要注意的是PFMON电源监控这只引脚,该引脚的电压必须维持在3.3V以上,本设计中用电源电压分压得到。前级调理的信号经VIN+ 、VIN
7、- 、CIN- 、CIN+进入CS5460A。CS5460A的引脚描述参见官方数据手册。图1-3 CS5460A最小系统1.3.3 LPC2148最小系统LPC2148是基于一个支持实时仿真和嵌入式跟踪的32位ARM7TDMI-S CPU的微控制器,并带有512KB嵌入式的高速Flash存储器。内置了USB 2.0 Device、多个UART、SPI、SSP、I2C和40KB的片内SRAM。多个32位定时器,1个10位ADC、10位DAC、PWM通道、45个高速GPIO口以及多大9个边沿或电平触发的外部中断管脚。核心板电路主要包括供电、复位、晶振、JATG和USB从设备。1. 供电由底板供电3
8、.3V,核心板载滤波电容和LED指示灯。图 1-42. 所有MCU均有一个复位逻辑,它负责将MCU初始化为某个确定的状态,复位信号会使MCU初始化为某个确定的状态,所以这个信号的稳定性非常重要。该系统采用手动复位,复位使用复位芯片MAX811,MAX811结合简单的外围就可以组成复位电路,输出端连接至CPU的复位引脚。 图 1-53. MCU需要晶体振荡器来提供一个时钟信号,这里采用12M晶振,RTC时钟也需要晶振电路,这里采用32.768K,核心板上还有一个JTAG接口电路。 图 1-64. LPC2148带有USB从设备控制器,只要在MCU外围加上这么一个USB从设备接口,就可以实现USB
9、通信。图 1-75. 将CPU其他功能性引脚外扩;所有VDD连接至3.3V电源(注意加上滤波电容,使电源更加稳定);所有VSS和VSSA连接至电源地;VDDA和VDD之间用电感隔离;VREF是AD/DA的参考电压,可以用TL431组成一个基准源,也可以直接连接至3.3V电源。VBAT是RTC时钟电源,可以直接连接至3.3V电源,也可以在板子上加上纽扣电池,一直给它供着电。需要注意的I2C功能引脚和P0.14引脚,请仔细阅读引脚描述。1.3.4 ENC28J60模块图 1-8上图为ENC28J60的典型应用电路,在其他系统中可以移植使用,只需修改相应的驱动程序。ENC28J60引脚简单,SPI接
10、口与控制器通信,输出与RJ-45接口相联,ENC28J60具有上电复位的功能,初始化过程需要10ms左右,为了ENC28J60的可靠复位,将复位引脚接到了控制器的IO上。需要特别指出的是,ENC28J60的内部模拟电路需要在RBIAS引脚与地之间接一个2K的电阻。1.4 软件设计系统软件主要包括了系统初始化,CS5460A转换数据、ENC28J60传输数据、下位机显示,人机交互。其中系统初始化包括了LPC2148初始化、CS5460A配置、ENC28J60初始化、EEPROM读写测试。1.4.1 LPC2148初始化LPC2148在上电复位后应进行PLL的初始化。初始化代码如下:void PL
11、L_Init(void)PLLCON = 1;#if (Fcclk/4)/Fpclk) = 1VPBDIV = 0;#endif#if (Fcclk/4)/Fpclk) = 2VPBDIV = 2;#endif#if (Fcclk/4)/Fpclk) = 4VPBDIV = 1;#endif#if (Fcco/Fcclk) = 2PLLCFG = (Fcclk/Fosc)-1) | (0<<5);#endif#if (Fcco / Fcclk) = 4PLLCFG = (Fcclk/Fosc)-1) | (1<<5);#endif#if (Fcco / Fcclk) =
12、 8PLLCFG = (Fcclk/Fosc)-1) | (2<<5);#endif#if (Fcco / Fcclk) = 16PLLCFG = (Fcclk/Fosc)-1) | (3<<5);#endifPLLFEED = 0xaa;PLLFEED = 0x55;while(PLLSTAT&(1<<10) = 0);PLLCON = 3;PLLFEED = 0xaa;PLLFEED = 0x55;/ Memory map init flash memory is maped on 0 address MEMMAP_bit.MAP = 1;1.4
13、.2 CS5460A配置CS5460A的操作主要是通过一个SPI接口进行数据读写操作。CS5460A与单片机实现数据通信的底层函数包括:extern void Port_Init(void); /LPC2148与CS5460A通信的端口初始化static void CS5460_Write_Byte(UINT8 dat); /写一字节到CS5460A中static UINT8 CS5460_Read_Byte(void); /从CS5460A中读取一字节extern void CS5460_WriteCommand(UINT8 CS5460_command); /写命令到CS5460A中ext
14、ern void CS5460_ReadReg(UINT8 CS5460_reg, UINT8 *p); /读取CS5460A的内部寄存器数据extern void CS5460_WriteReg(UINT8 CS5460_reg, UINT8 *p); /写CS5460A的内部寄存器内部包括状态寄存器、配置寄存器、控制寄存器、校准寄存器,数据寄存器等16个寄存器,要对特定的寄存器写入适当的值才能完成配置。内部寄存器的具体内容参见CS5460A的官方数据手册。void CS5460_Init(void) /IO1DIR |= SCK|CS|SDI|RESET; Port_Init();IO1C
15、LR |= CS;IO1CLR |= RESET;Delay_1ms(10);IO1SET |= RESET;CS5460_WriteCommand(SYNC1);CS5460_WriteCommand(SYNC1);CS5460_WriteCommand(SYNC1);CS5460_WriteCommand(SYNC0);void CS5460_Config(void) UINT8 buf3; buf0=0x00; /GI=1 电流50增益 buf1=0x00; buf2=0x01; /DCLK=MCLK/1,高通 CS5460_WriteReg(CONFIG|WRITE,buf); /写配
16、置寄存器 buf0=0x00; buf1=0x00; buf2=0x00; CS5460_WriteReg(WRITE|I_AC_OFFSET,buf); /电流 交流偏置 校准寄存器 buf0=0x00;/0x3e; buf1=0x00;/0x68; buf2=0x00; CS5460_WriteReg(WRITE|V_AC_OFFSET,buf); /电压 交流偏置 校准寄存器 buf0=0x00; buf1=0x00; buf2=0x00; CS5460_WriteReg(WRITE|I_DC_OFFSET,buf); /电流 交流偏置 校准寄存器 buf0=0x00;/0x3e; bu
17、f1=0x00;/0x68; buf2=0x00; CS5460_WriteReg(WRITE|V_DC_OFFSET,buf); /电压 交流偏置 校准寄存器 buf0=0X40;/0x40; buf1=0x00; buf2=0x00; CS5460_WriteReg(WRITE|I_GAIN,buf); /电流增益校准寄存器* buf0=0X40;/0x40; buf1=0x00; buf2=0x00; CS5460_WriteReg(WRITE|V_GAIN,buf); /电压增益校准寄存器*/ buf0=0xFF; buf1=0xFF; buf2=0xFF;CS5460_WriteRe
18、g(0x5e,buf); /清除状态寄存器在CS645460A运行的过程中,有某些时刻需要查询与清除DRDY标志位,实现的程序如下:void Clear_DRDY(void) UINT8 buf3; buf0=0xff; buf1=0xff; buf2=0xff; CS5460_WriteReg(STATUS|WRITE,buf); /写状态寄存器void Wait_DRDY_High(void) UINT8 buf3; while(1) CS5460_ReadReg(STATUS, buf); if(buf0&0x80) break; /假如 DRDY=1,退出返回 1.4.3 EN
19、C28J60配置ENC28J60的操作主要是通过一个SPI接口进行数据读写操作。ENC28J60与单片机实现数据通信的底层函数包括:extern void NETHwInit(void); /网络硬件初始化static void delay_ms(UINT8 ms); / 延时static void _delay_us(UINT8 us); / 延时static void CSACTIVE(void); / ENC28J60片选static void CSPASSIVE(void); / ENC28J60片选关闭static void enc28j60HWreset(void); / ENC2
20、8J60硬件复位static UINT16 SAMspiSend(UINT8 ch, UINT16 data); / SPI发送或接受数据extern UINT8 enc28j60ReadOp(UINT8 op, UINT8 address); / ENC28J60指定地址读操作extern void enc28j60WriteOp(UINT8 op, UINT8 address, UINT8 data); / ENC28J60指定地址写操作extern void enc28j60ReadBuffer(UINT16 len, UINT8 *data); /读取ENC28J60数据缓冲区exte
21、rn void enc28j60WriteBuffer(UINT16 len, UINT8 *data); /写ENC28J60数据缓冲区extern void enc28j60SetBank(UINT8 address); /设置ENC28J60内部地址块extern UINT8 enc28j60Read(UINT8 address); /读取ENC28J60,调用enc28j60ReadOp()extern void enc28j60Write(UINT8 address, UINT8 data); /写ENC28J60,调用enc28j60WriteOp()extern void enc
22、28j60PhyWrite(UINT8 address, UINT16 data); /设置ENC28J60的PHYextern void enc28j60clkout(UINT8 clk); /设置ENC28J60的输出时钟频率extern UINT8 enc28j60getrev(void); /获取ENC28J60的版本号extern void enc28j60Init(UINT8 *macaddr); / ENC28J60初始化extern void enc28j60PacketSend(UINT16 len, UINT8 *packet); / ENC28J60发送网络数据包exte
23、rn UINT16 enc28j60PacketReceive(UINT16 maxlen, UINT8 *packet); / ENC28J60接受网络数据包1.4.4 EEPROM读写测试系统使用的是AT24C02,该芯片的接口符合IIC协议,在系统运行之初,要在空闲地址进行一次EEPROM的读写测试,EEPROM的需要的底层函数如下:extern void I2C_Init(void); / i2c总线初始化static void I2C_Start(void); /发送起始信号static void I2C_Stop(void); /发送结束信号static void WriteByt
24、e(UINT8 data); /写8位数据static void WriteAddr(UINT8 ReadMode); /写器件地址和读写信号static void WriteData(UINT8 data); /写数据static UINT8 ReadByte(UINT8 last); /读8位数据extern void WriteToC02(UINT8 Addr, UINT8 *p, UINT8 num); /写num个字节到24c02extern void ReadFromC02(UINT8 Addr, UINT8 *p, UINT8 num); /从24c02地址读num个字节数据EE
25、PROM测试程序,测试通过返回0:UINT8 EEPROM_Test(void) UINT8 i; UINT8 sendbuf5 = 1,2,3,4,5; UINT8 revbuf5 =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 (revbufi != sendbufi) return 1; /EEPROM Error return 0;1.4.5 CS5460A的偏置校
26、准与增益标定CS5460A内部具有校准寄存器,一旦启动校准程序,内部就自动产生修正值,用户可以读取这些值存取EEPROM中,在系统下次启动时读取这些值写入到相应的寄存器中而不必重复校准过程。若用户需要进行校准,在设计系统的时候该考虑如何触发校准程序,可以是按键、上位机发命令、定时等途径,并将新获得的修正值更新至EEPROM。在实际应用,一般只进行AC、DC的偏置校准,在这个基础上进行增益标定,来获得电流电压有效值寄存器的值与实际值的关系。在校准之前CS5460A必须处于有效的活动状态,并清除DRDY位,在电流电压通道加入零信号(接地),发送启动校准命令,检查DRDY位,在该位置1之后读取相应的
27、寄存器值。若不能确定CS5460A是否处于转换状态,应发送一个POWER_HALT命令来终止转换再进行校准程序。相关的程序如下:void System_Offset_Adj(void) UINT8 i; UINT8 DC_I_OFFSET3; UINT8 DC_V_OFFSET3; UINT8 AC_I_OFFSET3; UINT8 AC_V_OFFSET3; 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
28、, DC_I_OFFSET, 3); /write DC_I_OFFSET TO EEPROM Delay_1ms(10); WriteToC02(DC_V_OFFSET_ADDR, DC_V_OFFSET, 3); /write DC_V_OFFSET TO EEPROM Delay_1ms(10); WriteToC02(AC_I_OFFSET_ADDR, AC_I_OFFSET, 3); /write AC_I_OFFSET TO EEPROM Delay_1ms(10); WriteToC02(AC_V_OFFSET_ADDR, AC_V_OFFSET, 3); /write AC_V
29、_OFFSET TO EEPROMvoid Start_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_ReadRe
30、g(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);增益标定过程需要在电压电流通道加入标准的电压电流信号,假设为和,在进行之前所述的校准之后,开启转换,分别获得转换结果和,再通过计算就可以得到电压电流关系系数和:按上述方法就可以将读取到
31、的数据,转换成实际的电压电流值。程序如下:FP32 Get_VRMS(void) UINT8 i,j; UINT8 p3; FP32 G = 1.0/2.0, temp = 0.0; FP32 VoltRMS; Wait_DRDY_High(); CS5460_ReadReg(LAST_V_RMS, p); Clear_DRDY(); for(i=0;i<=2;i+) for(j=1;j<=7;j+) if( (pi&(1<<(8-j) != 0 ) temp+=G; G = G/2; VoltRMS = V * temp; /黑体V为电压关系系数 return
32、 VoltRMS;FP32 Get_IRMS(void) UINT8 i,j; UINT8 p3; FP32 G = 1.0/2.0, temp = 0.0; FP32 CurrentRMS; Wait_DRDY_High(); CS5460_ReadReg(LAST_I_RMS, p); Clear_DRDY(); for(i=0;i<=2;i+) for(j=1;j<=7;j+) if( (pi&(1<<(8-j) != 0 ) temp+=G; G = G/2; CurrentRMS = I * temp; /黑体I为电流关系系数return Curren
33、tRMS;1.4.6 网络数据解析前文指出,ENC28J60的输出的是标准的以太网帧数据(以太网的相关协议,请参考其他文献),MCU需要对该数据进行解析。目前已有比较完善的嵌入式以太网协议栈,将该协议栈移植到自己的系统中,提供一些底层的函数即可,如Lwip。本系统中使用了一种很简洁的以太网协议栈。相应的数据解析函数如下:extern UINT16 NETPcCheckSum(UINT8 *buf, UINT16 len, UINT8 type); /校验和extern void NETPcInit(UINT8 *mymac, UINT8 *myip, UINT8 port); /设置本地的IP
34、、MAC、端口extern UINT8 NETPcEthIsArpAndMyIp(UINT8 *buf, UINT16 len); /检查ARP和本机地址是否正确extern UINT8 NETPcEthIsIpAndMyIp(UINT8 *buf, UINT16 len); /检查以太网类型、IP版本、IP地址extern void NETPcMakeEth(UINT8 *buf); /建立以太网首部extern void NETPcMakeIP(UINT8 *buf); /建立IP首部extern void NETPcFillIPHdrChkSum(UINT8 *buf); /填充IP包校
35、验和extern void NETPcMakeTcpHead(UINT8 *buf, UINT16 rel_ack_num, UINT8 mss, UINT8 cp_seq); /建立TCP首部extern void NETPcMakeArpAnswer(UINT8 *buf); /ARP应答extern void NETPcMakeEchoReply(UINT8 *buf, UINT16 len); /ECHO应答extern void NETPcMakeUdpReply(UINT8 *buf, char *data, UINT8 datalen, UINT16 port); /填充UDP应
36、答数据extern void NETPcMakeTcpSynAck(UINT8 *buf); /TCP同步应答extern void NETPcInitLenInfo(UINT8 *buf); /初始化响应的数据长度extern UINT16 NETPcGetTcpDataPointer(void); /获取TCP数据包指针extern UINT16 Fill_tcp_data(UINT8 *buf, UINT16 pos, const char *s); /填充TCP数据extern void NETPcMakeTcpAck(UINT8 *buf); /填充TCP应答信息extern voi
37、d NETPcMakeTcpAckWithData(UINT8 *buf, UINT16 dlen); /发送TCP数据1.4.7 操作系统任务与软件流程本系统移植了嵌入式操作系统uCOS-II,重点介绍系统的任务划分,对于操作系统的移植不作过多阐述。本系统需要下列任务结合完成功能:static void App_TaskCreate(void); /创建任务的函数static void App_TaskStart(void *p_arg); /首个任务,用于创建其他任务,调用App_TaskCreate()static void EthRec_Task(void *p_arg); /网络数据接受任务static void EthRecAnalysis_Task(void *p_arg); /网络数据标志位分析任务static void SysInfoDisp_Task(void *p_arg); /系统信息显示任务static void Led1_Task(void *p_arg); /运行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广西国际商务职业技术学院单招职业适应性考试题库附答案详解(预热题)
- 中毒患者的宗教支持
- 公司CRM系统优化方案
- 中医饮食调养原则
- 城市供暖工程申请报告
- 上肢康复训练
- 几何图形认知与空间思维训练2026年试题解析试卷及答案
- 不寐的中医整体护理观
- 中毒患者的循环支持护理
- 儿科急症的识别与处理
- 麻精药品信息化管理系统需求说明
- 全过程工程咨询实施投标方案
- 镇墩稳定计算
- parp抑制剂研究进展 课件
- 《水工钢结构》试题及答案1783
- 实习协议书电子电子版(2篇)
- 三级医院评审标准(2023年版)实施细则
- 江苏专转本计算机资料汇编
- GA/T 2002-2022多道心理测试通用技术规程
- 片区更新改造总体规划项目建议书
- GB/T 24474.1-2020乘运质量测量第1部分:电梯
评论
0/150
提交评论