数字电压表课程设计实验报告

电子技术课程设计

课题:数字电压表的设计

指导老师: 杨老师 程老师

学 院: 信 息 学 院

姓名学号: ????

班 级: 电 信12-2BF

数字电压表课程设计实验报告

1

目 录

一.设计课题.............................................................................. 错误!未定义书签。

二.设计要求................................................................................................................ 3

三.设计方案................................................................................................................ 3

1、主要芯片的选择................................................................................................ 3

2、量程转换的实现................................................................................................ 4

3、电压显示的实现................................................................................................ 5

4、小数点的驱动.................................................................................................... 6

5、电源滤波电路:................................................................................................ 6

四.实验过程................................................................................................................ 7

五.调试过程、参数测试及结果分析........................................................................ 8

1.调试过程:.......................................................................................................... 8

2.参数测试:.......................................................................................................... 9

3.结果及其分析:.................................................................................................. 9

六.设计、安装及调试中的体会.............................................................................. 10

七.附录...................................................................................................................... 11

附录A 数字电压表原理图 ................................................................................. 11

附录B PCB板图 ................................................................................................. 11

附录C 数字电压表实物图 ................................................................................. 11

2

一、设计课题:

液晶(或发光二极管)显示的3.1/2位数字电压表设计。

二、设计要求:

主要技术指标:直流电压测量范围0~200V,共分四挡:200mv、2v、20v和200v;分辨率0.1mv。

主要功能要求:具有正、负电压极性显示,小数点显示、超量程显示,量程自动转换等功能。

学 习 要 求:了解三位半数字电压表的基本构成;掌握双积分型A/D转换器的工作原理,以及通用数字电压表的设计方法与调试技术。

三、设计方案

1、主要芯片的选择:

本课程设计要将输入的模拟信号转化为数字量,本将数字量通过计数译码电路变换成笔段码。由于对转换速度没有要求,则可以选择双积分型ADC转换器,又由于要对数字量进行译码,则可以选择ICL7107型ADC,其主要缺点是精度比较低,且内部电压转换和控制部分不可控制。优点是价格低廉。

ICL7107功能介绍:

双积分型A/D转换器ICL7107是一种间接A/D转换器。它通过对输入模拟电压和参考电压分别进行两次积分,将输入电压平均值变换成与之成正比的时间间隔,然后利用脉冲时间间隔,进而得出相应的数字性输出。它包括积分器、比较器、计数器,控制逻辑和时钟信号源。

3

计数器对反向积分过程的时钟脉冲进行计数。控制逻辑包括分频器、译码器、相位驱动器、控制器和锁存器。

分频器用来对时钟脉冲逐渐分频,得到所需的计数脉冲fc和共阳极LED数码管公共电极所需的方波信号fc。

译码器为BCD-7段译码器,将计数器的BCD码译成LED数码管七段笔画组成数字的相应编码。

驱动器是将译码器输出对应于共阳极数码管七段笔画的逻辑电平变成驱动相应笔画的方波。

控制器的作用有三个:第一,识别积分器的工作状态,适时发出控制信号,使各模拟开关接通或断开,A/D转换器能循环进行。第二,识别输入电压极性,控制LED数码管的负号显示。第二,当输入电压超量限时发出溢出信号,使千位显示“1" ,其余码全部熄灭。

钓锁存器用来存放A/D转换的结果,锁存器的输出经译码器后驱动LED 。它的每个测量周期自动调零(AZ)、信号积分(INT)和反向积分(DE)三个阶

2、量程转换的实现:

各挡量程可以用多个电阻组成的电阻衰减网咯以及一个开关实现量程的手动转换,设计如下图。各档量程为200mv、2v、20v、200v、1000v五个不同档位,其中200mv为基本量程输入阻抗Ri=R7+R9+R10+R13+R14=10M,各档位衰减后的电压Vx与输入的电压Vi关系为:Vx=Vi.Rx/Ri,式中,Rx为开关S1的动端对地的电阻。R12为限流电阻,保险丝起过载保护电路,两只二极管和电容C9起过压保护电路。

4

3、电压显示的实现:

⑴数码管显示原理

图1.1-6数码管原理图

