数字电路与逻辑设计简易电压表实验报告
更新时间:2024-04-02 10:22:01 阅读量: 综合文库 文档下载
- 数字电路与逻辑设计pdf推荐度:
- 相关推荐
数字电路与逻辑设计
实验报告
简易电压表
姓名:
学院:
班级:
学号:
班内序号:
一、 任务要求
设计并实现一个简易数字电压表,要求使用实验板上的串行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模块的原理大同小异,学会一种,这一类也基本可以下手,所以在以后的学习中可以学以致用;另外学到了连续测量实现时用到的状态转移,上学期数电实验并没有涉及到有关的实验,只在数电课程上讲过,没有应用到实践中,所以并没有完全理解透彻,从这次实验,通过其应用,更好的理解了这个概念,感觉会在以后的实验中运用。
再从大的方面说,这次实验感觉时间还是挺紧迫的,所以刚开始特别浮躁着急,没有完全搞懂就着手做,所以不是特别顺利,后期慢慢静下心来,不断修改领会,才最终完成了实验。所以还是那句话戒骄戒躁才能成大事。另外,这次实验也锻炼了我发现问题并解决问题的能力,一个好的学习者不是没有问题,而是发现不了问题或者发现问题却不能自己解决,所以每次的实验都让我这方面的能力不断有所提高。
正在阅读:
数字电路与逻辑设计简易电压表实验报告04-02
住宅小区室外工程 施工组织设计07-12
《岳阳楼记》与《醉翁亭记》之异同浅析02-26
VDA6.3 - 2010提问表(60个条款) - 图文01-19
财政资金管理自查报告03-26
【精品】寻觅春天的踪迹作文集合九篇04-02
CNBr活化琼脂糖填料明书(GE)05-10
2012中山大学《计算机网络》作业111-11
实验3Excel表格制作09-13
《生命生命》课文原文-word文档04-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 逻辑设计
- 电压表
- 简易
- 电路
- 实验
- 数字
- 报告
- ××商会增值服务提成奖励办法
- xh各家医院整理后规范
- 综合教程第四册课后习题词形转换答案(有删减单元)
- 海口市电动车摩托车科目一非机动车复习题
- 客户至尊 - 金牌客户服务技巧
- 四川省人民政府令216号令四川省生产经营单位安全生产责任规定
- 2011年—2018年新课标全国卷1文科数学分类汇编—8.立体几何
- PSCAD中不同模块间的信号传递
- 元发展社会主义民主政治第五课第二框人民代表大会制度我国的根本
- 2014年秋新人教版三年级数学上册123单元 打印(1)
- 植物高蛋白分析
- 年产300万平方抛光砖原料车间的工艺设计实现项目可行性方案
- 2018年中国糖果行业分析及发展趋势预测(目录) - 图文
- 全国爆破工程技考核试卷
- 汽车发动机原理课后答案 王建昕 帅石金 清华大学出版社
- (最新)2011-2012学年度第一学期历史期末质量检测
- 南水北调中线一期工程 某标段 防护堤土方填筑碾压试验方案
- 河北省工程技术研究中心可行性论证报告最新版
- 小学羽毛球特色教学教案(羽毛球)
- 《点集拓扑学》§6.3 Urysohn引理和Tietze扩张定理