数字电路与逻辑设计简易电压表实验报告

更新时间:2024-04-02 10:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数字电路与逻辑设计

实验报告

简易电压表

姓名:

学院:

班级:

学号:

班内序号:

一、 任务要求

设计并实现一个简易数字电压表,要求使用实验板上的串行AD芯片。 基本要求:

1、 测量对象:1~2节干电池。

2、 AD参考电压:5V(根据实验室不同确定)。 3、 用三位数码管显示测量结果,保留两位小数。 4、 被测信号超过测量范围有溢出显示并有声音提示。 5、 按键控制测量和复位。

提高要求:

1、 能够连续测量。 2、 自拟其他功能。

二、 系统设计

1、

设计思路

简易电压表的设计可分成五个模块设计:微控制器模块是核心,完成外部按键功能控制,接收ADS7816传入信号并完成数据处理,控制数码管送显,完成当测量值超出范围时控制蜂鸣器发声等功能;模数转化模块将AD_IN接收的模拟信号转化成12位二进制数,在控制器的控制下传入控制器;数码管显示模块完成电压值显示的功能;报警模块和防抖模块分别完成溢出蜂鸣器报警和按键防抖的功能。另外,微控制器,数码管显示及模数转换都需要提供时钟。通过状态转移实现连续测量。 2、 总体框图

时钟输入

模数AD_IN接收模拟电压值转化生成12位二进制数程序处理 转 换模控制转化进程 块 微控制器模块 数码管显示

溢出警告

按键控制蜂鸣器报警 防抖模块 报警模块

3、 分块设计 A、模数转换模块:

CS:片选信号(低电平有效) DOUT:转化后输出信号DCLOCK:串行时钟输入

CS的下降沿用于启动转换和数据变换,CS有效后的最初1.5至2个转换周期内,ADS7816采样输入信号,此时输出引脚Dout呈三态。DCLK的第2个下降沿后,Dout使能并输出一个时钟周期的低电平的无效信号。在随后的12个DCLK周期中,Dout输出转换结果,其输出数据的格式是最高有效位(B11位)在前。当最低有效位(B0位)输出后,若CS变为高电位,则一次转换结束,Dout显三态。

若CS仍保持为低电平,则在随后的时钟周期中,Dout将以最低有效位在前的格式重复输出转换后的数据,其中第2次重复输出的最低有效位不再出现(与前一输出周期的最低有效位重叠),当最高有效位(B11位)重新出现后,Dout呈三态,以后的时钟序列对ADS7816不产生影响,仅当CS由高变为低后,ADS7816才启动下一个新的转换。

B、 数码器显示模块

时钟扫屏,控制数码管6个共阴极端中的其中三个依次显示,6个共阴极端由catn控制输出,当其中一个cat为低电平时,该数码管相应的段位就会亮。每个共阴极端由8段数码管AA,AB,AC,AD,AE,AF,AG,AP显示,其中AP表示小数点,高电平有效,显示字形如下表:

C、微控制器模块

此模块主要完成对ADS7816传来12位二进制数计算并转化为十进制数送显的功能。

算法为:首先将5V参考电压除以12位二进制所代表的十进制4095,得到分度值0.001221V,为了方便计算,将其扩大10000倍,即12.21V。12位二进制数分为低四位,中四位和高四位,并将低四位,中四位和高四位按从高位到低位的顺序依次连接,组成3个四位二进制数,它们分别代表十进制的0~15,16~240,241~3840,乘以分度值即代表0~184V,194~2928V,3124~46846V。将此时各段的二进数相加就得到实际电压放大10000倍后的值,通过一系列除法及取余的运算,分别送到数码管三个共阴极端显示。

另外实现了连续测量:将start,reset的状态分为四种00,01,11,10,其中01,10为可测状态,00,11为不可测状态。start,reset状态的改变使上述四种状态转移循环,从而实现了连续测量。

start=1 reset=1 start=0 10 11 00 01

reset=0 D、 防抖模块

由于机械触点的弹性作用,一个按键开关在闭合及断开的瞬间必然伴随着一连串的抖动,为了使微控制器对一次按键动作只确认一次,消除抖动的影响。 E、 报警模块

当所测电压超过2.5V,蜂鸣器报警。