设计中采用的是4段LED数码管来显示电压值。LED具有耗电低、亮度高、视角大、线路简单、耐震及寿命长等优点,它由4个发光二极管组成,其中3个按?8?字型排列,另一个发光二极管为圆点形状,位于右下角,常用于显示小数点。把4个发光二极管连在一起,公共端接高电平,叫共阳极接法,相反,公共端接低电平的叫共阴极接法,我们采用共阴极接法。当发光二极管导通时,相应的一段笔画或点就发亮,从而形成不同的发光字符。其8段分别命名为dp g f e d c b a。例如,要显示“0”,则dp g f e d c b a分别为:00111111B;若要显示多个数字,只要让若干个数码管的位码循环为高电平就可以了。

⑵数码管的显示电路

数字电压表课程设计实验报告

数字电压表课程设计实验报告

5

4、小数点的驱动:

和量程档的选择一样,小数点的驱动也要用到短路帽,当Header 3X2的1和2短接时从左到右的第一个数码管亮;当Header 3X2的3和4短接时从左到右的第二个数码管亮;当Header 3X2的5和6短接时从左到右的第三个数码管亮。

数字电压表课程设计实验报告

图1.1-8.小数点驱动电路

5、电源滤波电路:

数字电压表课程设计实验报告

6

图1.1-2滤波电路

如上图所示,电路图的作用为滤波,通过两个电容将电源的交流成分滤掉,其目的为稳定电源输入量,减小因电源中的交流成分带来的不稳定及对电路的损害。

四、实验过程

该课程设计的主要任务是要求我们自己利用ICL7107及电阻电容去设计一个三位半的数字电压表,能够实现200mv、2v、20v、200v、1000v五个不同档位的电压测量。整个过程以下环节:画原理图,PCB布局,电路版的打印及制作,打孔,焊锡元器件,调试,误差分析等。整个过程要求我们先学会Altium Designer Release 10或者Altium Designer Release 6.9或者protel 99se等软件将原理图画出来及PCB的布局连线;其次制作PCB板时时要求我们掌握如何去打印PCB图,让我们知道了电路板上的铜线是怎么布上去的;然后在锡焊元器件的时候从很大一部分考验了我们锡焊的功底,同时又锻炼了我们的锡焊能力,提高了我们对锡焊能力培养的重视;最后在调试和误差分析的时候,让我知道在做电子类的产品的时候,并不是所有的理论在实践中都管用,让我们知道了理论和实践之间还是有很大的距离,提醒我们实践出真知,只有通过实践我们才可以更好的掌握和理解书本上理论。即主要为下面七步:

1、理解数字电压表的原理。

数字电压表课程设计实验报告

7

2、用AD6.9画出数字电压表的原理图,然后合理布线。

3、去制版室制作PCB板。

4、找齐元器件,焊接到PCB板上。

5、进行调试,并测量相关数据。

6、误差分析。

7、写实验报告。

五.调试过程、参数测试及结果分析

1.调试过程:

将已知的待测电压从数字电压表的两个输入端输入,接入正、负电源,先调节电位器RP使基本量程为200mv是的基准电压Vref=100mv,然后在电压表输入端Vx接入被测直流电压199.9mv或1.999v,这时显示器上分别显示199.9mv或1.999v。调试时应该注意小数点的定位开关S2与量程开关S1要分别对应。电路调试完成后,其他检查步骤如下:

1、零电压测量。将正输入端V+与负输入端V-短接,仪表应显示“0000”。

2、基准电压测量。将V+与VREF+短接,读书为99~101mv。

3、显示器笔端全亮测试。将TEST端(第37引脚)与VDD短接,读数应该为1888.

4、负号与溢出功能检测,将V+与VEE短接,应显示“—”号。当Vi超过量程后即溢出,千位应该显示“1”。而百位、个位、十位均不亮。

2.参数测试:

用万用表测量ICL7107的35和36号管脚的电压,使输入电压接近100mv。 8

3.结果及其分析:

⑴数据结果如图

数字电压表课程设计实验报告

图1.1-9.电压表测试数据结果

⑵误差分析

由上图可知我自己做的电压表测的电压不是很准确,通过计算和测量发现有一下原因:

