数字电路与逻辑设计简易电压表实验报告.docx
- 文档编号:27204241
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:18
- 大小:176.80KB
数字电路与逻辑设计简易电压表实验报告.docx
《数字电路与逻辑设计简易电压表实验报告.docx》由会员分享,可在线阅读,更多相关《数字电路与逻辑设计简易电压表实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
数字电路与逻辑设计简易电压表实验报告
数字电路与逻辑设计
实验报告
简易电压表
姓名:
学院:
班级:
学号:
班内序号:
一、任务要求
设计并实现一个简易数字电压表,要求使用实验板上的串行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状态的改变使上述四种状态转移循环,从而实现了连续测量。
10
11
01
00
start=1reset=1start=0
reset=0
D、防抖模块
由于机械触点的弹性作用,一个按键开关在闭合及断开的瞬间必然伴随着一连串的抖动,为了使微控制器对一次按键动作只确认一次,消除抖动的影响。
E、报警模块
当所测电压超过2.5V,蜂鸣器报警。
三、仿真波形及波形分析
ad_clk:
ADS7816串行时钟输入
ad_cs:
ADS7816片选信号,低电平有效
alert:
蜂鸣器信号,高电平有效
cat0~cat5:
数码管共阴极端,低电平有效
clk:
主时钟
dat:
ADS781612位二进制数输出
op0~op7:
八段数码管
reset:
复位控制信号,高电平有效
start:
开始测量信号,高电平有效
在ad_cs有效后ad_clk的第三个时钟下降沿ADS7816输出数据开始送显,按下复位键,输出显示“0.00”,当再次按下开始键,可连续测量,如果测量超出一定范围,alert变为高电平,输出显示“———”。
四、源程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityVMis
port(
clk,reset,dat:
instd_logic;
ad_clk,ad_cs,alert:
outstd_logic;
op:
outstd_logic_vector(7downto0);
cat:
outstd_logic_vector(5downto0);
start:
instd_logic
);
endVM;
architectureaofVMis
typestate_typeis(state0,state1,state2,state3);
signalstate:
state_type;
signalad_dat:
integerrange0to16;
signalu_data1,u_data2,u_data3:
std_logic_vector(3downto0);
signaldata1,data2,data3:
integerrange0to9;
signalinput1,input2,reset1,reset2:
std_logic;
signalf_input,f_reset:
std_logic;
signalscn_clk:
integerrange0to2;
signald1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12:
std_logic;
signalsum1,sum2,sum3,sum,sums,sumg:
integerrange0to60000;
signaltemp_cs,clktmp:
std_logic;
begin
p1:
process(clk)--按键防抖
begin
ifclk'eventandclk='0'then
reset2<=reset1;
reset1<=reset;
input2<=input1;
input1<=start;
endif;
endprocessp1;
f_reset<=clkandreset1and(notreset2);
f_input<=clkandinput1and(notinput2);
p2:
process(clk)--ad_clk时钟输出
begin
ifclk='0'then
clktmp<='0';
else
clktmp<='1';
endif;
endprocessp2;
ad_clk<=clktmp;
p3:
process(clk,reset,start,state)--状态定义及转移
begin
ifclk'eventandclk='0'then
ifreset='0'then
ifstart<='0'then
state<=state0;
else
state<=state1;
endif;
else
ifstart='1'then
state<=state2;
else
state<=state3;
endif;
endif;
casestateis
whenstate0=>
ifstart='1'then
state<=state1;
else
state<=state0;
endif;
whenstate1=>
ifreset='1'then
state<=state2;
else
state<=state1;
endif;
whenstate2=>
ifstart='0'then
state<=state3;
else
state<=state2;
endif;
whenstate3=>
ifreset='0'then
state<=state0;
else
state<=state3;
endif;
whenothers=>state<=state0;
endcase;
endif;
endprocessp3;
p4:
process(scn_clk,clktmp)--扫屏时钟输出
begin
ifscn_clk=3then
scn_clk<=0;
elsifclktmp'eventandclktmp='0'then
scn_clk<=scn_clk+1;
endif;
endprocessp4;
p5:
process(clktmp,scn_clk,state,temp_cs,u_data3,u_data2,u_data1,sum,sums,sumg,sum3,sum2,sum1,data3,data2,data1)
begin
ifclktmp'eventandclktmp='0'then--片选,使ADS7816开始给控制器
casead_datis--传信号
when0=>temp_cs<='1';
when1=>temp_cs<='0';
whenothers=>null;
endcase;
endif;
ad_cs<=temp_cs;
ifclktmp'eventandclktmp='0'then--传入数据
ifad_dat<16then
ad_dat<=ad_dat+1;
else
ad_dat<=0;
endif;
casead_datis
when4=>d12<=dat;--从最高位开始传
when5=>d11<=dat;
when6=>d10<=dat;
when7=>d9<=dat;
when8=>d8<=dat;
when9=>d7<=dat;
when10=>d6<=dat;
when11=>d5<=dat;
when12=>d4<=dat;
when13=>d3<=dat;
when14=>d2<=dat;
when15=>d1<=dat;
whenothers=>null;
endcase;
u_data3<=d12&d11&d10&d9;--按位连接
u_data2<=d8&d7&d6&d5;
u_data1<=d4&d3&d2&d1;
endif;
caseu_data3is--二进制与十进制对应
when"0000"=>sum3<=0;
when"0001"=>sum3<=3124;
when"0010"=>sum3<=6246;
when"0011"=>sum3<=9368;
when"0100"=>sum3<=12492;
when"0101"=>sum3<=15616;
when"0110"=>sum3<=18738;
when"0111"=>sum3<=21860;
when"1000"=>sum3<=24984;
when"1001"=>sum3<=28108;
when"1010"=>sum3<=31230;
when"1011"=>sum3<=34354;
when"1100"=>sum3<=37496;
when"1101"=>sum3<=40600;
when"1110"=>sum3<=43724;
when"1111"=>sum3<=46846;
endcase;
caseu_data2is
when"0000"=>sum2<=0;
when"0001"=>sum2<=194;
when"0010"=>sum2<=390;
when"0011"=>sum2<=586;
when"0100"=>sum2<=780;
when"0101"=>sum2<=978;
when"0110"=>sum2<=1172;
when"0111"=>sum2<=1366;
when"1000"=>sum2<=1562;
when"1001"=>sum2<=1756;
when"1010"=>sum2<=1952;
when"1011"=>sum2<=2148;
when"1100"=>sum2<=2342;
when"1101"=>sum2<=2538;
when"1110"=>sum2<=2734;
when"1111"=>sum2<=2928;
endcase;
caseu_data1is
when"0000"=>sum1<=0;
when"0001"=>sum1<=12;
when"0010"=>sum1<=24;
when"0011"=>sum1<=36;
when"0100"=>sum1<=48;
when"0101"=>sum1<=62;
when"0110"=>sum1<=74;
when"0111"=>sum1<=86;
when"1000"=>sum1<=98;
when"1001"=>sum1<=110;
when"1010"=>sum1<=155;
when"1011"=>sum1<=134;
when"1100"=>sum1<=146;
when"1101"=>sum1<=158;
when"1110"=>sum1<=170;
when"1111"=>sum1<=184;
endcase;
--计算测量电压值
sum<=sum1+sum2+sum3;
sums<=sumrem10000;
sumg<=sumsrem1000;
data3<=sum/10000;
data2<=sums/1000;
data1<=sumg/100;
if(state=state1)or(state=state3)then--判断是否为可测状态
ifsum>25000then--判断是否溢出
alert<='1';
casescn_clkis
when0=>cat<="011111";op<="00000010";
when1=>cat<="101111";op<="00000010";
when2=>cat<="110111";op<="00000010";
whenothers=>null;
endcase;
else
alert<='0';
casescn_clkis
when0=>cat<="011111";--没有溢出送显
casedata3is
when0=>op<="11111101";
when1=>op<="01100001";
when2=>op<="11011011";
whenothers=>op<="11110110";
endcase;
when1=>cat<="101111";
casedata2is
when0=>op<="11111100";
when1=>op<="01100000";
when2=>op<="11011010";
when3=>op<="11110010";
when4=>op<="01100110";
when5=>op<="10110110";
when6=>op<="10111110";
when7=>op<="11100000";
when8=>op<="11111110";
when9=>op<="11110110";
endcase;
when2=>cat<="110111";
casedata1is
when0=>op<="11111100";
when1=>op<="01100000";
when2=>op<="11011010";
when3=>op<="11110010";
when4=>op<="01100110";
when5=>op<="10110110";
when6=>op<="10111110";
when7=>op<="11100000";
when8=>op<="11111110";
when9=>op<="11110110";
endcase;
whenothers=>null;
endcase;
endif;
else--如果为可测状态,显示0.00
alert<='0';
casescn_clkis
when0=>cat<="011111";op<="11111101";
when1=>cat<="101111";op<="11111100";
when2=>cat<="110111";op<="11111100";
whenothers=>null;
endcase;
endif;
--endif;
endprocessp5;
enda;
五、功能说明及资源利用情况
1、资源利用情况:
2、管脚定义:
3、功能说明:
本次实验完成了题目的所有基本要求以及连续测量的提高要求,即用三位数码管显示测量结果,保留两位小数;被测信号超过测量范围有溢出显示“———”,并且蜂鸣器发出警报;用按键btn0控制复位,btn1控制开始测量。
六、故障及问题分析
1、连续问题:
刚开始没有考虑连续测量的问题,所以按下复位键后再按开始键不能继续测量,经过和做同一实验的同学讨论,并上网查阅资料,回忆起了状态转移的知识,最终将start,reset分成四个状态,通过其中一个量的改变,实现状态转移周期循环,从而实现了连续测量。
2、ADS7816时序问题:
刚开始上手编代码,急于求成,并没有完全理解ADS7816的时序问题及其与控制器的配合,所以下到实验板上只能显示0.00,不管接不接电池,怎么按开始键都不能有效测量,静下心来,求教同学才理解透彻ADS7816时序,ad_cs的状态变化及ad_cs有效后第三个时钟下降沿才开始输出第一位数据,修改ad_clk和dat输出数据的配合问题后,终于有了有效电压的显示。
七、总结及结论
本次试验已经完成,单从简易数字电压表实验本身来说,学到了ADS7816这个芯片的使用和工作原理,AD模块的原理大同小异,学会一种,这一类也基本可以下手,所以在以后的学习中可以学以致用;另外学到了连续测量实现时用到的状态转移,上学期数电实验并没有涉及到有关的实验,只在数电课程上讲过,没有应用到实践中,所以并没有完全理解透彻,从这次实验,通过其应用,更好的理解了这个概念,感觉会在以后的实验中运用。
再从大的方面说,这次实验感觉时间还是挺紧迫的,所以刚开始特别浮躁着急,没有完全搞懂就着手做,所以不是特别顺利,后期慢慢静下心来,不断修改领会,才最终完成了实验。
所以还是那句话戒骄戒躁才能成大事。
另外,这次实验也锻炼了我发现问题并解决问题的能力,一个好的学习者不是没有问题,而是发现不了问题或者发现问题却不能自己解决,所以每次的实验都让我这方面的能力不断有所提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 逻辑设计 简易 电压表 实验 报告