三、仿真波形及波形分析

ad_clk:ADS7816串行时钟输入

ad_cs:ADS7816片选信号,低电平有效 alert:蜂鸣器信号,高电平有效

cat0~cat5:数码管共阴极端,低电平有效 clk:主时钟

dat:ADS7816 12位二进制数输出 op0~op7:八段数码管

reset:复位控制信号,高电平有效 start:开始测量信号,高电平有效

在ad_cs有效后ad_clk的第三个时钟下降沿ADS7816输出数据开始送显,按下复位键,输出显示“0.00”,当再次按下开始键,可连续测量,如果测量超出一定范围,alert变为高电平,输出显示“———”。

四、源程序

libraryieee;

use ieee.std_logic_1164.all; useieee.std_logic_arith.all; useieee.std_logic_unsigned.all;

entity VM is port(

clk,reset,dat:instd_logic;

ad_clk,ad_cs,alert:outstd_logic;

op:outstd_logic_vector(7 downto 0); cat:outstd_logic_vector(5 downto 0); start:instd_logic ); end VM;

architecture a of VM is

typestate_type is (state0,state1,state2,state3); signalstate:state_type;

signalad_dat:integer range 0 to 16;

signal u_data1,u_data2,u_data3:std_logic_vector(3 downto 0); signal data1,data2,data3:integer range 0 to 9; signal input1,input2,reset1,reset2:std_logic; signalf_input,f_reset:std_logic; signalscn_clk:integer range 0 to 2;

signal d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12:std_logic;

signal sum1,sum2,sum3,sum,sums,sumg:integer range 0 to 60000; signaltemp_cs,clktmp:std_logic; begin

p1:process(clk) --按键防抖 begin

ifclk'event and clk='0' then reset2<=reset1; reset1<=reset; input2<=input1; input1<=start; end if;

end process p1;

f_reset<=clk and reset1 and (not reset2); f_input<=clk and input1 and (not input2);

p2:process(clk) --ad_clk时钟输出 begin

ifclk='0'then clktmp<='0'; else

clktmp<='1'; end if;

end process p2;

ad_clk<=clktmp;

p3:process(clk,reset,start,state) --状态定义及转移 begin

ifclk'event and clk='0' then if reset='0'then if start<='0'then state<=state0; else

state<=state1; end if; else

if start='1'then state<=state2; else

state<=state3; end if; end if;

case state is when state0=> if start='1'then state<=state1; else

state<=state0; end if;

when state1=> if reset='1'then state<=state2; else

state<=state1; end if;

when state2=> if start='0'then state<=state3; else

state<=state2; end if;

when state3=> if reset='0'then state<=state0; else

state<=state3; end if;

when others=>state<=state0; end case; end if;

end process p3;

p4:process(scn_clk,clktmp)

begin

ifscn_clk=3 then scn_clk<=0;

elsifclktmp'event and clktmp='0' then scn_clk<=scn_clk+1; end if;

end process p4 ;

--扫屏时钟输 出

p5:process(clktmp,scn_clk,state,temp_cs,u_data3,u_data2,u_data1,sum,sums,sumg,sum3,sum2,sum1,data3,data2,data1)

begin

if clktmp'event and clktmp='0'then --片选,使ADS7816开始给控制器

case ad_dat is --传信号 when 0=>temp_cs<='1'; when 1=>temp_cs<='0'; when others=>null; end case; end if;

ad_cs<=temp_cs;

if clktmp'event and clktmp='0'then --传入数据 ifad_dat<16 then ad_dat<=ad_dat+1; else

ad_dat<=0; end if; casead_dat is

when 4 =>d12<=dat; --从最高位开始传 when 5 =>d11<=dat; when 6 =>d10<=dat; when 7 =>d9<=dat; when 8 =>d8<=dat; when 9 =>d7<=dat; when 10 =>d6<=dat; when 11 =>d5<=dat; when 12 =>d4<=dat; when 13 =>d3<=dat; when 14 =>d2<=dat; when 15 =>d1<=dat; when others=>null; end case;

u_data3<=d12&d11&d10&d9; --按位连接 u_data2<=d8&d7&d6&d5; u_data1<=d4&d3&d2&d1; end if;