(1)在量程选档的5个电阻值R5—R9并不是完全为9.1M,910K,91K和1K,其用到的电阻的测量值为10.2M,910.2k,89.2K和0.96K;通过对比发现电阻值整体取的较高,所以所测量的电压相对与标准电压值要小。

(2)观察到测量电压越大,误差也越大,因为标准电压的校准时用万用表测的ICL7107的35和36号管脚的电压不为标准的100mv,约为82.8mv。

(3)电路所选择的ADC为双积分型,其本身精度不是很高。

六.设计、安装及调试中的体会

做了这个数字电压表,从设计电路,到焊接,到调试,到最后成功的做出来一个完全属于自己的电压表,我将模拟电路和数字电路的理论应用与实际的 9

电子产品中,让我对于理论有一个更深的理解,同时也让我知道理论和实践之间是有差别的,只有加强自己的动手能力,学好理论的同时,多多实践,才能够将理论运用于实践。在实践时一个小小的细节,就可能导致失败,我有一个错误,幸好及时发现了,我暗自庆幸,可是我必须记住这个教训呀,以后不能再向这样马虎,不然后面在努力也是白费,因为我一开始就是错的。科学是严谨的,岂能有一点点马虎,我作为一名电子信息工程专业的学生,应该记住这一点呀。

10

九.附录

附录A数字电压表原理图

数字电压表课程设计实验报告

附录B PCB板图 11

附录C 数字电压表实物图

数字电压表课程设计实验报告

数字电压表课程设计实验报告

12

 

第二篇:数字电压表实验报告

数字电压表的综合设计

一、设计题目:

基于FPGA的数字电压表设计

二、设计任务:

1、具有0—2.5v的电压量程;

2、通过LED灯显示2进制数字量;

3、用FPGA设计制作成数字电压表的专用集成芯片,结合LED数码管构成一个能够实时显示的电压表。

三、总体设计框图:

1、总体框图

22、分模块设计框图:

LED数码管显示模块

TL549A/D处理模块

3、程序代码:

查找表程序代码

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity chazhaobiao is

         port(V:in std_logic_vector(7 downto 0);

              q:out std_logic_vector(11 downto 0)

              );

end entity chazhaobiao;

architecture behav of chazhaobiao is

signal c30,c74,c117,d0,d1:std_logic;

signal HB,LB:std_logic_vector(11 downto 0);

   begin                     --A/D值的高4位转换成3位BCD码

     HB<="001001000000" WHEN V(7 DOWNTO 4)="1111" ELSE  --2.40

         "001000100100" WHEN V(7 DOWNTO 4)="1110" ELSE  --2.24

         "001000001000" WHEN V(7 DOWNTO 4)="1101" ELSE  --2.08

         "000110010010" WHEN V(7 DOWNTO 4)="1100" ELSE  --1.92

         "000101110110" WHEN V(7 DOWNTO 4)="1011" ELSE  --1.76

         "000101100000" WHEN V(7 DOWNTO 4)="1010" ELSE  --1.60

         "000101000100" WHEN V(7 DOWNTO 4)="1001" ELSE --1.44

         "000100101000" WHEN V(7 DOWNTO 4)="1000" ELSE --1.28

         "000100010010" WHEN V(7 DOWNTO 4)="0111" ELSE  --1.12

         "000010010110" WHEN V(7 DOWNTO 4)="0110" ELSE  --0.96

         "000010000000" WHEN V(7 DOWNTO 4)="0101" ELSE  --0.80

         "000001100100" WHEN V(7 DOWNTO 4)="0100" ELSE  --0.64

         "000001001000" WHEN V(7 DOWNTO 4)="0011" ELSE  --0.48

         "000000110010" WHEN V(7 DOWNTO 4)="0010" ELSE  --0.32

         "000000010110" WHEN V(7 DOWNTO 4)="0001" ELSE  --0.16

         "000000000000";                                --0.00

                            --A/D值低4位变为3位BCD码

     LB<="000000010101" WHEN V(3 DOWNTO 0)="1111" ELSE  --0.15

         "000000010100" WHEN V(3 DOWNTO 0)="1110" ELSE --0.14

         "000000010011" WHEN V(3 DOWNTO 0)="1101" ELSE  --0.13

         "000000010010" WHEN V(3 DOWNTO 0)="1100" ELSE  --0.12

         "000000010001" WHEN V(3 DOWNTO 0)="1011" ELSE  --0.11

         "000000010000" WHEN V(3 DOWNTO 0)="1010" ELSE --0.10

         "000000001001" WHEN V(3 DOWNTO 0)="1001" ELSE --0.09

         "000000001000" WHEN V(3 DOWNTO 0)="1000" ELSE --0.08

         "000000000111" WHEN V(3 DOWNTO 0)="0111" ELSE  --0.07

         "000000000110" WHEN V(3 DOWNTO 0)="0110" ELSE  --0.06

         "000000000101" WHEN V(3 DOWNTO 0)="0101" ELSE --0.05

         "000000000100" WHEN V(3 DOWNTO 0)="0100" ELSE --0.04

         "000000000011" WHEN V(3 DOWNTO 0)="0011" ELSE  --0.03

         "000000000010" WHEN V(3 DOWNTO 0)="0010" ELSE --0.02

         "000000000001" WHEN V(3 DOWNTO 0)="0001" ELSE --0.01

         "000000000000"  ;                              --0.00

                     

