单片机测电压电流DOC文档格式.docx
《单片机测电压电流DOC文档格式.docx》由会员分享,可在线阅读,更多相关《单片机测电压电流DOC文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
![单片机测电压电流DOC文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/31290112-053b-414a-8439-f7c707b223da/31290112-053b-414a-8439-f7c707b223da1.gif)
msp430f149最小系统电路。
将转换电路的输出接到msp430f149的P6口,该端口是ADC转换器的模拟输入通道。
MSP430F149自带12位AD,无需外接AD转换器,很方便,编程也相对简单,但是市场上只有贴片芯片,焊接很困难,且价格比较贵。
方案二:
采用Inntel生产的89C52。
采用51系列的AT89C52,它是低电压、低功耗、高性能的CMOS8位单片机,片内含8KB的可反复擦写的只读程序存储器和256B的随机存取数据存储器,32个I/O口线,3个16位定时/计数器,片内振荡器及时钟电路,并与MCS-51系列单片机兼容。
在设计中,单片机起着连接硬件电路与程序运行及存储数据的任务,一方面,它将A/D转换器、显示器和语音芯片等通过I/O口地址线和数据线连接起来。
芯片没有AD转换部分,需要外接AD转换芯片。
89C52我们比较熟悉,价格便宜,直插式,方便焊接,且符合实验要求。
对比考虑下,我们选择51系列的89C52芯片。
四.模数(A/D)转换芯片的选择
在本设计中,模数(A/D)转换模块是一个重要的模块,它关系到最后数电压电流值的精确度。
所以,A/D芯片的选择是设计过程中一个很重要的环节。
1.常用的A/D芯片简介
常用的A/D芯片有AD0809,AD0832,TLC2543C等几种。
下面简单介绍一下这三种芯片。
AD0809是8位逐次逼近型A/D转换器,它是由一个8路的模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进
1.状态转变成相应的逻辑电平,I/Oclk的下一个下降沿将根据下一个MSB/LSB将dataout驱动成相应的逻辑电平,剩下的各位依次移出。
2.EOC在最后的I/Oclk下降沿之后,从高电平变为低电平并保持低直到转换完成及数据准备传输。
3.GND端是内部电路的地回路端,除加有说明外,所有电压测量都相对于GND
4.I/Oclk端串行输入并完成以下四个功能:
第一,在I/Oclk的前8个上升沿,它将8个输入数据信键入输入数据寄存器。
在第4个上升沿之后为多路器的地址。
第二,在I/Oclk的第4个下降沿,在选定的多路器的输入端上的模拟输入电压开始和电容器充电并继续到I/Oclk的最后一个下降沿。
第三,它将前一次转换的数据的其余11位移出dataout端。
在I/Oclk的下降沿时数据变化。
第四,在I/Oclk的最后一个下降沿它将转换的控制信号传送到内部的状态控制位。
5.REF+端通常接VCC,最大输入电压范围取决于加于本端与加于REF-端的电压差。
6.REF-端通常接地。
五.液晶显示器的选择
方案一采用1602液晶芯片
1602液晶是工业字符型液晶,能够同时显示16*2即32个字符。
1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码。
使用时直接编写软件程序按一定的时序驱动即可。
它的特点是显示字迹清楚,价格相对便宜。
方案二采用12864液晶芯片
12864液晶也是一种工业字符型液晶,它不仅能够显示1602液晶所可以显示的字符,数字等信息,而且还可以显示8*4个中文汉字和一些简单的图片,显示信息也非常的清楚。
使用时也直接编写软件程序按一定的时序驱动即可。
不过它的价格比1602液晶贵了很多。
在本设计中,我们只需要显示最后电电压或的数字值,综合上面各种显示器件的特点:
而点阵显示器件驱动显示软件程序编写麻烦,占用的引脚相对也较多。
也不是理解的显示器件。
所以在本设计中,我们考虑用液晶显示器件,虽然12864液晶比1602液晶的功能强,不过在价格方面却贵了好多。
而1602液晶也足够满足本设计的需要。
因此,在本设计实验我们选择1602液晶显示器件。
2.1602液晶的参数资料
我们选择了1602液晶做为本设计的显示模块的显示器件。
以下是1602液晶的各方面参数:
1.接口信号说明:
编号
符号
引脚说明
1
VSS
电源地
2
VDD
电源正极
3
VL
液晶显示偏压信号
4
RS
数据/命令选择端
5
R/W
读/写选择端
6
E
使能信号
8-14
D0-D7
DataI/O
15
BLA
背光源正极
16
BLK
背光源负极
2.基本操作时序:
1.读状态:
输入:
RS=0,RW=1,E=1。
输出:
D0-D7为状态字
2.写状态:
RS=0,RW=0,D0-D7为指令码,E为高脉冲。
无
3.读数据:
RS=1,RW=1,E=1。
D0-D7为数据。
4.写数据:
RS=1,RW=0,D0-D7为数据,E为高脉冲。
3.状态字说明
STA7
STA6
STA5
STA4
STA3
STA2
STA1
STA0
STA0-6
当前数据地址指针的数值
读写操作使能
1:
禁止0:
允许
4.指令的说明。
显示模式设置
指令码
功能
设置16*2显示,5*7点阵,8位数据口
显示开/关及光标设置
D
C
B
D=1开显示;
D=0关显示
C=1显示光标;
C=0不显示关标
B=1光标闪烁;
B=0光标不显闪烁
N
S
N=1当读写一个字条款后地址指针加一,且光标加一。
N=0当读或写一个字符后地址指针减一,且光标减一。
S=1当写一个安条款,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果。
S=0当写一个字符,整屏显示不移动。
数据控制:
80H+地址码(0-27H,40H-67H)
设置数据地址指针
01H
显示清屏:
1,数据指针清0
2,所有显示清0
02H
显示回车:
数据指针清0
六.硬件总体设计:
1设计方案:
根据上述,我们选择单片机与A/D转换芯片结合的方法实现本设计。
使用的基本元器件是:
AT89C51单片机,TLC2543模数转换芯片,1602液晶显示器,开关,按键,电容,电阻,晶振,标准电源等等。
设计的基本框图如下:
七.硬件电路系统模块的设计
1.单片机系统
单片机最小系统包括晶振电路,复位电路,电源。
其原理图如下:
转换电路模块
根据设计要求,要检测直流电压电流并显示。
直流电压是10v-36v,电流是0.1A-3A。
这些都不满足ADC对模拟量的要求,故要通过转换电路转换后输入到ADC中去。
转换电路如下:
1.直流电压转换电路
该电路通过串联两个高精度的电阻分压、再通过低通滤波器滤波后连接一个电压跟随器。
待测量进入ADC或者单片机之前必须要滤波处理,提高抗干扰性。
若前级的电阻精度不高,导致被ADC采集的数据与待测的数据有误差,加上ADC转换、显示等的误差,这样就综合误差较大,可能不能达到百分之一的精度要求。
故这两个电阻需要一定的精度。
电阻选用精度为千分之一的精密电阻51k和4.7k。
电容选择100uf的钽电容,运放选择LM358
这个电压范围满足ADC的要求。
2.直流电流转换电路
0.1A-3A的直流电流需要先转换成直流电压,通过取样电阻转换成小电压信号,取样电阻选择为0.01Ω。
这里转换后的电压由于过小,所以需要采取一些抗干扰措施,比如在电源的引入端加电源退耦电容,或在输入端加低通滤波器。
对于这个小电压信号,可采用隔离放大器7840隔离后再将信号放大,这种放大器能隔离放大器是一种输入电路和输出电路之间电气绝缘的放大器,对模拟信号进行隔离,并按照一定的比例放大。
在这个隔离、放大的过程中要保证输出的信号失真要小,线性度、精度、带宽、隔离耐压等参数都要达到使用要求。
对被测对象和数据采集系统予以隔离,从而提高共模抑制比,同时保护电子仪器设备和人身安全。
不过这种放大器成本比较高,这里不采用。
仪表放大器是一种精密差分电压放大器,它具有高共模抑制比、高输入阻抗、低噪声、低线性误差、低失调漂移增益设置灵活和使用方便等特点,使其在数据采集、传感器信号放大中使用比较多。
运放A1,A2为同相差分输入方式,同相输入可以大幅度提高电路的输入阻抗,减小电路对微弱输入信号的衰减;
差分输入可以使电路只对差模信号放大,而对共模输入信号只起跟随作用,使得送到后级的差模信号与共模信号的幅值之比(即共模抑制比CMRR)得到提高。
这个仪表放大器可以通过三个运放外接一些电阻来实现。
成本低又能满足要求,故采用这种方式。
仪表放大器的放大倍数是;
由以上两式可算得Uo=0.1v–3v满足ADC的要求。
若要电路的抗干扰性能更高,还可以在两个差分的运放的反馈回路加高频消燥电容。
也可以采用电阻来分流,将0.1A-3A的电流分成0.1A-1A和1A-3A的两个量程的电流,然后通过小电阻转换成电压,对于小电压信号可以采用运放放大,大电压信号经滤波后输入到ADC中去。
由于这样不能实时采集信号,需要更换通道,故在这里采用仪表放大器来实现。
由于3A的直流电流比较大,可能会发生过流对人和电路有损害,需要考虑加过流保护装置。
一般的过流保护采用成本比较低的保险丝,采用普通熔丝的保护电路,其过电流反应是较迟钝的,因而不能作为灵敏的保护装置。
电子保护电路具有高速断流、恢复容易的特点,可应用于任何直流电路中作过流保护装置。
这里考虑当过流时需要切断电路而又能快速恢复电路使测试能继续进行。
采用电子保护电路。
其电路图如下:
电子保护电路如所示。
当微动开关K接通时,单向晶闸管SCR导通,直流电路也导通。
当用电量增大到超过规定的允许值时,检测电阻R1上的电压大于0.7V时,晶体管BG导通,此时晶体管集电极C和基极b间的电压下降到低于维持电压,BG,SCR关断,切断供电电路。
元件选择:
当电路两端电压≤100V时,BG用3DD15C,单向晶闸管SCR可用6A/400V。
R1的阻值是根据电源所允许的电流确定的,即R1=0.7/3(3为电源允许电流)。
若电路的耗电是5W,R2阻值为0.35Ω的线绕电阻,允许通过的电流为3A。
两个转换电路的输出接到ADC的模拟通道。
通过按键选择不同的通道来实现对电压或者电流的采集。
3.A/D转换芯片与单片机的连接
此设计中选择的是A/D转换芯片的通道0和1,A/D芯片的数据输入口连接单片机的P1.3口,数据输出口连接单片机的P1.4口,芯片使能端连接单片机的P1.5口,脉冲端连接单片机的P1.6口。
模块连接如下图所示。
4.1602液晶与单片机连接
此模块液晶的RS,RW和E端分别连接单片机的P2.0,P2.1和P2.2口;
液晶的数据各端口连接单片机的P0口。
具体如下图所示。
5.键盘与单片机的连接如下
该键盘的功能:
当键盘1被按下时,选择电压测量;
当键盘2被按下时,选择电流测量。
八.系统软件的设计
主程序设计包括以下方面:
按照硬件电路对单片机位定义。
编写延时模块程序。
编写驱动1602液晶显示模块程序。
编写驱动A/D转换模块程序。
编写键盘扫描切换模块程序。
主程序的总体流程如下图:
九.程序清单:
1.用按键选择调用子函数的方法实现电压电流测量的切换。
按键一选择电压测量,按键二选择电流测量。
#include<
reg52.h>
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab0[]="
WELCOMETOUSE"
;
//预定义宏
ucharcodetab1[]="
PRESSKEYCHOOSE"
ucharcodetab2[]="
VOLTAGEIS"
ucharcodetab3[]="
V"
ucharcodetab4[]="
CURRENTIS"
ucharcodetab5[]="
A"
longfloatdat;
sbitrs=P2^5;
//1602液晶写命令/数据标志,0时写命令
sbitrw=P2^6;
//1602液晶写入/读出标志,0时写入数据
sbitep=P2^7;
sbitinput=P1^3;
sbitoutput=P1^4;
sbitcs=P1^5;
sbitclk=P1^2;
sbitkey1=P3^2;
sbitkey2=P3^3;
voiddelay(intz)//延时函数
{
intx,y;
for(x=z;
x>
0;
x--)
for(y=10;
y>
y--);
}
voidwrite_com(ucharcom)//往1602液晶写命令函数
rs=0;
P0=com;
delay(5);
ep=1;
ep=0;
voidwrite_dat(longfloatdat)//往1602液晶写数据函数
rs=1;
P0=dat;
voidinit_1602()//对1602液晶的初始化函数
rw=0;
write_com(0x38);
//显示模式设置
write_com(0x0c);
delay
(1);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
voiddisplay(ucharx,uchary,uintdat)//显示电压值的函数,x行y列开始显示
uintadd;
uchari,a[5];
switch(x)
{
case0:
add=0x80;
break;
case1:
add=0x80+0x40;
}
add=add+y;
write_com(add);
for(i=0;
i<
5;
i++)
{
a[i]=dat%10;
dat=dat/10;
}
write_dat(a[4]+0x30);
write_dat(a[3]+0x30);
write_dat('
.'
);
write_dat(a[2]+0x30);
write_dat(a[1]+0x30);
write_dat(a[0]+0x30);
voiddisplay_zifu(ucharx,uchary,uchar*str)//显示字符函数,x行y列开始显示
add=add+y;
write_com(add);
while(*str!
='
\0'
)
write_dat(*str);
str++;
uintread_AD(ucharcon_way)//读取AD转换值操作函数
uintdat=0;
uchari;
cs=0;
clk=0;
con_way<
<
=4;
12;
con_way<
=1;
input=CY;
dat<
if(output)
dat=dat|0x01;
delay
(2);
clk=1;
delay(5);
clk=0;
cs=1;
returndat;
uintread_Vvalue()//电压的数值处理
longfloatdq;
longfloatdat_V;
dq=read_AD(0);
dat_V=(62250*dq)/4096;
dat=dat_V;
uintread_Avalue()//电流的数值处理
{
longfloatdat_A;
dq=read_AD
(1);
dat_A=(5000*dq)/4096;
dat=dat_A;
voidtest()//电压电流按键选择切换子函数函数
{intN=50;
intj;
longfloatsum=0;
if(key1==0)
{delay(10);
{init_1602();
delay(10);
for(j=0;
j<
N;
j++)//平均值滤波去干扰
sum+=read_Vvalue();
dat=(sum/N);
display_zifu(0,0,tab2);
display(1,5,dat);
display_zifu(1,12,tab3);
if(key2==0)
{delay(10);
if(key2==0)
=N;
sum+=read_Avalue();
display_zifu(0,0,tab4);
display_zifu(1,12,tab5);
voidmain()//主函数
init_1602();
display_zifu(0,1,tab0);
display_zifu(1,0,tab1);
while
(1)
{test();
}
}
2.用中断方法实现电压电流测量的切换。
按键一外部中断0选择电压测量,按键二外部中断1选择电流测量。
voiddelay(intz)//延时函数
ep=0