基于E2PROM24C16芯片单片机课程设计多用户电能表打印资料Word下载.docx
《基于E2PROM24C16芯片单片机课程设计多用户电能表打印资料Word下载.docx》由会员分享,可在线阅读,更多相关《基于E2PROM24C16芯片单片机课程设计多用户电能表打印资料Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
G×
f1-4U2REF
U1=5×
350=1750μV=1.75mV
并以最大电流产生的压降和表1,选择G=16
U2=fF1×
U2REF8.06×
f1-4=0.030555×
2.528.06×
1.75×
16×
3.4=248.9mV
原理图中R1、C1,R2、C2,R3、C3,R4∥(R5~R16)、C4为抗混叠滤波器。
因为AD7755以900kHz过采样速率采样,故大大简化了抗混叠滤波器的设计。
不过,两个通道之间的相位匹配非常重要。
例如,当cosφ=0.5时,0.2°
的外部相位误差将产生0.6%的测量误差。
为使两个通道的相位匹配,电阻、电容的取值分别为R1=R2=R3=R4=1kΩ(精度为1%);
C1=C2=C3=C4=33nF;
R5=300kΩ,R6=150kΩ,R7=75kΩ,R8=39kΩ,R9=18kΩ,R10=9.1kΩ,R11=5.1kΩ,R12=2.2kΩ,R13=1.2kΩ,R14=560Ω,R15=R16=330kΩ。
考虑到选用的分流器和基准源都存在允差,原理图中设置了校准网络,通过短接或断开J1~J10,可在±
30%范围内进行调节。
因为R15+R16=660kΩ,大于大于R4(1kΩ),因此,即使R5~R14全部短接,这条支路的-3dB频率仍由R4和C4的值决定。
据厂家介绍,从J1~J10全部接通变化到J1~J10全部断开,50Hz处产生的相移仅为0.0004°
。
考虑到分流器存在寄生电感,较大时需要进行补偿。
当分滤器阻值很小时,如,小于200μΩ,特别要注意此问题。
AD7755的供电电压由电容分压器分压、二极管整流、RC滤波和7805IC稳压产生。
7805的输出以C13(10μF)和C12(100nF)退耦,接AD7755的DVDD。
VDD再经R22(10Ω)、C10(100nF)和C11(220μF)滤波,接AD7755的模拟电路电源管脚AVDD。
AD7755的CLKIN和CLKOUT管脚接3.579545MHz晶体和2只22pF陶瓷电容。
考虑抗电磁干扰,除原有的滤波电路外,原理图电流输入通道中增加了Z3、Z4铁氧体,电源电路部分增加了由Z1铁氧体、C16电容和MOV1金属氧化物压敏电阻组成的滤波网络等。
②C8051F360单片机部分管脚及参数
由原理图知:
P1.0~P1.7分配给八个用户,作为脉冲输入端口。
P2.0和P2.1分配给LED显示部分作为时钟信号和数据输入。
P2.4和P2.5分配给24C16作为SCL和SDA信号脚。
此外,C8051F360功能强大,结构复杂,其余端口与本设计无关,故其分配情况不再详述。
晶振采用11..0592MHz,电源使用3.3V。
③电源参数
220V~5V的共两套,一套给AD7755,另一套给显示模块和5V~3.3V电源。
5V~3.3V电源供给C8051F360和24C16。
220V~5V转换电路中,相关参数如下:
C1=330uf,为滤波电容;
C2=0.33uf,用于抵消输入线较长时的电感效应,以防止电路产生自激震荡;
C3=1uf,用于消除输出电压中的高频噪声。
(4)器件选择:
AD7755电能脉冲发生器的选择:
AD7755是美国AD公司生产的专用于功率/电能测量的低成本集成电路。
它的技术指标满足GB/T17215-1998标准规定的准确度等要求。
AD7755有24条引脚,以DIP和SSOP形式封装。
AD7755在电子电能表中的连接如图1所示。
管脚功能如下:
P1DVDD,数字电路电源,5(±
5%)V;
P2AC/DC,高通滤波选择脚,逻辑高,高通滤滤器使能;
P3AVDD,模拟电路电源,5(±
P4、P19NC,未接;
P5-P6V1P-V1N,通道1(电流通道)模拟输入,最大差动输入电压为±
470mV;
P7-P8V2N-V2P,通道2(电压通道)模拟输入,最大差动输入电压为±
660mV;
P9RESET,复位引脚,逻辑低使ADC和数字电路保持复位状态,清内部寄存器;
P10REFIN/OUT,电压基准脚,片上基准为5(±
8%)V,可接外部基准源;
P11AGND,模拟电路参考地;
P12SCF,校准频率选择脚;
P13、P14S1、S0,数-频转换频率选择脚;
P15、P16G1、G0,通道1增益选择脚;
P17-P18CLKIN-CLKOUT,外接时钟,钟频3.579545MHz;
P20REVP,负功率指示脚,电压信号和电流信号之间的相位差>
90°
时变为逻辑高;
P21DGND,数字电路参考地;
P22CF,校准频率输出;
P23、P24F2、F1,低频输出。
AD7755的内部功能框图如下图:
它由模拟电路(模数转换电路、基准电路与电源电压监测电路)和数字信号处理电路两部分组成。
被测电压、电流转换为数字量后,接下来的信号处理都在数字域实现;
AD7755内部的相位校正电路、高通滤波器、乘法器、低通滤波器、数字-频率转换器等都为数字电路。
AD7755内有两个以900kHz过采样速率采样的16位2阶Σ-Δ模数转换器(ADC)。
被测电流经可编程增益放大器(PGA)放大后接电流通道的ADC,并由此ADC转换为对应的数字信号。
再经相位校正和高通滤波,进入乘法器。
乘法器的另一路输入是由电压通道ADC转换而来的、与被测电压对应的数字信号。
相乘后产生瞬时功率信号。
此信号经低通滤波器滤除其中的交流分量,提取出负载消耗的瞬时有功功率。
AD7755对这个瞬时有功功率信号进行一段时间的累计、平均,求得平均有功功率,以较短时间对瞬时有功功率进行累计,求得与瞬时有功功率成正比的高频频率并经CF输出,用于校准或送微控制器累加计数,实现对电能的计量。
电流通道的PGA的增益受管脚G1、G0控制。
高通滤波器是否接入受管脚AC/DC控制。
逻辑高,HPF使能。
用来去除电流通道的直流偏移和由此引起的误差。
高通滤波器接入或断开造成的相移,由相位校正电路校正,使电压通道和电流通道的相位匹配。
如前所述,管脚F1、F2输出与平均有功功率成正上的电压有效值具有下列关系:
fF1=fF2=8.06×
f1-4U2REF
(1)
式中,U1、U2分别为电流通道和电压通道输入端的rms差动电压(V),G为电流通道的增益,选择方法见表1;
UREF为基准电压值(V);
f1-4为以S1、S0逻辑输入选择的频率(Hz),选择方法见表2。
表2 f1-4等选择表
表2第7列是与两个通道都输入最大电压所对应的最高输出频率(Hz)。
考虑到实际电网电压存在波动和负载电流可能超载,设计电能表时,两个模拟通道的输入电压一般都留有足够的超量程余地。
比如,取允许的最大值的一半。
表2第5列是用管脚SCF、S1、S0逻辑输入选择的转换系数,CF脚输出的频率为fCF=KfF1
(2)由表2知,CF端输出的频率能高达fF1的2048倍。
(5)设计原理图:
①单片机实际原理图:
②八段译码显示:
……
74HC164共六个
③E2PROM24C16芯片
④AD7755电能脉冲发生器
⑤电源
两组稳压电源
⑥C8051F360与24C16接线部分
2、软件设计:
(以100个/度为例)
(1)程序框图:
(2)设计程序
$NOMOD51
$include(c8051f360.inc)
//用户空间:
8*3=24字节,30h——47h
HOUSE0EQU30H
HOUSEENDEQU48H
//6字节的显示缓冲区50H——55H
DISPLAYREGION1EQU50H
DISPLAYREGION2EQU51H
DISPLAYREGION3EQU52H
DISPLAYREGION4EQU53H
DISPLAYREGION5EQU54H
DISPLAYREGION6EQU55H
//P2口的原状态
ORIGIONSTATEEQU56H
//用于显示读开关的特殊位
CLKDISPLAYEQUP1.1
DATEDISPLAYEQUP1.0
PLEQUP1.2
DATE165EQUP1.4
CLK165EQUP1.5
SCLEQUP1.6
SDAEQUP1.3
//延时计数
TIMEQU05H
;
**************************************************ORG0000H
LJMPMAIN
ORG000BH
LJMPINTDELAY
ORG0100H
MAIN:
LCALLCHUSHI//调用初始化程序
MOVSP,#80H
MOVORIGIONSTATE,#0
MOVR4,#0//R4存用户号
MOVR2,#TIM//R2用于延时计数
SETBET0
SETBEA
MOVTMOD,#11H
MOVTH0,#00H
MOVTL0,#00H//中断初始化,T0,T1全为方式1
LCALLREAD//从24C16内读用户空间的数据存入对应空间
SETBTR0
//**********主程序循环处******************
MAIN0:
CLRPL//串行读入开关状态
NOP
SETBPL
MOVR1,#HOUSE0//R1指向house0首地址
CLRING:
CLRCLK165
SETBCLK165
JBDATE165,NOTCLR//判断开关状态
LCALLCLR24C16//将R1指向的连续3个空间清零并写入对应的//24C16内R1不变
NOTCLR:
INCR1
INCR1
CJNER1,#HOUSEEND,CLRING//循环8次,每次进三字节
LCALLREADPULSE//读脉冲程序并计数
SJMPMAIN0
//*****T0的中断服务程序INTDELAY***************
INTDELAY:
PUSHACC
MOVA,R1
PUSHACC//保护主程序的A和R1
CLRTR0
MOVTH0,#00H
MOVTL0,#00H
DJNZR2,NOCHANGE//R2减至0后才调用传送,调用显示
MOVR2,#TIM
LCALLDELIVER//将第R4户的数据传到显示缓冲区
LCALLDISPLAY//将显示缓冲区数据送显示
INCR4//户号加1
CJNER4,#8,NOCHANGE
MOVR4,#0//显示到第7户后清零
NOCHANGE:
SETBTR0
POPACC
MOVR1,A
POPACC
RETI
//****************初始化子程序****************
CHUSHI:
MOVSFRPAGE,#0FH
MOVP1MDIN,#0FFH;
数字输入
MOVP1MDOUT,#0EFH;
推挽输出
MOVXBR1,#40H;
交叉开关使能
MOVPCA0MD,#00H;
关闭看门狗
MOVPSCTL,#13H
MOVOSCICN,#83H;
内部振荡器允许,不分频
MOVDPTR,#tab
MOVR1,#HOUSE0//将用户空间全部清零
ZERO:
MOV@R1,#0
CJNER1,#48H,ZERO
RET
//**********读脉冲子程序*******************
//用R1指向内存地址用于进位和加1
READPULSE:
MOVA,P2
PUSHACC//保护P2口状态
XRLA,ORIGIONSTATE//与原状态异或,有边沿为1
MOVR1,#HOUSE0
LOOP:
RRCA//依次右移
JNCNOPULSE
INC@R1//有脉冲加1
LCALLCONSERVR//将R1指向的数据存入24C16内的对应的空间CJNE@R1,#200,NOPULSE//每个脉冲读2次小数位满200进位清零
MOV@R1,#0
LCALLCONSERVR
INC@R1
CJNE@R1,#100,DEC1//个位、十位满百进1清零
MOV@R1,#0
INCR1
INC@R1
SJMPDEC2
NOPULSE:
DEC1:
INCR1
DEC2:
INCR1
CJNER1,#HOUSEEND,LOOP
POPACC
MOVORIGIONSTATE,A
//*****传送至显示缓冲区子程序******************
//入口参数为R4=通道号
DELIVER:
MOVDISPLAYREGION6,R4//户号
INCDISPLAYREGION6
MOVA,R4
MOVB,#3
MULAB
MOVB,#HOUSE0
ADDA,B
MOVR0,A//根据户号算出该用户的首地址
MOVA,@R0
MOVB,#2
DIVAB//小数位除2
MOVB,#10
DIVAB
MOVDISPLAYREGION1,B//百分位
MOVDISPLAYREGION2,A//十分位
INCR0
MOVA,@R0
MOVB,#100
DIVAB
MOVA,B
MOVB,#10
MOVDISPLAYREGION3,B//个位
MOVDISPLAYREGION4,A//十位
INCR0
MOVDISPLAYREGION5,@R0//百位
*****************显示子程序*****************
//无入口参数
DISPLAY:
MOVDPTR,#TAB
MOVA,DISPLAYREGION1
MOVCA,@A+DPTR
LCALLDATEOUT//将A串行输出程序
MOVA,DISPLAYREGION2
LCALLDATEOUT
MOVDPTR,#TAB2//个位带小数
MOVA,DISPLAYREGION3
MOVDPTR,#TAB
MOVA,DISPLAYREGION4
LCALLDATEOUT
MOVA,DISPLAYREGION5
MOVDPTR,#TAB2
MOVA,DISPLAYREGION6
LCALLDATEOUT
//************数据输出子程序DATEOUT*************
DATEOUT:
MOVR3,#8
LOOOOOOP:
RLCA
CLRCLKDISPLAY
MOVDATEDISPLAY,C
SETBCLKDISPLAY
DJNZR3,LOOOOOOP
//*************掉电保护数据子程序*************
//入口参数:
R1=需保护数据所在地址
CONSERVR:
PUSHACC
MOVA,R1
MOVR7,A
MOVA,@R1
MOVR6,A
LCALLI2C_WR//入口参数R6=数据;
R7=EEPROM地址
POPACC
RET
//**********24C16连续3字节清零程序*************
R1=需清零空间的首地址
CLR24C16:
MOV@R1,#0
LCALLCONSERVR
DECR1
DECR1//保证R1不变
//***********上电读24C16子程序******************
READ:
MOVR1,#HOUSE0
READING:
MOVR7,A
LCALLI2C_RD//入口参数:
R7=24C16地址出口参数:
R7=数据
MOVA,R7
MOV@R1,A
CJNER1,#HOUSEEND,READING
//**************写入24C16**************
R6=数据;
I2C_WR:
LCALLSTAR;
发起始条件
MOVA,#0A0H;
发器件地址
LCALLSENDI2C
JBF0,RETURN1;
数据接收错误
MOVA,R7;
发字节地址
接收数据错误
MOVA,R6
LCALLSENDI2C;
发一个数据
LCALLSTP
LCALLLDELAY10MS;
写周期延时约10ms
RETURN1:
RET
//*****************读24C16****************
//出口参数:
R7=数据
I2C_RD:
LCALLSTAR;
发送起始条件
MOVA,#0A0H;
LCALLSENDI2C
JBF0,RETURN;
MOVA,R7;
发地址
JBF0,RETURN
重新发送起始标志
MOVA,#0A1H;
发读操作命令
SETBF0
LCALLLOADI2C
LCALLSTP;
发终止条件
RETURN:
/////////////I2C启动条件//////////
STAR:
SETBSDA
NOP
SETBSCL
CLRSDA
CLRSCL
///////////I2C终止条件///////////////
STP:
CLRSDA
////////LOADI2C/////////
LOADI2C:
SETBSDA;
置数据线为输入方式
MOVR5,#08H
RCV:
NOP
CLRSCL;
置低准备接收数据位
SETBSCL;
置高使数据线上数据有效
CLRC
JNBSDA,RCV0;
读数据位,若为0则置0
SETBC;
读数据位,若为1则置1
RCV0:
RLCA;
接收数据位放入ACC中
DJNZR5,RCV;
没接收完继续
接收完置低发应答或非应答信号
JNBF0,SENDACKB;
判断继续接收数据?
如需转发送应答位
SETBSDA;
发送非应答信号
SENDACKB:
置高使应答有效
NOP
准备接收停止条件
CLRF0;
清接收非应答信号
///////////SENDI2C///////
SENDI2C:
MOVR5,#08H
AR_LP1:
RLCA
MOVSDA,C;
传送1位数据
接收数据
准备接收下一位
DJNZR5,AR_LP1;
8位发送完
发送完,准备接收应答位
开始接收应答位