c30<='1' when HB(3 downto 0)+LB(3 downto 0)>"01001" else

     '0';

 d1<='1' when HB(3 downto 0)>="1000" and LB(3 downto 0)>="1000" else

     '0';

c74<='1' when HB(7 downto 4)+LB(7 downto 4)>"01001"  else

     '0';

 d0<='1' when HB(7 downto 4) + LB(7 downto 4) ="01001" else

     '0';

c117<='1' when HB(11 downto 8)+LB(11 downto 8)>"01001" else

     '0';

q(3 downto 0)<=

     HB(3 downto 0)+LB(3 downto 0)+"0110" when

     c30='1' else

     HB(3 downto 0)+LB(3 downto 0)+"0110" when

     d1='1'  else

     HB(3 downto 0)+LB(3 downto 0);

    

q(7 downto 4)<=

     HB(7 downto 4)+LB(7 downto 4)+"0111" when

     c74='1' and c30='1' else

     HB(7 downto 4)+LB(7 downto 4)+"0110" when

     c74='1' and c30='0' else

     HB(7 downto 4)+LB(7 downto 4)+"0110" when

     c74='0' and c30='1' and d0='1' else

     HB(7 downto 4)+LB(7 downto 4)+"0001" when

     c74='0' and (c30='1'or d1='1') and d0='0' else

     HB(7 downto 4)+LB(7 downto 4);

    

q(11 downto 8)<=

     HB(11 downto 8)+LB(11 downto 8)+"0111" when

     c117='1' and c74='1' else

     HB(11 downto 8)+LB(11 downto 8)+"0110" when

     c117='1' and c74='0' else

     HB(11 downto 8)+LB(11 downto 8)+"0001" when

     c117='0' and c74='1' else

     HB(11 downto 8)+LB(11 downto 8)+"0001" when

     c117='0' and c74='0' and (c30='1'or d1='1') and d0='1' else

     HB(11 downto 8)+LB(11 downto 8);   

end ;    

译码器程序代码

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity yima is

port(clk:in std_logic;

     d:in std_logic_vector(11 downto 0);

     seg: out std_logic_vector(7 downto 0);

     sel: out std_logic_vector(2 downto 0));

end entity yima;

architecture behav of yima is

signal wei:std_logic_vector(2 downto 0);

signal num:std_logic_vector(3 downto 0);

signal a:std_logic_vector(2 downto 0);

begin

num<=d(3 downto 0) when a="000" else

     d(7 downto 4) when a="001" else

     d(11 downto 8) ;

seg(7)<='0'  when wei="011" else

        '1';

wei<="110" when a="000" else

     "101" when a="001" else

     "011";

sel<=wei;

COM1: process(clk)

begin

if clk'event and clk='1' then

a<=a+1;

if a="010" then  a<="000";

end if;

end if;

end process COM1;

COM2: process(num)

begin

 case num is

when "0000"=>seg(6 downto 0)<="1000000";--0