case u_data3 is --二进制与十进制对应 when \ when \when \when \when \

when \when \when \when \when \when \when \when \when \when \when \end case;

case u_data2 is

when \when \when \when \when \when \when \when \when \when \when \when \when \when \when \

when \ end case;

case u_data1 is

when \ when \when \when \when \when \when \when \when \when \when \

when \when \when \when \when \end case;

--计算测量电压值 sum<=sum1+sum2+sum3; sums<=sum rem 10000; sumg<=sums rem 1000;

data3<=sum/10000; data2<=sums/1000; data1<=sumg/100;

if (state=state1)or(state=state3) then --判断是否为可测状态 if sum>25000 then --判断是否溢出 alert<='1'; casescn_clk is

when 0=>cat<=\ when 1=>cat<=\ when 2=>cat<=\when others=>null; end case; else

alert<='0'; casescn_clk is

when 0=>cat<=\ --没有溢出送显 case data3 is

when 0=>op<=\when 1=>op<=\when 2=>op<=\

when others=>op<=\end case;

when 1=>cat<=\case data2 is

when 0=>op<=\ when 1=>op<=\ when 2=>op<=\ when 3=>op<=\ when 4=>op<=\ when 5=>op<=\ when 6=>op<=\ when 7=>op<=\ when 8=>op<=\

when 9=>op<=\ end case;

when 2=>cat<=\case data1 is

when 0=>op<=\ when 1=>op<=\ when 2=>op<=\ when 3=>op<=\ when 4=>op<=\ when 5=>op<=\ when 6=>op<=\ when 7=>op<=\ when 8=>op<=\ when 9=>op<=\ end case; when others=>null; end case; end if;

else --如果为可测状态,显示0.00 alert<='0'; casescn_clk is

when 0=>cat<=\when 1=>cat<=\when 2=>cat<=\when others=>null; end case; end if; --end if;

end process p5; end a;

五、功能说明及资源利用情况

1、 资源利用情况:

2、管脚定义:

3、功能说明:

本次实验完成了题目的所有基本要求以及连续测量的提高要求,即用三位数码管显示测量结果,保留两位小数;被测信号超过测量范围有溢出显示“———”,并且蜂鸣器发出警报;用按键btn0控制复位,btn1控制开始测量。

六、故障及问题分析

1、连续问题:

刚开始没有考虑连续测量的问题,所以按下复位键后再按开始键不能继续测量,经过和做同一实验的同学讨论,并上网查阅资料,回忆起了状态转移的知识,最终将start,reset分成四个状态,通过其中一个量的改变,实现状态转移周期循环,从而实现了连续测量。 2、 ADS7816时序问题:

刚开始上手编代码,急于求成,并没有完全理解ADS7816的时序问题及其与控制器的配合,所以下到实验板上只能显示0.00,不管接不接电池,怎么按开始键都不能有效测量,静下心来,求教同学才理解透彻ADS7816时序,ad_cs的状态变化及ad_cs有效后第三个时钟下降沿才开始输出第一位数据,修改ad_clk和dat输出数据的配合问题后,终于有了有效电压的显示。

七、总结及结论

本次试验已经完成,单从简易数字电压表实验本身来说,学到了ADS7816这个芯片的使用和工作原理,AD模块的原理大同小异,学会一种,这一类也基本可以下手,所以在以后的学习中可以学以致用;另外学到了连续测量实现时用到的状态转移,上学期数电实验并没有涉及到有关的实验,只在数电课程上讲过,没有应用到实践中,所以并没有完全理解透彻,从这次实验,通过其应用,更好的理解了这个概念,感觉会在以后的实验中运用。

再从大的方面说,这次实验感觉时间还是挺紧迫的,所以刚开始特别浮躁着急,没有完全搞懂就着手做,所以不是特别顺利,后期慢慢静下心来,不断修改领会,才最终完成了实验。所以还是那句话戒骄戒躁才能成大事。另外,这次实验也锻炼了我发现问题并解决问题的能力,一个好的学习者不是没有问题,而是发现不了问题或者发现问题却不能自己解决,所以每次的实验都让我这方面的能力不断有所提高。

本文来源:https://www.bwwdw.com/article/vxhr.html

Top