基于S3C44B0的数字存储示波器_现代通信课程设计报告.docx_第1页
基于S3C44B0的数字存储示波器_现代通信课程设计报告.docx_第2页
基于S3C44B0的数字存储示波器_现代通信课程设计报告.docx_第3页
基于S3C44B0的数字存储示波器_现代通信课程设计报告.docx_第4页
基于S3C44B0的数字存储示波器_现代通信课程设计报告.docx_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京工业大学现代通信课程设计报告数字存储示波器指导教师:姓名:学号:前言数字存储示波器是20世纪70年代初发展起来的一种新型示波器。这种类型的示波器可以方便地实现对模拟信号波形进行长期存储并能利用机内微处理器系统对存储的信号做进一步的处理,例如对被测波形的频率、幅值、前后沿时间、平均值等参数的自动测量以及多种复杂的处理。而我们此次要设计的便是一种简易的数字存储示波器。我们设计的简易数字存储示波器实现的功能有对单一信道进行采样存储显示(包括正弦波和方波)、通过测量标尺测量波形的周期和频率,标尺可以左右自由移动。我们所用的硬件有试验箱上的s3c44b0微处理器、lcd显示屏、外围扩展的ram和键盘、s3c44b0内置的模数转换器、dds信号源。一、设计要求及目的1.1要求:编写图形显示函数,采集由实验箱信号源输出的正弦、方波、dc等信号,经过处理后显示在lcd屏幕上1.2 设计目的了解lcd显示的基本原理 了解lcd的接口与控制方法 掌握lcd显示图形的方法二、硬件介绍2.1 s3c44b0模数转换器s3c44b0具有8路模拟信号输入的10位模/数转化器(adc),它是一个逐次逼近型的adc,内部结构中包括模拟输入多路复用器,自动调零比较器,时钟产生器,10位逐次逼近寄存器(sar),输出寄存器,还提供可编程选择的睡眠模式,以节省功耗。图1 s3c44b0内部adc结构图它的主要特性如下:(1)分辨力:10位(2)微分线性度误差:1 lsb(3)积分线性度误差:2 lsb(最大3 lsb)(4)最大转换速率:100ksps(5)输入电压范围:0-2.5v(6)输入带宽:0-100hz(不具备采样保持(s/h)电路)(7)低功耗2.2 s3c44b0 lcd控制器s3c44b0x 中具有内置的lcd 控制器,它具有将显示缓存(在系统存储器中)中的lcd图象数据传输到外部lcd 驱动电路的逻辑功能。s3c44b0x 中内置的lcd 控制器可支持灰度lcd 和彩色lcd 。在灰度lcd 上,使用基于时间的抖动算法(time-based dithering algorithm )和frc (frame rate control)方法,可以支持单色、4 级灰度和16 级灰度模式的灰度lcd ,在彩色lcd 上,可以支持256 级彩色。对于不同尺寸的lcd ,其具有不同数量的垂直和水平象素、数据接口的数据宽度、接口时间及刷新率,而lcd 控制器可以进行编程控制相应的寄存器值,以适应不同的lcd 显示板。内置的lcd 控制器提供了下列外部接口信号:vframe: lcd 控制器和lcd 驱动器之间的帧同步信号。它通知lcd 屏新的一帧的显示,lcd 控制器在一个完整帧的显示后发出vframe 信号。vline: lcd 控制器和lcd 驱动器间的同步脉冲信号,lcd 驱动器通过它来将水平移位寄存器中的内容显示到lcd 屏上。lcd 控制器在一整行数据全部传输到lcd 驱动器后发出vline 信号。vclk: 此信号为lcd 控制器和lcd 驱动器之间的象素时钟信号,lcd 控制器在vclk的上升沿发送数据,lcd 驱动器在vclk 的下降沿采样数据。vm: lcd 驱动器所使用的交流信号。lcd 驱动器使用vm 信号改变用于打开或关闭象素的行和列电压的极性。vm 信号在每一帧触发,也在编程决定数量的vline 信号触发。vd3:0:lcd 象素数据输出端口。vd7:4:lcd 象素数据输出端口。图2 lcd控制器结构图注:在本设计中,lcd选用的是320240彩色2.3 s3c44b0键盘驱动本系统使用一个4*4键盘阵列,gpg7gpg4输出扫描信号,gpf8gpf5回读扫描值。在键盘扫描时,分别将gpg7gpg5置为逻辑低,如果有键按下,则可从所对应gpf8gpf5读到一个逻辑低电平。键盘的消抖由软件实现,在处理器发现有键按下后,延迟一段时间在读一次键值,如果两次得到的键值相同则认为该键被按下一次,若不同,则认为得到的键值是由于抖动引起的。键盘允许键值的自动重复,即按住一个键不放会多次得到相同的键值并多次进行相应的操作。三、软件设计3.1 设计思路本设计总共有3个模块:adc模块、lcd模块、键盘模块,所以在整体系统集成之间需要对3个模块分别调试。(1)adc调试:adc调试中需要设置好主时钟mclk,因为adc完成一次采样至少需要16个周期,10位数字量的转换时间如下:1/time=mclk/(2*(radcpsr+1)/16其中radcpsr是预分频,我们选择的是20,可见,mclk越大,转换时间越短,采样率越高,而s3c44b0的最大主频为66mhz,所以,我们选择了mclk=66mhz。此外,通过查看实验箱底板电路图,我们知道:ain1:0输入的是正弦波,ain3:2输入的是方波,ain5:4输入的是dc信号。而且在调试中,通过超级终端对每一路的信号采样值进行显示也可以确定每一路信号的类型。(2)lcd调试:因为在本设计中我们只使用了lcd的彩色模式,所以我们对lcd调试时只是测试它在彩色模式下的绘图,我们根据所给的驱动程序,先后测试了单点、直线绘图,直线绘图驱动可以绘出示波器的坐标轴,而单点绘图可以使用寄存器adcdat中输出的采样值在lcd上绘出正弦或者方波的波形。另一方面,为了实现在刷新波形使保留坐标轴,我们设计编写了分部清屏函数。lcd需要完成的另外一项功能是能实现标尺对波形的基本测量,我们设计的思路是先使用直线绘图驱动画出一条基准标尺,当键盘有对应按键时出现另外一条标尺,这条标尺可以自由移动,这是通过对直线绘图驱动的dx实现的,在新的移动标尺出现时,需要将移动前的移动标尺清楚,只需要将直线的颜色设为白色即可。(3)键盘调试:由于键盘有现成的驱动,所以在调试时只需要通过串口和超级终端显示每一个按键所对应的键值即可,记录键值用于主函数中对lcd中图形的控制。经过调试,键盘键值如下表: 1184012951131062141173其中,带阴影的键值是我们在设计中使用到的键值。3.2 系统工作流程图:ybreak标尺左移,dx+=12case12,flag=0?nnycase5,flag=0?break标尺右移,dx-=12breakbreakbreakbreakbreakbreakbreak主循环结束初始化,dx=0,flag=0flag=0dx=0画标尺清标尺显示方波显示正弦波defaultcase11case10case9case8case2case1switchlcd清屏、画坐标轴开始四、设计演示4.1 演示步骤(1)将实验箱和pc机的串口和并口相连,打开debugserver和超级终端,打开arm sdt加载工程并运行。(2)根据上面的键值表,按“1”键,进行正弦波的显示。(3)按“2”键,进行方波的显示。(4)按“1”键,重新显示正弦波,随后按“9”键,显示固定标尺。(5)按“5”键,显示移动标尺,随后按“11”键,清flag,重新按“5”键,使移动标尺向右移动。(6)按“12”键,显示移动标尺,随后按“11”键,清flag,重新按“12”键,使移动标尺向左移动。(7)按“10”键,清dx,移动标尺回到初始位置。(8)按“8”键,清固定标尺。4.2 演示结果五、设计未实现功能分析说明及问题分析5.1 设计未实现功能分析说明虽然最后完整的实现了波形的显示及标尺的显示和移动,但由于时间的缘故lcd文字显示的问题,并没有能实现设计初所预想的用标尺测量波形的周期、频率并显示在lcd上,也没能实现波形的幅度缩小放大等功能。5.2 出现的问题及分析(1)在刚开始调试adc时,对于adc返回的结果有点不明白,所以造成无法进行下面的工作,后来查了很多adc的资料,知道了adc返回的是十进制数,而10位的adc最大值是1024,对应参考电压的2.5v,在查了底板电路后,也明白了adc每个通道的信号,是后面的采样值存储并显示的前提。(2)在工程编译时发现总有很多不明白的错误,仔细检查了程序并没发现什么错误,之后发现是自己工程的rom起始地址没有设置好,依然是工程默认值。(3)在lcd调试时,由于设计需要使用单点显示驱动进行点操作,所以在主函数中使用了单点显示函数,且编译并没有报错,但lcd上并不能显示图形,询问老师,老师建议看看worning,发现是lcd头文件没有包含,也提醒自己在以后的工程开发中不能忽略worning。(4)在adc采样调试中,发现采样不正确,查了adc的资料后,发现是主频设的太低,当把mclk设置为66mhz时,采样正确。六、总结伴随着设计的完成,大学里的最后一个课设也接近了结尾,但自己的开发之路却才刚刚开始,课设带给我们的是对于课堂知识的一种实践,也是自我的一种挑战,在设计的过程的,所遇到的各种问题都是以前不曾想到的,在解决了每一个问题之后,带给我们的都是经验的收获。这次选择的设计题目虽然难度不是特别大,但是对于我来说,不仅让自己对于嵌入式的开发有了一个初步的了解,而且让自己对于示波器的原理,ad和lcd都有了更加深刻的认识,相信在以后的开发中,自己再遇到了类似的问题时方法会更多,整个设计也会做得更好。最后,感谢学校和老师为我们提供一次这样难得的机会。七、附录void main(void)int dx,dy,e,x1,y1,x2,y2,i;int ad_data10000;char flag=0;/*pll、io、串口、键盘、lcd初始化*/ changepllvalue(pll_m,pll_p,pll_s); port_init(); uart_init(0,115200); uart_select(0);kb_start();lcd_init(mode_color); glib_init(mode_color); glib_clearscr(255);/init lcd rclkcon=0x7ff8; radccon=0x1|(02);/enable adcdelay(100);/delay for 10ms for adc reference voltage stabilization.radcpsr=20;/预分频值dx=0;/标尺增量glib_line(159,0,159,239,0xe0); glib_line(0,119,319,119,0xe0);/绘制坐标轴uart_printf(adc conv. freq.=%d(hz)n,(int)(mclk/(2.*(20+1.)/16.) );/在超级终端上显示抽样频率while(1)switch(key)/key为全局变量,key=key_valcase 1:/显示正弦波uart_printf(%3d,key);glib_clearscr_part();for(i=0;i8000;i+)ad_datai=readadc(1);for(x1=0,i=0;i8000;x1+,i+=20)/取8000/20=400的采样值显示y1=ad_datai/6;/波形幅值/6putpixel(x1,79+y1,0xe0);delay(10);break;case 2:/显示方波uart_printf(%3d,key);glib_clearscr_part();for(i=0;i8000;i+)ad_datai=readadc(2);for(x1=0,i=0;i8000;x1+,i+=20)y1=ad_datai/8;putpixel(x1,119+y1,0xe0);delay(10);break;case 9:/显示固定标尺uart_printf(%3d,key);glib_line(129,0,129,239,0x1e);break;case 8:/清固定标尺uart_printf(%3d,key);glib_line(129,0,129,239,0xff);break;case 5:/移动标尺向右移动if(flag=0)uart_printf(%3d,key);if(dx!=0)glib_line(129+dx,0,129+dx,239,0xff);dx-=12;glib_line(129+dx,0,129+dx,239,0x1e);flag=1;break;case 12:/移动标尺想做移动if(flag=0)uart_printf(%3d,key);if(dx!=0)glib_line(129+dx,0,129+dx,239,0xff);dx+=12;glib_line(129+dx,0,129+dx,239,0x1e);flag=1;break;case 10:uart_printf(%3d,key);dx=0;break;case 11:uart_printf(%3d,key);flag=0;break;default:break;void glib_clearscr_part(void)/此函数用于清屏并保持坐标轴int i,j;for(j=0;j119;j+)for(i=0;i159;i+)putpixel(i,j,255);for(j=0;j119;j+)for(i=160;i319;i+)putpixel(i,j,255);for(j=120;j239;j+)for(i=0;i159;i+)putpixel(i,j,255);for(j=120;j239;j+)for(i=160;i319;i+)putpixel(i,j,255);uint16 readadc(int8 ch) /adc读数据 uint16 i; static int8 prevch=-1; if(prevch!=ch) radccon=0x0|(ch2);/setup channel. for(i=0;i150;i+);/min. 15us radccon=0x1|(ch2);/start a/d conversion while(radccon &0x1);/to avoid the first flag error case./(the start bit is cleared in one adc clock.) while(!(radccon & 0x40); for(i=0;iradcpsr;i+); /to avoid the second flag error case prevch=ch; return radcdat;/*键盘驱动*/char _irq keyboard(void)/终端服务驱动程序 char x,y,xrecord,yrecord,temp,i,key_val,key_val_temp; rintmsk |=bit_eint0; ri_ispc=bit_eint0;/clear pending_bitdelay(100);for (i=0;i1); xrecord=xrecord4; while(xrecord!=0x1)/judge row x=x+1; xrecord=xrecord1; if(xrecord=0) goto scanover; rpdatg=0xef; /input high temp=0xef; while(rpdatf&0x1e0)=0x1e0) temp=(temp4)&0x0f; while(yrecord!=0x1)/ judge line y=y+1; yrecord=yrecord1; if(yrecord=0) goto scanover;/no board press,return key_val=(x+(y-1)*4-1); if (i&(key_val!=key_val_temp)goto scanover;else key_val_temp=key_val; rpdatg &=0x0f; /uart_printf(%3d,key_val); key=key_val; delay(200);scanover: rpdatg=0x0f;ri_ispc=bit_eint0;rintmsk&=(bit_eint0|bit_global);void kb_start(void)/键盘初始化 rextint=0x22222222; rintcon=0x5; pisr_eint0=(unsigned)keyboard; uart_printf(eflag keyboard test for s3c44b0n); rintmsk &=(bit_global|bit_eint0); /*lcd驱动程序*/void glib_init(int depth) switch(depth) case 1: putpixel=_putpixelmono; break; case 4: putpixel=_putpixelg4; break; case 16: putpixel=_putpixelg16; break; case 256: putpixel=_putpixelcolor; break; default: break; void _putpixelmono(u32 x,u32 y,u8 c) if(xscr_xsize & y(x)%32)*1) ) | ( (c) (32-1-(x)%32)*1) );void _putpixelg4(u32 x,u32 y,u8 c) if(xscr_xsize & y(x)%16)*2) ) | ( (c)(16-1-(x)%16)*2) );void _putpixelg16(u32

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论