




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
pld课程设计-模拟信号处理模拟信号处理一、实验题目2二、实验目的2三、设计内容2四、实验原理24.1 adc0804芯片介绍24.1.1 adc0804工作过程44.1.2 adc0804 转换器的工作时序图及转换步骤64.1.3 adc0804的转换精度74.1.4 ad转换的转换公式74.2 矩阵键盘原理84.3 报警电路原理9五、实验思路105.1 adc0804模块105.2 键盘模块11六、实验流程图136.1 ad转换过程136.2 键盘实现过程13七、实验收获及心得体会14八、附录15一、实验题目模拟信号处理二、实验目的1、学习verilog hdl的设计技巧2、学习adc0804模块工作原理3、掌握adc0804控制逻辑设计技术三、设计内容学习adc0804模块的工作原理,利用adc0804对外部输入的模拟信号进行采用获取当前电压值,在数码管上显示。四、实验原理4.1 adc0804芯片介绍 1功能:a/d转换器就是模拟/数字转换器(adc),是将输入的模拟信号转换成数字信号。信号输入端可以是传感器或转换器的输出,而adc的数字信号也可能提供给微处理器,以便更广泛的应用。2 adc0804的规格及引脚图: 8位cmos依次逼近型的a/d转换器。 三态锁定输出 存取时间:135us 分辨率:8位 转换时间:100us 总误差:正负1lsb 工作温度:adc0804lcn0_70度 引脚图及说明图如图4.1.1所示:图4.1.1 adc0804的引脚图/cs:芯片选择信号。/rd:外部读取转换结果的控制输出信号。/rd为高电平,8个数字输出口处理高阻抗,/rd为低电平时数字数据才会输出。/wr:用来启动转换的控制输入,相当于adc转换的开始(cs=0时),/wr由高电平变为低电平,转换器被清除,/wr回到高电平时,转换正式开始。clk_in和clk_r:时钟输入或接振荡元件(r.c),频率限制在100khz1460khz,如果使用rc电路,振荡频率为1/(1.1rc)。/intr:中断请求信号输出,低电平动作。intr 是转换结束信号输出端,输出跳转为低电平表示本次转换已经完成,可作为微处理器的中断或查询信号。如果将/cs 和/wr 端与/intr 端相连,则adc0804 就处于自动循环转换状态。vin(+)和vin(-):差动模拟电压输入,输入单端正电压时,vin(-)接地。差动输入时直接接vin(+) vin(-)。agnd:模拟信号接地。dgnd:数字信号接地。vref/2:辅助参考电压。db0db7:8位的数字输出。vcc:电源供应以及作为电路的参考电压。引脚功能及应用特性如下: /cs 、/rd 、/wr (引脚1、2、3):是数字控制输入端,满足标准ttl 逻辑电平。其中/cs 和/wr用来控制a/d 转换的启动信号。/cs 、/rd 用来读a/d 转换的结果,当它们同时为低电平时,输出数据锁存器db0db7 各端上出现8位并行二进制数码。clkin(引脚4)和clkr(引脚19):adc08010805片内有时钟电路,只要在外部“clki”和“clkr”两端外接一对电阻电容即可产生a/d转换所要求的时钟,其振荡频率为fclk1/1.1rc。其典型应用参数为:r=10k,c=150pf,fclk640khz转换时间为100us。若采用外部时钟,则外部fclk可从clkin端送入,此时不接r、c允许的时钟频率范围为100khz1460khz。cs0时,允许进行a/d转换。wr由低跳高时a/d转换开始,8位逐次比较需88=64个时钟周期,再加上控制逻辑操作,一次转换需要6673个时钟周期。在典型应用fclk640khz时,转换时间约为103us114us。当fclk 超过640khz,转换精度下降,超过极限值1460khz 时便不能正常工作。本次实验中,选择clk=40mhz,经过200分频之后,使时钟频率为fclk=200khz。实验箱上adc0804的原理图如图4.1.2:图4.1.2 adc0804原理图由原理图上可以看出adc0804部分的各种参数设置。4.1.1 adc0804工作过程控制adc0804进行模拟/数字的转换时使用的信号为cs、wd、rd三个。db0db7代表转换后的数字资料。可以分为如下步骤:(1)、置cs=wr=0,rd=1,要求adc0804开始进行模拟/数字转换;(2)、置cs=wr=rd=1,此时adc0804进行转换动作,转换时间100us,init下降沿表示完成;(3)、置cs=rd=0,wd=1,向adc0804请求读取转换后数据;(4)、读取db0db7的数据,置cs=wr=rd=1。状态转换图分析如下:我们把state作为状态标志,共有4个值:00,01,10,11.当state=00时,片选信号cs=写信号wr=0,而读信号rd=1,此时执行写操作,完成后延时一段时间,转入state=01状态。进入state=01状态后,cs=wr=rd=1,即0804不工作,这样把写入的数值存住,当存完毕,发出int=0信号,转入state=10状态,若未存住,则发出int=1,继续第二步。进入state=10状态,cs=rd=0,wr=1,进行读操作,完成后延时一段时间,转入state=11状态。进入最后一个状态后,依然cs=rd=wr=1,这样实现ad804的复位工作,再自动转回state=00状态。设s0、s1、s2、s3对应上面所说的四种状态,转换图如下:4.1.2 adc0804 转换器的工作时序图及转换步骤adc0804的工作时序图(timing diagrams)如图4.1.2所示:图4.1.2:adc0804手册给出的adc转换时序图图4.1.2给出的其实就是使adc0804正确工作的软件编程模型。由图可见,实现一次adc转换主要包含下面三个步骤:1.启动转换:由图4.1.2中的上部“figure 10a”可知,在/cs信号为低电平的情况下,将/wr引脚先由高电平变成低电平,经过至少tw(wr)i延时后,再将/wr引脚拉成高电平,即启动了一次ad转换。注:手册中给出了要正常启动ad转换/wr的低电平保持时间tw(wr)i的最小值为100ns,即/wr拉低后延时大于100ns即可,不用太精确,只要估计插入的延时大于100ns即可。2延时等待转换结束:依然由图4.1.2中的上部“figure 10a”可知,由拉低/wr信号启动ad采样后,经过1到8个tclk+internal tc延时后,ad转换结束,因此,启动转换后必须加入一个延时以等待ad采样结束。注:手册中给出了内部转换时间“internal tc”的时间范围为6273个时钟周期,因此延时等待时间应该至少为8+73=81个时钟周期。本次实验采用外部时钟,外部fclk可从clkin端送入,此时不接r、c允许的时钟频率范围为100khz1460khz。本实验时钟频率约为fclk=200khz,因此时钟周期约为tclk=1/fclk=5us。所以该步骤至少应延时81*tclk405us。不用太精确,只要估计插入的延时大于405us即可。3.读取转换结果:由图4.1.2的下部“figure 10b”可知,采样转换完毕后,再/cs信号为低的前提下,将/rd脚由高电平拉成低电平后,经过tacc的延时即可从db脚读出有效的采样结果。注:手册中给出了tacc的典型值和最大值分别为135ns和200ns,因此将/rd引脚拉低后,等待大于200ns后即可从db0db7读出有效的转换结果。不用太精确,只要估计插入的延时大于200ns即可。4.1.3 adc0804的转换精度关于转换器的转换精度问题,用分辨率和转换误差来描述其转换精度。所谓分辨率,就是电路所能分辨的最小输出电压u(lsb)与满刻度输出电压u(omax)之比:分辨率=u(lsb)/u(omax)=1/(2n-1)转换误差:指输入端加满刻度的数字量时,adc输出电压的理论值与实际值之差。转换误差一般0.5u(lsb)最小分辨电压:u(lsb)=分辨率*u(omax)=u(omax)/(2n-1)。由于adc0804是个8位cmos依次逼近型的a/d转换器,而且原理上来说u(omax)=5v(为参考电压),但是经过实际测量芯片的9号管脚(vref/2),其电压值为2.96v,因此,根据实际情况,将参考电压值由5v修改为vref=5.92v。因此最小分辨电压为5.92v/255=0.023v。4.1.4 ad转换的转换公式 对采样值进行运算变换,换算出实际的滑动变阻器输入电压值。对于任何一个a/d采样器而言,其转换公式如下:其中:输入adc的模拟电压值。:adc转换后的二进制值。本试验的adc0804为八位。:adc能够表示的刻度总数。adc0804为八位adc,因此 :adc参考电压值,本试验adc0804经过测量后所得=5.92v。因此,对于本试验,转换公式为: 4.2 矩阵键盘原理在键盘中按键数量较多时,为了减少i/o口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(8键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,x3.0为列扫描输出,y3.0为行扫描输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。列线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。本次实验中,clk信号采用与ad转换所用的时钟信号相同,均为200khz。行列式键盘的电路原理如图4.2.1所示。(为了说明问题以4*4为例)图4.2.1 行列式键盘的电路原理如图设置扫描信号为x3x0,行线按键输入信号y3y0与键值关系如表4-2所示。表4-1 扫描信号和行线按键输入信号与按键之间的关系表x3x0y0y3 键值01111110011014101180111c10111110111015101190111d110111102110161011a0111e111011103110171011b0111f4.3 报警电路原理由于adc0804芯片有电压限制,为了避免在进行ad转换的过程中,由于操作不当引起芯片烧毁这种情况的发生,本次实验增加了一个报警电路,当电压大于所设的阈值时,蜂鸣器报警。报警原理是:给pain引脚一个方波,则蜂鸣器响,否则,蜂鸣器不报警。当设置拨码开关为高电平时(本次实验设置的是第九个拨码开关),关闭蜂鸣器报警。具体实现可以看附录代码。报警电路的原理图如图4.3所示:图4.3 报警电路五、实验思路5.1 adc0804模块最初,我们想借鉴学长的程序,建立查找表的方法;但是,这种方法的弊端很多:比如,大大增加了代码量,直接导致程序编译时间过久,效率低下;而且如果要换一个长度范围,则要完全新建一个查找表,而且这种方法会耗费大量的计算。所以,思考前后,我们决定根据adc0804的转换公式用除法和取余的方式进行处理,即用二进制的模拟电压值通过数制计算转换为十进制数,然后再用该数除以(255/5.92)(注:因为测得实验箱上adc0804芯片9号管脚的电压为vref/2=2.96v,因此,参考电压vref=5.92v)。把各个位赋值到cntq(cntq4代表个位数,cntq3代表第一位小数,cntq2代表第二位小数,cntq1代表第三位小数,cntq的显示是在8为数码管的后四位)。我们还将8位数码管的前三位用来显示adc转换后的8位二进制值(db0db7),将二进制转换为十进制,即0255的范围;将各个位赋给a(a1代表百位,a2代表十位,a3代表个位)。cntq4=dato/(25500/592); cntq3=(dato%(25500/592)*10)/(25500/592);cntq2=(dato%(25500/592)*10)%(25500/592)*10)/(25500/592);cntq1=(dato%(25500/592)*10)%(25500/592)*10)%(25500/592)*10/(25500/592);a1=dato/100;a2=(dato%100)/10;a3=(dato%100)%10;具体实现如下:接着就是数码管的显示了。在数码管轮换显示的模块当中,最初我们只是按顺序赋值于各个数码管,但在硬件调试过程中出现中大量问题,比如数码管闪烁强烈,和部分不能显示和显示乱码问题,后来加上了case语句,以cnt的变化做周期循环,小数点直接赋值,这样问题就消失了。在ad读写状态的转换中,要设定延时,来保证指令的执行。但是,用除法也有不足之处,数码管一直在闪烁,即电压不稳定。因为模拟量肯定不像数字量一样稳定,所以可以对模拟量进行滤波处理或者是通过多次采样取平均来减小误差,提高精度。本次实验采用的就是100次采样取平均来减少数码管闪烁,实验结果证明效果很好。而且大大降低了实验误差(没取平均时,误差为0.040.05v,采用100次采样取平均后,误差缩小为0.005v)。具体实现过程如下:if(i100)begindatismt=datismt+dati; /datismt为一个存储器,用于存储100个/数据之和;dati为adc转换后的数据i=i+1; /i为计数器,未计满100个数据继续取数state=s0;endelsebegini=0; /取满100个数之后,计数器i清零datismt=datismt/100; /取平均dato=datismt; /将处理后的数据给dato,用于后面的计算datismt=0; /存储器清零state3时,hh=0;不再对后面的数字键值进行存储。beginstate1=0; /a键按下hh=1;cnt2=0;endif(count = 30) /消抖beginstate1 = 2;cnt2=cnt2+1; /每按下一个键,cnt2+1if(cnt2 3) /当按下三个键之后,不再存储键值hh=0;endif(hh=1) /a键按下之后,hh=1,开始存储之后的三个数字键键值begincase(cnt2) /用threshold来存储三个键值,cnt2为判断条件1:threshold2=out;2:threshold1=out;3:threshold0= sm) /超过设定的阈值之后,蜂鸣器报警beginpain = pain; /给蜂鸣器一个方波,发声if(din0=1) /拨码开关为高电平时,蜂鸣器不叫pain=0;endendalways(posedge clk) /分频,clk3=5khz begin if(fenpinclk3=3999) /每4000次翻转,8000分频,clk为40mhz, begin fenpinclk3=8h00; clk3=clk3; /clk3=5khz end else begin fenpinclk3=fenpinclk3+1; end endalways(posedge clk) /clk经过分频后,变为ad转换所需的频率clk1 begin if(fenpinclk1=8b0110_0011) /每100次翻转,200分频,clk1=200khz begin fenpinclk1=8h00; clk1=clk1; end else begin fenpinclk1=fenpinclk1+1; end end/控制adc0804转换/always (posedge clk1) begin case(state) s0:begin /开始ad转换 cs=0; wr=0; rds1,延时 begin state=s1; fenpinclk=0; end else fenpinclk=fenpinclk+1; end s1:begin /adc0804转换中 wr=1; cs=1; rd=1; if(intr=0) / intr=0表示转换完成,进入下一个状态 beginstate=s2;end els begin state=s1; end end s2:begin /向adc0804请求转换后的数据 cs=0; wr=1; rds3,延时 begin state=s3; fenpinclk=0; end else fenpinclk=fenpinclk+1; end s3:begin /读取转换后的数据(db7db0) cs=1; wr=1; rd=1; if(i100) /采样100次,将所采的数据求和 begin /值存在datismt中datismt=datismt+dati; i=i+1;state=s0; /每取完一个数据之后,重新进行一次end / ad转换,故跳转到s0 elsebegini=0; /取满100个数据,计数器i清零datismt=datismt/100; /对所采数据求和之后再取平均dato=datismt; /平均值赋给dato进行后面的操作datismt=0; /取完平均后,存储器清零state=s0; /重新进行下一轮的ad转换end end endcase end/数码管后四位和前三位各个位的算法/ cntq4代表个位数,cntq3代表第一位小数,cntq2代表第二位小数,cntq1代表/第三位小数。a1代表百位,a2代表十位,a3代表个位always(dato) begin cntq4=dato/(25500/592); cntq3=(dato%(25500/592)*10)/(25500/592); cntq2=(dato%(25500/592)*10)%(25500/592)*10)/(25500/592); cntq1=(dato%(25500/592)*10)%(25500/592)*10)%(25500/592)*10/(25500/592);a1=dato/100;a2=(dato%100)/10;a3=(dato%100)%10; end/always (posedge clk1)begin if(cnt=4b1000) /cnt选通数码管并显示 begin /当达到第9个状态时返回第一个状态, cnt=4b0000; /轮流扫描8个数码管 end else begin cnt=cnt+1b1; end case(cnt) 4b0000: /选通第一个数码管,显示百位a1beginscan=8b10000000;dat=a1;end4b0001: /选通第二个数码管,显示百位a2beginscan=8b01000000;dat=a2;end4b0010: /选通第三个数码管,显示百位a3beginscan=8b00100000;dat=a3;end 4b0011: /选通第5个数码管,显示小数点前一位cntq4beginscan=8b00001000; dat=cntq4;end 4b0100: /选通第5个数码管,显示小数点beginscan=8b00001000; dat=4b1010; end 4b0101: /选通第6个数码管,显示第一位小数cntq3beginscan=8b00000100; dat=cntq3;end 4b0110: /选通第7个数码管,显示第二位小数cntq2beginscan=8b00000010;dat=cntq2;end 4b0111: /选通第8个数码管,显示第三位小数cntq1beginscan=8b00000001; dat=cntq1; end 4b1000: /这个状态和键盘有关beginscan=8b00010000; /键盘的键值都在第四个数码管显示if(out = 0)begindat=out; /显示数字键的键值if(hh=1) /代表a键按下去且数字键按下的次数少于3begincase(cnt2) /a键按下后按数字键的顺序1:threshold2=out; /存储第一个数字键2:threshold1=out; /存储第二个数字键3:threshold0=out; /存储第三个数字键endcaseif(cnt2=3) /当按下三个数字键之后,/计算出阈值,存储到sm中,begin /与当前输出值比较 sm=threshold2*100+threshold1*10+threshold0;end endendend default:beginscan=8b11111111; dat 3) /按键次数大于3次之后,hh=0; /不存储之后的键值endelsestate1 = 1; /如果没键按下,循环扫描endend2:begin x=4b0111; /扫描第一列,转向3state1=3;end3:begincase(y) /用来判断第一列是否有键按下4b1111: /第一列没键按下,转向4,扫描第二列beginstate1=4;end 4b1110:beginstate1=0; /0out=0; end4b1101:begin state1=0; /4 out=4; end 4b1011:begin state1=0; /8 out=8; end 4b0111: beginstate1=0; /cout=12; end endcaseend4:begin x=4b1011; /扫描第二列 state1=5;end 5:begincase(y)4b1111: /第二列没键按下,转向6,扫描第三列beginstate1=6; end4b1110: beginstate1=0; /1 out=1; end4b1101: begin state1=0; /5 out=5; end4b1011:begin state1=0; /9 out=9; end 4b0111:beginstate1=0; /d/out=13; /非数字键,键值不用显示
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年无人机操控员试题及答案
- 水力学期末考试复习题及答案
- 2025年飞机加油员技能鉴定模拟测试及答案
- 二 全面建设社会主义现代化国家教学设计-2025-2026学年高中思想政治高中习近平新时代中国特色社会主义思想学生读本
- 足球知识面试题库及答案
- 总帐会计面试题及答案
- 安全用药考试题及答案
- 安澜心理测试题及答案
- uk心理测试题目及答案
- 有线数字电视网络运营维护与客户服务合同
- LY/T 1063-2008全国森林火险区划等级
- GB/T 4852-2002压敏胶粘带初粘性试验方法(滚球法)
- 2023年高考全国1卷理科数学和答案详解(word版本)
- GMP质量体系状态标志、标识编制及管理规程
- 情绪压力管理-情绪压力管理课件
- 万科物业管理服务工作手册
- 简单的电动车代理合同模板
- DDI辅导员工迈向成功-辅导领导力系列
- 竞选大学心理委员ppt模板
- 煤矿井筒装备安装方案
- T∕CEPPEA 5008-2021 城市电缆线路岩土工程勘察规范_
评论
0/150
提交评论