when "0001"=>seg(6 downto 0)<="1111001";--1

when "0010"=>seg(6 downto 0)<="0100100";--2

when "0011"=>seg(6 downto 0)<="0110000";--3

when "0100"=>seg(6 downto 0)<="0011001";--4

when "0101"=>seg(6 downto 0)<="0010010";--5

when "0110"=>seg(6 downto 0)<="0000010";--6

when "0111"=>seg(6 downto 0)<="1111000";--7

when "1000"=>seg(6 downto 0)<="0000000";--8

when "1001"=>seg(6 downto 0)<="0010000";--9

--when "1010"=>seg(6 downto 0)<="1110111";

--when "1011"=>seg(6 downto 0)<="1111100";

--when "1100"=>seg(6 downto 0)<="0111001";

--when "1101"=>seg(6 downto 0)<="1011110";

--when "1110"=>seg(6 downto 0)<="1111001";

--when "1111"=>seg(6 downto 0)<="1110001";

--when others=>seg(6 downto 0)<="0111111";

when others=>seg(6 downto 0)<="1000000";

end case;

end process COM2;

end;

电压表顶层程序代码:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity dianyabiao is

    Port (clk : in std_logic;                                         --50m系统时钟

        din : in std_logic;                                 --(tlc549)串行数据输出端

        clk_tlc549 : out std_logic;

        cs_tlc549  : out std_logic;                          --tlc549的片选信号输入端

        shift     : out std_logic_vector(3 downto 0);--动态扫描时的位选信号        

        cs_led    : out std_logic_vector(1 downto 0);--发光二极管及数码管的片选信号输入端

        dout_led  : out std_logic_vector(7 downto 0));--惧的发光器件的信号输出端

end dianyabiao;

architecture Behavioral of dianyabiao is

type state is (st1,st2);

signal current_state : state;

type state1 is (st0,st1,st2);

signal current_state1 : state1;

type state2 is (st0,st1,st2,st3,st4);

signal current_state2 : state2;

signal reg_datain : std_logic_vector(7 downto 0);

signal reg_dout : std_logic_vector(15 downto 0);

signal dout : std_logic_vector(4 downto 0);

signal reg_din : integer range 0 to 80000;

signal clk1m,clk1k,clk100 : std_logic;

begin

--分频部分

process(clk)                                            --产生1MHz的频率

variable cnt : integer range 0 to 50;

begin

   if clk'event and clk='1' then cnt:=cnt+1;

      if cnt<50 then

    if cnt<25 then clk1m<='0';

    else clk1m<='1';

    end if;

 else cnt:=0;

 end if;

   end if;

end process;

process(clk1m)                                              --产生1KHz的频率

variable cnt : integer range 0 to 1000;

begin

   if clk1m'event and clk1m='1' then cnt:=cnt+1;

      if cnt<1000 then

    if cnt<500 then clk1k<='0';

    else clk1k<='1';

    end if;

 else cnt:=0;

      end if;

   end if;

end process;

process(clk1k)                                                --产生100Hz的频率

variable cnt : integer range 0 to 10;

begin

   if clk1k'event and clk1k='1' then cnt:=cnt+1;

      if cnt<10 then

    if cnt<5 then clk100<='0';

    else clk100<='1';

    end if;

      else cnt:=0;

 end if;

   end if;

end process;

--tlc549的控制部分

process(clk1k)

variable cnt : integer range 0 to 7;

variable datain : std_logic_vector(7 downto 0);

begin

   if clk1k'event and clk1k='1' then

      case current_state is

      when st1=>                                                  --将数据进行串并转换

            cs_tlc549<='0';

                 datain:=datain(6 downto 0)&din;             --将读取的数据向高位移位

                 clk_tlc549<='1';

                 current_state<=st2;

      when st2=>

            cs_tlc549<='0';

                 clk_tlc549<='0';

                 current_state<=st1;

                 if cnt<7 then cnt:=cnt+1;                       --读取8位数据

                 else cnt:=0;

                      reg_din<=conv_integer(datain)*195;     --每单位数字量乘以系数=当前电压值;

                        reg_datain<=not(datain);

                 end if;

      when others=>

            current_state<=st1;

      end case;

   end if;

