有效值检波器.docx
《有效值检波器.docx》由会员分享,可在线阅读,更多相关《有效值检波器.docx(24页珍藏版)》请在冰豆网上搜索。
有效值检波器
2011年春季西南交通大学大学生电子设计竞赛
设计报告
有效值检波器
2011年5月27日
有效值检波器
引言
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
单片机因为体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,被广泛应用于仪器仪表中。
目前市场上的便携式仪表大多都是以单片机为核心。
LCD1602为工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)单片机加LCD1602液晶显示器,基本可以满足本次单片机控制的数显频率计的设计与制作。
ADC0832是NS(NationalSemiconductor)公司生产的串行接口8位A/D转换器,通过三线接口与单片机连接,功耗低,性能价格比较高,适宜在袖珍式的智能仪器仪表中使用。
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
芯片具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件连接和处理器控制变得更加方便。
通过DI数据输入端,可以轻易的实现通道功能的选择。
一.方案认证
1.单片机部分:
考虑到电子设计竞赛的内容和设计的目的,决定选取STC89C52。
此单片机虽然属于低端机型,但足以满足设计的要求。
选取其它的高端机型有些浪费。
所以使用STC89C52。
2.显示部分:
此次电子设计大赛要求地显示部分能够完成数字和常用字符的显示。
若用数码管则只能显示0-F,不能显示其它的字符及符号。
所以不能用数码管。
而选用LCD1602恰好符合要求。
所以应用LCD1602。
3.A/D转换部分:
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
芯片具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件连接和处理器控制变得更加方便。
通过DI数据输入端,可以轻易的实现通道功能的选择。
所以应用ADC0832。
二、硬件电路的设计
1.工作原理及系统框图
此次课程设计的要求如下:
一方面,单片机要通过I/O中接收输入信号,另一方面要通过I/O口控制液晶的初始化、显示方式以及要显示的字符。
因此,设计必须以单片机为核心,显示器为外围设备。
硬件上,单片机通过电路板电路与液晶显示电路相连;软件上,单片机要下载完整的程序对二者进行适时的控制。
5V
5V
单片机控制的数显频率计电路系统框图
从图中可以看出,单片机控制的有效值检波器的主要功能模块分为4类:
●液晶显示:
是指在单片机的控制下,液晶模块显示被测信号的频率与有效值。
●电源模块:
为单片机和液晶显示器提供工作电源。
●A/D模块:
将交流电压由模拟量转换为数字量。
●放大模块:
将微小交流电压量放大。
单片机电路主要是通过编写程序来控制硬件电路。
因此,可以通过改变程序,提高测量精度。
2.各部分电路设计
2.1单片机控制电路
单片机控制电路由STC89C52单片机、晶振时序电路、复位电路构成。
2.2.1单片机STC89C52
STC89C52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,STC89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
本次设计主要用到单片机4个I/O口中的3个,其中P3口及P1.0-P1.2与液晶显示器相接,18、19脚外界晶振电容为单片机提供时序。
2.2.2晶振时序电路
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
2.2.3复位电路
常见的复位电路有两种:
上电复位电路和开关复位电路,可根据电路的需要选择复位电路。
2.3液晶显示电路
字符型液晶显示模块LCD1602是一种用5x7点阵图形来显示字符的液晶显示器,其引脚功能如下表所示。
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
VL
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据/命令选择端(H/L)
12
D5
DataI/O
5
R/W
读写选择端(H/L)
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D0
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
读状态:
输入:
RS=L,RW=H,E=H输出:
D0~D7=状态字
写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:
无
读数据:
输入:
RS=H,RW=H,E=H输出:
D0~D7=数据
写数据:
输入:
RS=H,RW=L,D0~D7=数据,E=高脉冲输出:
无
根据1602液晶显示器的读写时序操作,编写相应的单片机驱动程序,便可以实现液晶显示器的显示输出。
2.4A/D转换电路
ADC0832有DIP和SOIC两种封装,DIP封装的ADC0832引脚排列如图所示。
各引脚说明如下:
CS——片选端,低电平有效。
CH0,CH1——两路模拟信号输入端。
DI——两路模拟输入选择输入端。
DO——模数转换结果串行输出端。
ADC0832引脚图
CLK——串行时钟输入端。
Vcc/REF——正电源端和基准电压输入端。
GND——电源地。
2.4电压放大及整流电路
在本设计中,采用LM324运放组成放大电路,对微量交流电压信号进行放大。
同时,对交流信号全波整流。
三、系统的软件设计
软件调试主要是编写相应的程序,在电路仿真软件上仿真,直至到预期效果。
1.程序框图
主程序及各子程序的框图见图。
主程序框图LCD程序流程图
2.程序清单
根据程序流程图,编写相应的子程序和主程序。
程序清单见附录3。
四、测试数据
1.同一频率在不同电压时的测量。
40mV
100mV
500mV
1V
5V
20Hz
20
0.0%
20
0%
20
0%
20
0%
20
0%
50Hz
50
0.0%
50
0%
52
4%
50
0%
53
6%
100Hz
100
0.0%
107
7%
101
1%
100
0%
101
1%
200Hz
199
0.5%
204
2%
200
0%
199
0.5%
199
0.5%
500Hz
526
5.2%
499
0.2%
499
0.2%
499
0.2%
498
0.4%
1kHz
1004
0.4%
998
0.2%
998
0.2%
999
0.1%
998
0.2%
2kHz
1995
0.2%
1997
0.1%
1993
0.3%
1995
0.2%
1998
0.1%
5kHz
4990
0.2%
4999
0.1%
4986
0.3%
4990
0.2%
4983
0.4%
10k
9976
0.2%
9986
0.1%
9992
0.1%
9982
0.1%
9975
0.2%
20k
19987
0.6%
19978
0.7%
19994
0.1%
19986
0.6%
19955
1%
100k
99967
0.1%
99936
0.1%
99967
0.1%
99957
0.1%
99849
0.1%
误差平均在0.2%以内。
2.同一电压在不同频率时的测量。
10Hz
100Hz
1000Hz
10KHz
50KHz
50mV
50.8
1.4%
50.8
1.4%
50.4
1.4%
48
4%
46
8%
100mV
106.4
6.4%
106
6%
104
4%
92
8%
84
16%
200mV
213
6.5%
210
5%
204
2%
201
0.5%
189
5.5%
500mV
502
0.4%
500
0%
500
0%
500
0%
458
8.2%
1V
1.03
3%
1.02
2%
1.01
1%
1.01
1%
0.92
8%
2V
2.1
0.5%
2.04
2%
2.01
0.5%
1.94
3%
1.85
7.5%
5V
5.08
1.6%
5.00
0%
4.92
1.6%
4.76
2.8%
4.52
9.6%
20V
20
0%
20
0%
20
0%
20
0%
18.5
0.7%
误差平均在3%以内。
五.心得体会
在这次电子设计竞赛中我们使用了STC89C52单片机。
这让我对于单片机有了更多的了解。
同时在找资料的过程中学到了许多单片机课本上没有讲到的知识。
在这次电子设计竞赛过程中,我们通过在原有的输入系统进行了改进,使之测量频率和电压有效值精度更高,使之成为一个更加适用,功能更加完备的属于自己的一个系统。
在这个过程中让我对于C语言的编写有了更深入的体会。
在这次电子设计竞赛中,虽然花费了大量的时间和精力,但我却学到了许多在理论课程中无法学到的知识。
最重要的是让我懂得了合作的重要性,学会了如何与人更好的合作。
六、参考文献
[2] 李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[3] 阎石.数字电子技术基础(第三版).北京:
高等教育出版社,1989
1版
[6]张毅刚等编著.《单片机原理及应用》.北京:
高等教育出版社.2004年1月第1版
附录1电路简图
附录2元器件清单
元器件
描述
数量
STC89C52
单片机
1
液晶显示器
LCD1602
1
按键开关
2
电阻
100
3
电容
342uF
1
晶振
11.0592MHz
1
ADC0832
1
电路板
2
10mm铜柱
10mm
12
LM324
1
电位器
103,104
6
拨码开关
6合1
1
指示灯
红色
1
二极管
IN4007
4
附录3程序清单:
#include//包含单片机寄存器的头文件
#include//包含_nop_()函数定义的头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitCS=P1^2;//将CS位定义为P3.4引脚
sbitCLK=P1^0;//将CLK位定义为P1.0引脚
sbitDIO=P1^1;//将DIO位定义为P1.1引脚
unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字
unsignedcharcodeStr[]="Volt=";//说明显示的是电压
//以下是对液晶模块的操作程序
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
//频率
ucharcodetable1[]="Freq=Hz";
unsignedcharcode
table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
bitflag;//定义标志位,确定是否到了1s
unsignedlongx;
ucharT0count;//从T0的计数单元中读取计数的数值
uchartimecount;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_date(uchardate)//写数据
{
P0=0xFF;
delay(5);
RS=1;
E=0;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
voidwrite_com(ucharcom)
{
P0=0xFF;
delay(5);
RS=0;
E=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
voidinit()//写位
{
ucharnum;
E=0;write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(table1[num]);
delay(5);
}
}
voidLcdPos(ucharxPos,ucharyPos)
//设置第(xPos,yPos)个字符的DDRAM地址
{unsignedchartmp;
xPos&=0x0f;//x位置范围是0~15
yPos&=0x01;//y位置范围是0~1
if(yPos==0)//显示第一行
tmp=xPos;
else
tmp=xPos+0x40;
tmp|=0x80;
write_com(tmp);
}
voidwrite_char(ucharc,ucharxPos,ucharyPos)
{
LcdPos(xPos,yPos);
write_date(c);
}
voiddelay1ms()//函数功能:
延时1ms
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
voiddelaynms(unsignedcharn)//函数功能:
延时若干毫秒,入口参数:
n
{
unsignedchari;
for(i=0;idelay1ms();
}
bitBusyTest(void)//函数功能:
判断液晶模块的忙碌状态
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=BF;//将忙碌标志电平赋给result
E=0;//将E恢复低电平
returnresult;
}
//函数功能:
将模式设置指令或显示地址写入液晶模块
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
_nop_();
_nop_();//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidWriteAddress(unsignedcharx)//函数功能:
指定字符显示的实际地址
{
WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
voidWriteData(unsignedchary)//函数功能:
将数据(字符的标准ASCII码)写入液晶模块
{
while(BusyTest()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
P0=y;//将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidLcdInitiate(void)//函数功能:
对LCD的显示模式进行初始化设置
{
delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);//连续三次,确保初始化成功
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x0c);//显示模式设置:
显示开,无光标,光标不闪烁
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x06);//显示模式设置:
光标右移,字符不移
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除
delaynms(5);//延时5ms ,给硬件一点反应时间
}
voiddisplay_volt(void)//函数功能:
显示电压符号数功能:
显示电压符号
{
unsignedchari;
WriteAddress(0x01);//写显示地址,将在第2行第1列开始显示
i=0;//从第一个字符开始显示
while(Str[i]!
='\0')//只要没有写到结束标志,就继续写
{
WriteData(Str[i]);//将字符常量写入LCD
i++;//指向下一个字符
}
}
voiddisplay_dot(void)//函数功能:
显示电压的小数点
{
WriteAddress(0x09);//写显示地址,将在第1行第10列开始显示
WriteData('.');//将小数点的字符常量写入LCD
}
voiddisplay_V(void)//函数功能:
显示电压的单位(V)
{
WriteAddress(0x0d);//写显示地址,将在第2行第13列开始显示
WriteData('V');//将字符常量写入LCD
}
voiddisplay1(unsignedcharx)//函数功能:
显示电压的整数部分
{
WriteAddress(0x08);//写显示地址,将在第2行第7列开始显示
WriteData(digit[x]);//将百位数字的字符常量写入LCD
}
voiddisplay2(unsignedcharx)//函数功能:
显示电压的小数数部分
{
unsignedchari,j;
i=x/10;//取十位(小数点后第一位)
j=x%10;//取个位(小数点后第二位)
WriteAddress(0x0a);//写显示地址,将在第1行第11列开始显示
WriteData(digit[i]);//将小数部分的第一位数字字符常量写入LCD
WriteData(digit[j]);//将小数部分的第一位数字字符常量写入LCD
}
unsignedcharA_D()//函数功能:
将模拟信号转换成数字信号
{
unsignedchari,dat;
CS=1;//一个转换周期开始
CLK=0;//为第一个脉冲作准备
CS=0;//CS置0,片选有效
DIO=1;//DIO置1,规定的起始信号
CLK=1;//第一个脉冲
CLK=0;//第一个脉冲的下降沿,此前DIO必须是高电平
DIO=1;//DIO置1,通道选择信号
CLK=1;//第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
CLK=0;//第二个脉冲下降沿
DIO=0;//DI置0,选择通道0
CLK=1;//第三个脉冲
CLK=0;//第三个脉冲下降沿
DIO=1;//第三个脉冲下沉之后,输入端DIO失去作用,应置1
CLK=1;//第四个脉冲
for(i=0;i<8;i++)//高位在前
{
CLK=1;//第四个脉冲
CLK=0;
dat<<=1;//将下面储存的低位数据向右移
dat|=(unsignedchar)DIO;//将输出数据DIO通过或运算储存在dat最低位
}
CS=1;//片选无效
returndat;//将读书的数据返回
}
voidmain()//函数功能:
主函数