
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
题目:基于FPGA的数字示波器的设计 图4-8液晶画点流程图如图4-8所示为画点的流程图,通过不断的改变连续的地址进行画点,这样这些点就组成了一条线。本设计上主要用到的是画垂直的线,既x轴的地址不变,连续的改变y轴的地址进行画点。示波器的波形的更新是采用先擦除上一次的一个片段,再画上新的波形的片段来实现波形图像的更新[12]。当处理的速度足够快的时候看起来就像是整个波形是一起更新的。4.2.3同步触发程序的设计图4-9同步触发程序流程图本设计的触发方式采用的是软件同步触发的方式,程序流程图如图4-9所示。既当读完FIFO的数据的时候,对每个数据与一个触发的阀值进行比较。当为上升沿触发的时候,前一个数据小于阀值,后一个数据大于阀值表示此处产生了上升沿,然后从此处开显示波形。当为下降沿触发的时候,前一个数据大于阀值,后一个数据小与阀值表示此处产生了下降沿,然后从此处开显示波形。当比较到剩余的数据不足以显示一屏时,则放弃本组数据,重新从FIFO中读取数据再重复这个过程,直到产生触发为止。第5章系统的调试5.1硬件的调试图5-SEQ图5-\*ARABIC1系统实物图 在前端信号处理电路焊接完成后,先用万用表检测电源两端看有无短路,检查通过后根据原理图检测各个芯片的引脚有无短路,检查通过后进行上电检查。观察各个芯片的电源电压是否正常。 上述检查都完成后接入信号发生器和示波器调试电路的工作性能。 在实验中发现输出的波形噪声非常大,输出的信号中带有很大的锯齿波,经过排查是电源和电压基准的噪声引起的,在各个运放的电源端和电压基准TL431的输出端并入10uf的电容后改善效果十分明显,电源的纹波降到了30mv左右。波形输出后无明显噪声。 ADC的测试,用FPGA输出1KHz的时钟信号,前端不接入信号,使用FPGA读取ADC的输出数据,在数码管上进行显示。前端不接信号ADC采样到的是2.5V的中位基线电压,显示的AD值应为120左右。测试中实际采样的数据为118会有正负两个字的跳动,表明ADC是正常工作的。5.2软件的调试5.2.1FPGA程序的调试首先进行的是时钟选择电路的调试,采用FPGA开发板上的四个拨码开关做为输出通道的选择,经过测试能准确的输出1.25KHz到50MHz的时钟信号。然后要进行的是FIFO的测试,这部分的测试要用到STM32跟FPGA一起来调试,先让STM32向FIFO写入数据,在从其中读出数据跟写入的进行比较,如果相同则表明FIFO正常。经测试FIFO能正常的工作。最后调试的是串入并出的程序,这部分的测试也要用到STM32跟FPGA一起来调试,先让STM32根据设计的时序向FPGA写入数据然后再观察输出的数据接到LED上,观察LED的亮灭来判断输出的是否正常。经测试这部分功能正常。5.2.2STM32程序的调试 STM32程序的调试主要为波形的显示程序和同步触发程序的调试,由于液晶的驱动程序和按键的扫描程序都是以前写好的模块,这里就不在写调试过程。 波形显示程序的调试的过程为先用MTALAB生成几个频率不同正弦波的数据,再用让STM32去显示这几组波形,每个波形保持1S,就切换另一个波形,看显示是否正常。在测试的过程中也有遇到了一些问题,比如说最开始我没有让波形保持一定的时间,这个有时会有波形显示非常的暗,后来发现是刷新过快的原因,在增加了波形保持后,问题得到解决。 在完成了波形显示的调试后就可以进行同步触发的调试了。调试过程中要先设置一定的触发电平,我设置的是过零点触发。还是使用那几组数据去测试,观察波形显示的稳定程度。在实际中发现触发不够稳定,经排查发现时触发电平的原因,在触发的判断中不能直接判断这个设置的阀值,应该在这个阀值的基础上再设置一个窗口,即以阀值为基础设置一个判断的区间,这样判断上升或下降沿会更稳定,不会有误触发。经过改善后触发稳定性得到很大的提升。5.3整体的调试测试仪器:信号发生器UTG9020D示波器UTD2052CEL。1、测试信号为幅值5V的方波信号。表5-SEQ表5-\*ARABIC1幅值为5V的信号频率的测量信号频率10Hz100Hz1000Hz10000Hz100000Hz1000000Hz测量值9Hz98Hz999Hz9990Hz99990Hz999950Hz误差10%2%0.1%0.1%0.01%0.005%由表5-1可知在测量小于1KHz的低频信号时误差较大,这是由于采用计数法测频,导致在测低频信号时由于门闸信号的原因会导致有较大的误差。2、测试信号为频率100KHz的方波。表5-SEQ表5-\*ARABIC2100KHz频率下信号幅值的测量信号幅值1V2V3V4V5V测量值1.05V2.10V3.02V3.93V4.95V误差5%5%0.6%1.75%1%信号幅值6V7V8V9V10V测量值5.83V6.86V7.77v8.729.65V误差2.8%2%2.9%3.1%3.5%由表5-2可知在测量3V到5V时的误差较小,在测量6V到10V的时候误差较大,在测量1V到2V的信号时的误差最大。经过排查是由于程控放大器的放大倍数与设定的存在差异和在信号输入的时候耦合的有一定的压降。图5-2测试显示波形 图5-3UTD2052CEL示波器显示波形如图5-2和图5-3为在输入幅值为5V频率100KHz的正弦波信号时本设计和UTD2052CEL示波器显示波形的对比。可以看出系统工作稳定,各项参数基本一致,验证了本设计的对信号的处理的正确性。
第6章结论本设计以FPGA为核心,STM32为辅助控制完成了数字示波器的设计,本设计在硬件部分完成了前端信号调理电路和AD转换电路,实现了的对输入模拟信号的处理。FPGA通过对采样时钟的控制实现了对ADC采样率的控制,通过STM32对采样到的数据进行处理后在液晶显示器上重构出信号波形。经过测试之后设计中对频率的测量,信号峰峰值得测量均达到了设计目标。不过本设计只是初步完成了一个示波器的基本功能,还有许多有用的功能如对信号进行单次的捕获,对信号如上升时间的测量等功能都还没有实现,需要以后进一步的完善。本设计中由于采用了软件同步触发所以触发的效果不如硬件触发的好,在长时间的测试过程中会出现触发不稳定的情况,这在以后也需要改进。最后经过了本次设计的制作,我对大学期间所学的知识有了更直观的了解,在模拟电路的设计制作过程中我了解了电源的噪声对放大电路的影响,也对电源对电路的影响有了更加深刻的了解。本设计中的程控放大电路由运放和继电器组成,控制简单,十分适合在一些低成本的场合应用。
致谢 在一做毕业设计的一个多月中,我学到了很多,对自己的大学所学的知识做了一次梳理。在制作的过程中遇到了很多的困难,但是在同学和老师的帮助下一个个的被解决了。在此特别感谢我的指导老师——赖义汉老师,他在此过程中给了我悉心的指导,让我感受到了他的学识渊博,视野广阔。 同时还要感谢一下阿莫电子论坛的魏坤同学和其他坛友,要不是有魏坤同学的开源示波器项目和坛友们的各种讨论。我也不可能在设计的初期规避了很多的错误,也在后期的制作工程中发现的一些问题也可以在他们的帖子中找到解决的办法。最后,我再一次的感谢在本次设计中给予我帮助的师长和朋友们,没有你们的帮助我不可能顺利的完成此次设计。
参考文献[1]孙建风.数字存储示波器的原理,特点及发展动态[J].宇航计测量,1996,(6):52-61.[2]肖晓萍.电子测量仪器[M].电子工业出版社,2005.[3]褚振勇.翁木云.FPGA设计及应用[M].西安:西安电子科技大学出版社,2002.[4]龚世耀.单片机数字信息采集系统[J].南京邮电学院报,1994,(4):81-86.[5]苏建加,廖聪裕,鲁锦涛.基于FPGA的数字存储式示波器设计[J].河北农机,2012,(3):G2-G3.[6]周金刚,左超,崔长生.基于FPGA的数字存储示波器[J].电子工程师,2008,34(5):15-17.[7]魏坤.DIY数字示波器[J].无线电,2009,(1):41-43.[8]E.A.Parr.怎样使用运算放大器[M].人民邮电出版社,1983.8.[9]夏宇闻.Verilog数字系统设计教程[M].北京:北京航空航天大学出版社,2003[10]潘松,黄继业.EDA技术实用教程[M].第三版.北京:科学出版社,2009.[11]杜生海.FPGA设计实战[M].人民邮电大学出版社,2009.6.[12]叶梵,周建明,张沁川.高速数字存储示波器实现技术[J].电子测量与仪器学报,2005,19(3):42-45.
附录一前端信号处理原理图STM32原理图FPGA原理图
附录二FPGA程序二分频Verilog程序moduleDIV_2(clk,rst,clk_out); inputclk;//输入时钟 inputrst;//复位信号 outputclk_out;//输出时钟 regclk_out; //二分频 always@(posedgeclkornegedgerst) if(!rst) clk_out<=1'b0; else clk_out<=~clk_out;endmodule五分频Verilog程序moduleDIV_5(clk,rst,clk_out); inputclk,rst; outputclk_out; regp_clk;//上升沿分频时钟 regn_clk;//下降沿分频时钟 reg[2:0]p_cnt;//上升沿计数器 reg[2:0]n_cnt;//下降沿计数器 always@(posedgeclkornegedgerst)//上升沿计数 begin if(!rst) p_cnt<=3'd0; elseif(p_cnt==3'd4) p_cnt<=3'd0; else p_cnt<=p_cnt+3'd1; end always@(posedgeclkornegedgerst)//上升沿分频时钟输出 begin if(!rst) p_clk<=1'b0; elseif(p_cnt<2) p_clk<=1'b1; else p_clk<=1'b0; endalways@(negedgeclkornegedgerst)//下降沿计数 begin if(!rst) n_cnt<=3'd0; elseif(n_cnt==3'd4) n_cnt<=3'd0; else n_cnt<=n_cnt+3'd1; end //下降沿分频时钟输出 always@(negedgeclkornegedgerst) begin if(!rst) n_clk<=1'b0; elseif(n_cnt<2) n_clk<=1'b1; else n_clk<=1'b0; end assignclk_out=p_clk|n_clk;endmodule十分频Verilog程序moduleDIV_10(clk,rst,clk_out); inputclk,rst; outputclk_out; regclk_out; reg[2:0]cnt; always@(posedgeclkornegedgerst) begin if(!rst) begin cnt<=3'd0; clk_out<=1'b0; end elseif(cnt==3'd4) begin clk_out<=~clk_out; cnt<=3'd0; end else cnt<=cnt+3'd1; endendmodule时钟选择模块Verilog程序moduleDIV_MUX(ch0,ch1,ch2,ch3,clk_out,clk50M,clk25M,clk12_5M,clk5M,clk2_5M,clk1_25M,clk500k,clk250k,clk125k,clk50k,clk25k,clk12_5k,clk5k,clk2_5k,clk1_25k,clk500); inputch0,ch1,ch2,ch3;//时钟输出通道选择 //输入时钟信号 inputclk50M,clk25M,clk12_5M,clk5M,clk2_5M,clk1_25M,clk500k; inputclk250k,clk125k,clk50k,clk25k,clk12_5k,clk5k,clk2_5k,clk1_25k,clk500; //输出时钟 outputclk_out; regclk_out; always@(*) begin case({ch3,ch2,ch1,ch0}) 5'd15:clk_out<=clk50M; 5'd14:clk_out<=clk25M; 5'd13:clk_out<=clk12_5M; 5'd12:clk_out<=clk5M; 5'd11:clk_out<=clk2_5M; 5'd10:clk_out<=clk1_25M; 5'd9:clk_out<=clk500k; 5'd8:clk_out<=clk250k; 5'd7:clk_out<=clk125k; 5'd6:clk_out<=clk50k; 5'd5:clk_out<=clk25k; 5'd4:clk_out<=clk12_5k; 5'd3:clk_out<=clk5k; 5'd2:clk_out<=clk2_5k; 5'd1:clk_out<=clk1_25k; 5'd0:clk_out<=clk500; default:clk_out<=1'b0; endcase endendmoduleADC_FIFO时钟输出模块Verilog程序moduleADC_FIFO_CLK(clk_50M,rst,ch0,ch1,ch2,ch3,clk_out); inputclk_50M,rst,ch0,ch1,ch2,ch3; outputclk_out; wireclk_50M,clk25M,clk12_5M,clk5M,clk2_5M,clk1_25M,clk500k; wireclk250k,clk125k,clk50k,clk25k,clk12_5k,clk5k,clk2_5k;wireclk1_25k,clk500,clk_out;DIV_MUXu0( .ch0(ch0), .ch1(ch1), .ch2(ch2), .ch3(ch3), .clk_out(clk_out), .clk50M(clk_50M), .clk25M(clk25M), .clk12_5M(clk12_5M), .clk5M(clk5M), .clk2_5M(clk2_5M), .clk1_25M(clk1_25M), .clk500k(clk500k), .clk250k(clk250k), .clk125k(clk125k), .clk50k(clk50k), .clk25k(clk25k), .clk12_5k(clk12_5k), .clk5k(clk5k), .clk2_5k(clk2_5k), .clk1_25k(clk1_25k), .clk500(clk500)); DIV_2u1(.clk(clk_50M),.rst(rst),.clk_out(clk25M)); DIV_2u2(.clk(clk25M),.rst(rst),.clk_out(clk12_5M)); DIV_10u3(.clk(clk_50M),.rst(rst),.clk_out(clk5M)); DIV_10u4(.clk(clk25M),.rst(rst),.clk_out(clk2_5M)); DIV_10u5(.clk(clk12_5M),.rst(rst),.clk_out(clk1_25M)); DIV_10u6(.clk(clk5M),.rst(rst),.clk_out(clk500k)); DIV_2u7(.clk(clk500k),.rst(rst),.clk_out(clk250k)); DIV_10u8(.clk(clk1_25M),.rst(rst),.clk_out(clk125k)); DIV_10u9(.clk(clk500k),.rst(rst),.clk_out(clk50k)); DIV_2u10(.clk(clk50k),.rst(rst),.clk_out(clk25k)); DIV_10u11(.clk(clk125k),.rst(rst),.clk_out(clk12_5k)); DIV_10u12(.clk(clk50k),.rst(rst),.clk_out(clk5k)); DIV_10u13(.clk(clk25k),.rst(rst),.clk_out(clk2_5k)); DIV_10u14(.clk(clk12_5k),.rst(rst),.clk_out(clk1_25k)); DIV_10u15(.clk(clk5k),.rst(rst),.clk_out(clk500));Endmodule串入并出模块Verilog程序moduleReg595(clk,lck,rst,din,ch0,ch1,ch2,ch3,q); inputclk;//数据输入时钟 inputlck;//锁存信号 inputrst;//复位信号 inputdin; outputch0,ch1,ch2,ch3; output[5:0]q; regch0,ch1,ch2,ch3; reg[5:0]q; reg[9:0]qt; always@(posedgeclkornegedgerst) begin if(!rst) begin qt<=10'd0; end else begin qt<={qt[8:0],din}; end end always@(posedgelckornegedgerst) begin if(!rst) begin {q[5:0],ch3,ch2,ch1,ch0}<=10'd0; end else begin {q[5:0],ch3,ch2,ch1,ch0}<=qt; end endendmoduleFIFOTestbench文件Verilog程序timescale1ns/1ns`defineW_CLK20`defineR_CLK40modulefifo_tb; reg[7:0]data; reg rdclk,rdreq,wrclk,wrreq; wire[7:0]q; wirewrfull; integeri;fifou1(.data(data), .rdclk(rdclk), .rdreq(rdreq), .wrclk(wrclk), .wrreq(wrreq), .q(q), .wrfull(wrfull));initialbegin rdclk=0;wrclk=0; rdreq=0;wrreq=0; i=0;#(`W_CLK); wrreq=1; for(i=0;i<1024;i=i+1)begin data=i;#(`W_CLK*2+1); end wrreq=0;rdreq=1; for(i=0;i<1024;i=i+1)begin rdclk=1;#(`R_CLK*2+1); rdclk=0;#(`R_CLK*2+1); end rdreq=0;wrreq=1; for(i=0;i<1024;i=i+1)begin data=i;#(`W_CLK*2+1); end wrreq=0;rdreq=1; for(i=0;i<1024;i=i+1)begin rdclk=1;#(`R_CLK*2+1); rdclk=0;#(`R_CLK*2+1); end rdreq=0; $stop;endalways#(`W_CLK)wrclk=~wrclk;endmodule附录三STM32程序main.c#include"stm32f10x.h"#include"delay.h"#include"key.h"#include"display.h"#include"TFTLCD.h"#include"draw.h"#include"fifo.h"#include"TRIG.H"#include"freq.h"u8fifo[FIFO_SIZE];intmain(void){ SystemInit(); key_Init(); w595_init(); TFT_init(); gui(); fifo_init(); Freq_init(); while(1) { if(READ_FIFO(fifo)) { if(Trig(1)) { Signal_Data(); dis_signal(&fifo[TRIG_UNM],YELLOW); } } }}TRIG.C#include"TRIG.H"#include"key.h"#include"draw.h"#include"TFTLCD.h"#include"fifo.h"#include"display.h"u16TRIG_UNM=0;u8FIFO_DATA_TMP[300];//波形数据externu8fifo[FIFO_SIZE];//显示数据u32V_data;u8min_v,max_v;;externu8v_div;//定义在display.cu16v[12]={5000,2000,1000,500,200,100,50,20,10,5,2,1};//触发函数:Trig_mode0下降沿触发1上升沿触发u8Trig(u8Trig_mode){ u8flag=0; while((TRIG_UNM<(FIFO_SIZE-350))) { if(Trig_mode)//上升沿触发 { if(fifo[TRIG_UNM]<(TRIG-TRIG_window)&&(flag==0))flag=1; if(fifo[TRIG_UNM]>(TRIG+TRIG_window)&&(flag==1))return1;} else//下降沿触发 { if(fifo[TRIG_UNM]>(TRIG+TRIG_window)&&(flag==0))flag=1; if(fifo[TRIG_UNM]<(TRIG-TRIG_window)&&(flag==1))return 1; } TRIG_UNM++; } TRIG_UNM=0; return0;}voidSignal_Data(void){ u16i,dat; min_v=fifo[TRIG_UNM]; max_v=fifo[TRIG_UNM]; for(i=TRIG_UNM;i<FIFO_SIZE;i++) { dat=fifo[i]; if(dat>max_v)max_v=dat; elseif(dat<min_v)min_v=dat; dat=(u8)(217-((dat*76/100))); if(dat>MAX_Y)dat=MAX_Y; if(dat<MIN_Y)dat=MIN_Y; fifo[i]=dat; } V_data=(max_v-min_v)*78*v[v_div]/10000; display_Vpp(V_data);}波形显示函数voiddis_signal(u8*fifo_data,u16color){ u16i,j=0; u8c1,c2,d1,d2; d1=*fifo_data; c1=FIFO_DATA_TMP[0]; for(i=MIN_X;i<MAX_X;i++,j++) { c2=FIFO_DATA_TMP[j+1]; col_line(i,c1,c2,BLACK); c1=c2; d2=*(fifo_data+i+1); col_line(i,d1,d2,color); FIFO_DATA_TMP[j]=d1; d1=d2; } delay_cnt=20;//延时100毫秒 rectangle(10,20,310,220,WHITE); gui_wang_ge(10,20,310,220,WHITE); col_wang_ge(11,20,220,WHITE); col_wang_ge(12,20,220,WHITE); col_wang_ge(308,20,220,WHITE); col_wang_ge(309,20,220,WHITE); col_wang_ge(159,20,220,WHITE); col_wang_ge(160,20,220,WHITE); col_wang_ge(161,20,220,WHITE); row_wang_ge(10,310,21,WHITE); row_wang_ge(10,310,22,WHITE); row_wang_ge(10,310,119,WHITE); row_wang_ge(10,310,120,WHITE); row_wang_ge(10,310,121,WHITE); row_wang_ge(10,310,218,WHITE); row_wang_ge(10,310,219,WHITE);}读FIFO函数u8READ_FIFO(u8*FIFO_Dat){ u16i=0; if((WRFULL==GPIO_Pin_8)&&(delay_cnt==0)) { SET_RDREQ; for(i=0;i<FIFO_SIZE;i++) { SET_RDCLK; *FIFO_Dat=FIFO_DATA; FIFO_Dat++; CLR_RDCLK; } CLR_RDREQ; return1; } return0;}测频函数voidTIM1_UP_IRQHandler(void){ if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET) { freq_cnt++; TIM_ClearITPendingBit(TIM1,TIM_IT_Update); }}voidTIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM1->CR1&=0xfffe; freq_dat=(u32)TIM_GetCounter(TIM1); freq_dat=(freq_cnt<<16)|freq_dat; freq_cnt=0; TIM_SetCounter(TIM1,0x0000); TIM1->CR1|=0x0001; display_freq(freq_dat); TIM_ClearITPendingBit(TIM2,TIM_IT_Update); }}按键扫描和服务函数u8Scan_Key(void){ u8key_return=0; //V_DIV加 if(Key_DIV_P==1) { key_p_cnt=0; key_p_flag=0; } else { if(key_p_flag==0) { key_p_cnt++; if(key_p_cnt>KEY_CNT_END) { key_p_flag=1; key_p_cnt=0; key_return=1; } } } //V_DIV减 if(Key_DIV_N==1) { key_n_cnt=0; key_n_flag=0; } else {
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度黑龙江省高校教师资格证之高等教育法规通关考试题库带答案解析
- 2024年CPSM考试冲刺策略试题及答案
- 2024年CPMM复习经典试题及答案
- 机械加工类答案
- (高清版)DB12∕T 693-2016 天津市文书类电子文件数据存储结构规范
- (高清版)DB12∕T 592-2015 规模化奶牛场粪污处理技术规范
- 2025年非公开发行股票保荐协议
- 离婚协议感情纠纷(2025年版)
- 四个自信的深刻理解试题及答案
- 2025年聚醚砜PES合作协议书
- 2025年临床医师定期考核必考复习题库及答案(620题)
- DB32∕T 3724-2020 高标准农田建设项目初步设计报告编制规程
- 光学材料销售实习报告
- 浙江省温州市2025届高三第二次调研英语试卷含解析
- 2025年辐射工作人员培训计划
- 干细胞与干细胞治疗
- 春季常见传染病预防知识培训
- 中建履带吊安拆安全专项施工方案
- 医学论文格式与写作课件
- 市场监监督管理执法讲座
- 2024年天翼云从业者认证考试题库大全(含答案)
评论
0/150
提交评论