end process;

--十进制-BCD码转换;

process(clk100)             

variable reg : integer range 0 to 80000;

variable d1,d2,d3,d4 : std_logic_vector(3 downto 0);

begin

   if clk100'event and clk100='1' then

      case current_state1 is

 when st0=>

           reg:=reg_din;

                d1:="0000";d2:="0000";d3:="0000";d4:="0000";

                current_state1<=st1;

      when st1=>

           if reg>9999 then reg:=reg-10000;d1:=d1+1;

                elsif reg>999 then reg:=reg-1000;d2:=d2+1;

                elsif reg>99 then reg:=reg-100;d3:=d3+1;

                elsif reg>9 then reg:=reg-10;d4:=d4+1;

                else current_state1<=st2;

                end if;

      when st2=>

                reg_dout<=d1&d2&d3&d4;

                current_state1<=st0;

      when others=>

           current_state1<=st0;

      end case;

   end if;

end process;

--动态扫描控制;

process(clk1k)

begin

   if clk1k'event and clk1k='1' then

      case current_state2 is

      when st0=>                          --在发光二极管上显示模数转换后的数字量

              cs_led<="01";   --熄灭数码管

                shift<="1111";                    

                dout<="11111";

                current_state2<=st1;

      when st1=>                                               --在数码管的最高位显示数据

          cs_led<="10";                                  --熄灭发光二极管

                shift<="0111";                        --最高位数码管显示

                dout<='0'&reg_dout(15 downto 12);  --小数点显示,并且将最高位的数据送给译码器

                current_state2<=st2;

      when st2=>                                               --在数码管的次高位显示数据

           cs_led<="10";                                --熄灭发光二极管

                shift<="1011";                        --次高位数码管显示

                dout<='1'&reg_dout(11 downto 8);    --小数点不显示,将次高位的数据送给译码器

                current_state2<=st3;

 when st3=>                                                 --在数码管的次低位显示数据

           cs_led<="10";                                --熄灭发光二极管

                shift<="1101";                        --次低位数码管显示

                dout<='1'&reg_dout(7 downto 4);      --小数点不显示,将次低位的数据送给译码器

                current_state2<=st4;

      when st4=>                                               --在数码管的最低位显示数据

           cs_led<="10";                                --熄灭发光二极管

                shift<="1110";                        --最低位数码管显示

                dout<='1'&reg_dout(3 downto 0);      --小数点不显示,将最低位的数据送给译码器

                current_state2<=st0;

      when others=>

           current_state2<=st0;

 end case;

   end if;

end process;

--**将BCD码进行8段译码(包括小数点) **--

--**dout(4)代表小数点,低电平点亮  **--

code1: process (dout,reg_datain)                      

begin

   case dout(3 downto 0) is

   when "0000"=>dout_led<=dout(4)&"0000001";

   when "0001"=>dout_led<=dout(4)&"1001111";

   when "0010"=>dout_led<=dout(4)&"0010010";

   when "0011"=>dout_led<=dout(4)&"0000110";

   when "0100"=>dout_led<=dout(4)&"1001100";

   when "0101"=>dout_led<=dout(4)&"0100100";

   when "0110"=>dout_led<=dout(4)&"0100000";

   when "0111"=>dout_led<=dout(4)&"0001111";

   when "1000"=>dout_led<=dout(4)&"0000000";

   when "1001"=>dout_led<=dout(4)&"0000100";

                --"DOUT_LED"送给数码管;

   when others=>dout_led<=reg_datain(7)&reg_datain(0)&reg_datain(1)&reg_datain(2)&reg_datain(3)&reg_datain(4)&reg_datain(5)&reg_datain(6);

                --"DOUT_LED"送给发光二极管;

   end case;

end process;

end Behavioral;

四、波形仿真图:

五、结论:

本次实验达到了实验的基本要求,能够通过调节高精密变阻器实现0—2.5v的电压测量及显示。

六、心得体会:

通过本次实验我明白了任何一个实验的成功完成都是要经过认真的准备和预习的,再者就是理论和实践还是有一定的差距,只有通过实践才能更加好的理解理论知识,达到学以致用的目的。

相关推荐