片机课程设计单相工频交流电压电流计设计Word文档下载推荐.docx
《片机课程设计单相工频交流电压电流计设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《片机课程设计单相工频交流电压电流计设计Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
系统总体框图如图1-1所示。
图1-1系统总框图第二章第二章硬件设计硬件设计2.1转换电路设计转换电路设计2.1.1分压电路分压电路分压电路如图2-1所示,分压电路工作原理为:
不同的输入电压通过分压电阻,电压下降而不改变相位。
图中运算放大器构成电压跟随器,图2-1分压电路运放输出电压和互感器输入电压关系为:
U0=U*R101/(R100+R101)。
故选择取样电阻R100=215、R101=5.02。
2.1.2电流转换电路电流转换电路电流转换电路如图2-2所示,输入电流040A,输出电压05V,图2-2电流转换电路2.2真有效值转换电路设计真有效值转换电路设计系统的核心是测量交流电压、电流的有效值,因此有效值测量的精度将直接影响系统最终的精度。
有效值测量集成电路视其测量范围和精度有多种规格可选,较通用的有Analog公司的AD536、AD636、AD736及AD737等。
考虑到成本等因素,系统选用的是AD736,应用电路如图2-3所示。
该器件是按有效值隐含运算而设计,能计算任意复杂波形的高精度真有效值-直流转换器件,其精度优于0.3%,波峰因素5,相对稳定时间快,是当前集成真有效值转换器性能较好的一种。
AD736有效值测量原理如下:
一个交变信号的有效值定义为
(1)这里,为信号的有效值,T为测量时间,是一个时间的函数,但不一定是周期性的。
对等式两边进行平方得:
(2)右边的积分项可以用一个平均来近似(3)这样式
(2)可以简化为:
(4)等式两边除以得:
(5)这个表达式就是测量一个信号真实有效值的基础。
AD736也是采用的这一原理。
图中CC为低阻抗输入端耦合电容一般取值为1020uF;
CF为输出端滤波电容一般取10uF;
CAV为平均电容,它是AD736的关键外围元件,用于进行平均值运算。
其大小将直接影响到有效值的测量精度,尤其在低频时更为重要。
多数情况下可选33uF。
图2-3真有效值转换电路2.3555定时器矩形波转换电路设计定时器矩形波转换电路设计利用555定时器,对正弦信号进行整形,从而形成矩形波。
利用中断进行计时。
当整形电压波形首次出现下降沿时,定时器1、2打开。
开始计数。
当整形电流波形首次出现下降沿时,关闭定计数器T0,计数值为time_l。
当整形电压波形再次出现下降沿时,关闭计数器T1,计数值为time_s。
从而计算出相位差phase=(time_l)*360/(time_s)。
功率因数powerfact=cos(phase)。
应用电路如图2-4所示。
图2-4矩形波转换电路3.2电压、电流真有效值切换电路设计电压、电流真有效值切换电路设计由于AD1674要求一路输入,故需对电压有效值和电流有效值的信号进行通道选择和切换。
本设计采用模拟开关CD4053实现通道切换,即在电压、电流互感器后设置一CD4053,通过单片机输出控制信号来控制通道切换,选择某路信号进行有效值转换,应用电路如图2-5所示。
CD4053是三路二选一模拟开关,可由三位控制位分别选择三路输出,其真值表如表2-1所示。
本设计中只用了一路,单片机2.4口通过D触发器与A相连,由控制位A选择输出。
表2-1CD4053真值表InputStatesOnChannelsENABC0000X0,Y0,Z00001X0,Y0,Z10010X0,Y1,Z00011X0,Y1,Z10100X1,Y0,Z00101X1,Y0,Z10110X1,Y1,Z00111X1,Y1,Z11*NONE图2-5真有效值转换电路2.5A/D转换电路设计转换电路设计AD1674是美国AD公司推出的一种完整的12位并行模/数转换单片集成电路。
该芯片内部自带采样保持器(SHA)、10伏基准电压源、时钟源以及可和微处理器总线直接接口的暂存/三态输出缓冲器。
与原有同系列的AD574A/674A相比,AD1674的内部结构更加紧凑,集成度更高,工作性能(尤其是高低温稳定性)也更好,而且可以使设计板面积大大减小,因而可降低成本并提高系统的可靠性。
笔者在研制某新型国产机载武器系统中采用了M级AD1674T,它可实时地采集各传感器的模拟参量,以进行快速、精确的数据转换并传给CPU进行处理。
图2-5ADC转换电路AD1674的基本特点和参数如下:
带有内部采样保持的完全12位逐次逼近(SAR)型模/数转换器;
采样频率为100kHz;
转换时间为10s;
具有1/2LSB的积分非线性(INL)以及12位无漏码的差分非线性(DNL);
满量程校准误差为0.125%;
内有+10V基准电源,也可使用外部基准源;
四种单极或双极电压输入范围分别为5V,10V,0V10V和0V20V;
数据可并行输出,采用8/12位可选微处理器总线接口;
内部带有防静电保护装置(ESD)AD1674的引脚按功能可分为逻辑控制端口、并行数据输出端口、模拟信号输入端口和电源端口四种类型。
(1)逻辑控制端口12/8:
数据输出位选择输入端。
当该端输入为低时,数据输出为双8位字节;
当该端输入为高时,数据输出为单12位字节。
CS:
片选信号输入端;
R/C:
读/转换状态输入端。
在完全控制模式下,输入为高时为读状态;
输入为低时为转换状态;
在独立工作模式下,在输入信号的下降沿时开始转换。
CE:
操作使能端;
输入为高时,芯片开始进行读/转换操作。
A0:
位寻址/短周期转换选择输入端。
在转换开始时,若A0为低,则进行12位数据转换;
若A0为高,则进行周期更短的8位数据转换;
当R/C=1且12/8=0时,若A0为低,则在高8位(DB4DB11)作数据输出;
若A0为高,则在DB0DB3和DB8DB11作数据输出,而DB4DB7置零。
STS:
转换状态输出端。
输出为高时表明转换正在进行;
输出为低时表明转换结束。
(2)并行数据输出端口DB11DB8:
在12位输出格式下,输出数据的高4位;
在8位输出格式下,A0为低时也可输出数据的高4位。
(3)模拟信号输入端口10VIN:
10V范围输入端,包括0V10V单极输入或5V双极输入;
20VIN:
20V范围输入端,包括0V20V单极输入或10V双极输入;
应当注意的是:
如果已选择了其中一种作为输入范围,则另一种不得再连接合作。
(4)供电电源端口REFIN:
基准电压输入端,在10V基准电源上接50电阻后连于此端;
REFOUT:
+10V基准电压输出端;
BIPOFF:
双极电压偏移量调整端,该端在双极输入时可通过50电阻与REFOUT端相连;
在单极输入时接模拟地。
图3给出了AD1674在单极和双极输入时的两种连接电路。
VCC:
+12V/+15V模拟供电输入;
VEE:
-12V/-15V模拟供电输入;
VLOGIC:
+5V逻辑供电输入;
故我们按照图2-5接线。
2.6显示电路设计显示电路设计7段LED显示电压和电流有效值应用接口电路如图2-6所示,包括单片机、LED显示电路、7448地址锁存器、74138译码器。
单片机P1.0P1.3口作为7448的控制口,P1.4P1.7作为74138的控制口。
图2-6应用接口电路上图还包含了开关量,CLK/KEY;
U/I两个开关键控制电压电流有效值循环输出。
2.7单片机电路设计单片机电路设计系统采用AT89C51单片机作为主控制器。
AT89C51具有功能强、体积小、成本低、功耗小等特点,它可单独地完成现代工业控制所要求的智能化控制功能,能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务。
与数码管相比该模块还有位数多、显示内容丰富、程序简单等优势。
P2.0-P2.7用于接收AD转换后的信号。
2.8串口电路设计串口电路设计串行通信利用虚拟终端,下载串口调试助手SComAssistantV2.1,VirtualSerialPortDriver6.9。
对基于单片机C51开发的软硬件进行联合调试,显示结果。
设置虚拟终端COM1,COM2。
第三章第三章软件设计软件设计4.1A/D转换、相位差程序转换、相位差程序系统上电复位后,从主程序开始执行。
主程序需将A/D转换得到的数据进行运算处理,转换位十进制数,并送到LED显示。
取电流电压值,逐位取余通过P1口发送至LED。
并进行循环显示。
程序流程图如图3-1所示。
根据AD1674各引脚的功能对各引脚进行赋值。
相位差根据两个计数器的比值获得,根据室内米特触发器转换而来的矩形波信号。
测得完整周期计数值和周期差计数值进行计算。
得到相位差和功率因数,并发送至远程主机。
如图3-2所示。
图3-1AD转换流程图图3-2相位角流程图第四章第四章系统调试及误差分析系统调试及误差分析4.1系统调试系统调试在系统整体调试时,若调试不成功,由于整体连接已经完成,很难检查到底哪部分有错误。
为此,我们采用了边连接边调试的方法,即将系统分成若干模块,每个模块完成后就进行测试验证,最后再进行系统联调。
调试过程中,用到的虚拟仪器设备如下:
直流稳压电源、函数信号发生器、示波器、万用表等。
4.2误差分析误差分析1.分压电路、电流转换带那路存在非线性误差。
2.AD736转换误差。
3.AD1674存在误差,延时程序影响。
4.3调试过程中的问题调试过程中的问题1.电压,电流的缩小电路原本为互感电路,但调试不能解决拥有滞后相位的正弦交流电的正常缩小。
所以选择了精度较差的分压、转换电路。
2.有效值转换电路不能有效转换相位改变的正弦交流电。
3.采用12位AD1674数模转换器,提高精度,减小误差。
4.串口通信只能显示16进制数字,导致不能合理显示小数点。
结束语结束语经过20天得努力,我圆满完成了此次课程设计任务,作品达到了题目要求的各项性能指标。
本次实习是为毕业设计做好准备、打好基础,通过这次实习,我们熟悉了一个课题或项目的完成过程,从查找资料,确定方案,设计电路,软件编写,系统调试到最后的报告撰写,每一个过程我都学到了很多,收获了很多,理论设计和动手实践能力得到了很大提升。
课设成果不是单一知识的结晶,实习遇到了好多难题,学过的一些知识点有所遗忘,我们完成课题的同时也巩固了理论知识。
通过实习理论联系实际,以前一些不甚理解的理论也变得容易理解了。
与此同时我们也学到了一些宝贵的经验教训,例如:
这次实习的课题是工频电压表的设计,由于事前对220V电压重视不够。
这次做实习的经验也会使我终身受益,我感受到做课设是要真真正正用心去做的一件事情,是真正的自己研习和研究的过程。
希望这次的经验能让我在往后学习中驱策我继续前进。
附附录录附录一附录一完整电路图完整电路图附录二附录二程序清单程序清单/*/#include#include#include#include#defineuintunsignedint#defineucharunsignedchar#defineADCSTU0x6cff#defineADCH0x6EFF#defineADCL0x6FFF#defineLEDportalP1sbitSTS=P34;
sbitclk_key=P22;
sbitu_i=P23;
uintvolts,amps;
uintphase;
floatpower_fact;
uinttime_l=0;
uinttime_s=0;
bittiming=0;
uchar*p;
uchara;
ucharstring136;
voidint0_isr(void)interrupt0if(timing)TMOD=0x11;
TH1=TL1=0x0;
TH0=TL0=0x0;
TR1=TR0=1;
EA=1;
EX1=1;
timing=1;
elseTR0=0;
time_l=(TH08)|TL0;
EA=0;
timing=0;
voidint1_isr(void)interrupt2TR1=0;
time_s=(TH18)|TL1;
voiddelay(uintt)ucharj=100;
while(t-)while(j-);
uintphase_differ(void)uintdiffer;
IT0=IT1=1;
EA=EX0=1;
while(timing);
delay(100);
differ=time_s*360/time_l;
return(differ);
voidbyte_trans(void)ucharnum=0;
TMOD=0X20;
SM0=0;
SM1=1;
PCON=0;
TH1=TL1=0XFD;
TR1=1;
SBUF=(uchar)(volts/10000);
while(!
TI);
TI=0;
SBUF=(uchar)(volts/1000%10);
SBUF=(uchar)(volts/100%10);
SBUF=.;
SBUF=(uchar)(volts/10%10);
SBUF=(uchar)(volts%10);
SBUF=(uchar)(amps/10000%10);
SBUF=(uchar)(amps/1000%10);
SBUF=(uchar)(amps/100%10);
SBUF=(uchar)(amps/10%10);
SBUF=(uchar)(amps%10);
SBUF=0;
a=(uchar)(power_fact*100);
SBUF=a%10;
a=(uchar)(power_fact*10);
voiddisplay(uintn)uchari;
for(i=0;
i5;
i+)delay
(1);
LEDportal=(n%10)|(i0,n-)if(n200)display(amps);
elsedisplay(volts);
elseif(u_i=0)display(volts);
elsedisplay(amps);
uintread_ui(bitui)uintvalue;
if(ui=1)XBYTEADCSTU|0x1000=0;
value=XBYTEADCH|0x1000;
value=(value4)|XBYTEADCL|0x1000;
/elseXBYTEADCSTU=0;
value=XBYTEADCH;
value=(value4)|XBYTEADCL;
/return(value);
voidmain(void)delay(300);
volts=read_ui(0);
volts=read_ui(0)*5.39;
amps=read_ui
(1);
amps=read_ui
(1)/1.02;
phase=phase_differ();
power_fact=cos(phase);
byte_trans();
dis_ctr();