简易数字示波器设计说明_第1页
简易数字示波器设计说明_第2页
简易数字示波器设计说明_第3页
简易数字示波器设计说明_第4页
简易数字示波器设计说明_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

..电信专业综合实践设计题目:在LPC2210开发板的基础上简易数字示波器设计学校:______指导2011.1.1目录TOC\o"1-2"\h\z\uHYPERLINK第1章设计内容与要求1HYPERLINK1.1设计内容1HYPERLINK1.2设计要求1HYPERLINK1.3系统功能1HYPERLINK1.4应用分析1HYPERLINK第2章系统总体设计3HYPERLINK2.1总体框图3HYPERLINK2.2总体设计分析3HYPERLINK第3章硬件结构7HYPERLINK3.15V电源电路7HYPERLINK3.2系统电源电路8HYPERLINK3.3复位电路10HYPERLINK3.4JTAG接口电路11HYPERLINK3.5系统存储器电路11HYPERLINK3.6TFT液晶接口电路12HYPERLINK3.7串口接口电路13HYPERLINK3.8ADC电路14HYPERLINK3.9按键控制电路15HYPERLINK3.10主芯片电路14HYPERLINK第4章软件分析14HYPERLINK4.1软件框图分析14HYPERLINK4.2任务的划分15HYPERLINK4.3任务的优先级设计15HYPERLINK4.4液晶初始化设计16HYPERLINK4.5定时器设计16HYPERLINK4.6AD转换设计16HYPERLINK4.7数据处理17HYPERLINK4.8触发设计17HYPERLINK4.9周期设计17HYPERLINK4.10求最值设计18HYPERLINK4.11主函数与调用的TASK设计18HYPERLINK拓展部分19HYPERLINK参考文献20第一章设计内容与要求1.1设计内容:在LPC2210开发板的基础上设计一简易数字示波器。1.2设计要求:数字示波器的硬件系统的电路原理图设计数字示波器的图形界面设计数字示波器的信号触发、矢量显示、轨迹消隐实现被测信号的周期、最大/最小值实现1.3系统功能:以LPC2210开发板的液晶屏模拟数字示波器的显示屏,实现被测波形的显示。1.4应用分析:本设计对基于ARM〔AdvancedRISCMachine的简易示波器的设计过程进行了介绍。主要对系统的硬件设计部分和软件设计部分进行了分析。硬件设计部分首先给出了系统框图,然后对各个组成模块进行了介绍。并给出了各模块所使用的主要元器件。包括电源部分、放大部分、控制部分、键盘功能及芯片的采集和显示部分。软件设计部分编写了使能部分、AD转换、显示部分、数值计算部分。。第二章系统的总体设计2.1总体框图输入信号输入信号放大电路〔模拟通道采样和量化ADCLCDARMKEY12-1系统框图2.2总体设计分析本设计如果选择的是DSP,设计中用到芯片就会增多,而且因为DSP造价高于ARM并且小信号的采集如果应用DSP放大芯片有很多限制,不易选取。而应用ARM则减少了这方面的问题。在嵌入式处理器设计领域,RISC[1]已经成为处理器结构设计的必然选择。嵌入式微处理器嵌入式系统是以应用为中心,以计算机技术为基础,软硬可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。并且该系统是以提高对象体系智能性、控制力和人机交互能力为目的,通过相互作用和内在指标评定的,嵌入到对象体系中的专用计算机系统。而嵌入式微处理器是嵌入式系统的核心部件,是决定嵌入式系统功能强弱的主要因素,也决定了嵌入式系统的应用范围和开发复杂度。本设计需要解决的问题包括硬件部分和软件部分。硬件部分的设计主要是芯片选择,控件的选择,放大倍数的控制,衰减倍数的选择。软件部分的设计主要是驱动程序的编译,主函数主要功能的实现,按键控制的选择。第三章硬件结构3.15V电源电路LPC2200系列ARM7微控制器均要使用两组电〔LPC213x,LPC214x除外,I/O口供电电源为3.3V,内核及芯片外设供电电源为1.8V,所以系统设计为3.3V应用系统。首先有CZ1电源接口输入9V直流电源,二极管D1防止电源反接,经过C42,C44滤波,然后通过LM2575将电源稳压の5V,再使用LDO芯片〔低压差芯片稳压输出3.3V及1.8V电压。如图所示〔1-1,所设计的5V电源电路的稳压芯片使用的是LM2575开关电源芯片。图3-1〔5V电源电路3.2系统电源电路系统电源电路如图1-2所示,LDO芯片分别采用SPX1117M3-1.8和SPX1117M3-3.3,其特点为输出电流大,输出电压精度高,稳定性好。犹豫LPC2200系列ARM7微控制器具有独立的模拟电源和模拟地引脚,为了降低噪声和出错几率,模拟电源与数字电源应该隔离。这里使用10uH的电感L2~L4实现电源隔离〔将高频噪声隔离,并且在设计PCB板时采用大面积敷地,以降低噪声。图3-2〔系统电路3.3复位电路由于ARM芯片的告诉、低功耗和的工作电压导致其噪声容限低,对电源的纹波、瞬态响应性能、时钟源的稳定性和电源监控可靠性等诸多方面也提出了更高的要求。如图1-3所示。图3-3〔系统复位电路3.4JTAG接口电路采用RAM公司提出的标准20脚JTAG仿真调试接口,JTAG信号的定义以及与LPC2210的连接如图1-4所示。图中,JTAG接口上的信号nTRST连接到LPC2210芯片的T\R\S\T\引脚,以达到控制LPC2210内部JTAG接口电路复位的目的〔但不控制CPU复位。图3-4〔JTAG接口电路3.5系统存储器电路SartARM2200j教学实验开发平台上扩展了2MBNORFLASH〔型号为SST39VF160和8MBPSRAM〔芯片型号为MT45W4MW16,电路如图1-5。为了方便程序调试及最终代码的固化应用,使用LPC2210外部存储接口的BANK0和BANK1地址空间,并且可以通过JP10跳线将片选信号CS0和CS1分别分配给SRAM或FLASH。在使用JTAG调试程序时,分配SPRAM为BANK0地址,因为BANK0可以进行异常向量表的重新映射操作。当最终代码固化到FLASH时,分配FLASH为BANK0地址,SRAM为BANK1地址。这是因为BANK0可以用来引导程序运行。若使用BANK0引导程序运行,将JP9短接到OUTSIDE端,使系统复位时BOOT1和BOOT0引脚的电平为0b01〔即二进制值01.图3-5〔系统存储器电路3.6TFT液晶接口电路SmartARM2200教学实验开发平台标配有2.2英寸液晶屏-TF6758液晶模块,其电路原理如图1-6所示。TFT6758液晶模块的工作电压为3.3V,内带白光LED背光灯,可以直接使用8位、16位或18位总线方式与控制器连接〔因为液晶模块内部包含了HD66781和HD66783液晶控制驱动器。为了得到更搞的数据传输速率,设计电路时采用16位总线接口,按照HD66781芯片说明,需要IM3和IM0引脚0电平,16位数据分别为DB17~DB10和DB8~DB1引脚,为使用的DB0和DB9引脚应接地,电路连接如图1-6所示。因为不使用DMA传输功能,所以将DACK引脚接为高电平。图3-6〔TFT6758液晶模块应用电路3.7串口接口电路由于系统电源是3.3V,所以应使用SP3232E进行RS232电平转换,SP3232E是3V工作电源的RS232转换芯片。如图1-7所示图3-7〔串口接口电路3.8ADC电路PC2114/2124/2119/2129/2194具有4路10位ADC转换器,LPC2210/2212/2214/2290/2292/2294具有8路10位ADC转换器,其参考电压为3.3V〔由V3a引脚提供,参考电压的精度会影响ADC的转换结果。SmartARM2200教学实验开发平台提供了两路滞留电压测量电路如图1-8所示,可调电阻W1和W2用于调整ADC的输出电压,可以在VINI和VIN2测试点上用万用表检查当前电压值。R36和R37为I/O口保护电阻,当ADC输入电压调整到3.3V或0V时,而P0.27或P0.28作为GPIO输出0或1,此刻,这两个电阻保证电路不产生短路故障。图3-8〔ADC电路3.9按键控制电路按键:在SmartARM2200教学实验平台上使用P0.20扩展一个独立按键KEY1,当需要使用此按键时,应将JP2跳线短接。当断开JP2跳线时,P0.20可以通过J5连接器〔GPIO输出接口与用户板连接使用。图3-9〔按键控制电路3.10主芯片电路LPC2210是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-SCPU的微控制器,并带有0/128/256KB嵌入的高速片内Flash存储器,片内128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。由于LPC2210具有较小的64个144脚封装,极低的功耗,多个32位定时器,4路10位ADC或8路10位ADC〔64脚和144脚封装以及多达9个外部中断。图3-10〔主芯片电路第四章软件分析4.1软件框图分析初始化初始化底层驱动脉宽信号发射求最大最小值波形显示数据处理数据采集底层驱动脉宽信号发射求最大最小值波形显示数据处理数据采集4.2任务的划分对一个嵌入式应用系统进行"任务划分",是实时操作系统应用软件设计的关键,任务划分是否合理将直接影响软件设计的质量。任务划分原则如下:以CPU为中心,将与各种输入/输出设备〔或端口相关的功能分别划分为独立的任务。发现"关键"功能,将其最"关键"部分"剥离"出来,用一个独立任务〔或ISR完成,剩余部分用另一个任务实现,两者之间通过通信机制沟通。发现"紧迫"功能,将其最"紧迫"部分"剥离"出来,用一个独立的高优先级任务〔或ISR完成,剩余部分用另一个任务实现,两者之间通过通信机制沟通。对于既"关键"又"紧迫"的功能,按"紧迫"功能处理。将消耗机时较多的数据处理功能划分出来,封装为低优先级任务。将关系密切的若干功能组合成为一个任务,达到功能聚合的效果。将由相同事件触发的若干功能组合成为一个任务,从而免除事件分发机制。将运行周期相同的功能组合成为一个任务,从而免除时间事件分发机制。将若干按固定顺序执行的功能组合成为一个任务,从而免除同步接力通信的麻烦。4.3任务的优先级设计为不同任务安排不同的优先级,其最终目标是使系统的实时性指标能够得到满足。在实际的产品开发中,应该在项目开始时,仔细思考和推敲。如果任务优先级的设定有误,对以后的开发和调试会带来极大的困扰,会让工程师花很长时间来查错误,而且出现的错误不好排除。所以设计任务的优先级是很重要的。本次实验一共建立了五个任务,其优先级如下:OSTaskCreate<Task0,<void*>0,&Task0Stk[128-1],2>; //创建Task0任务,优先级为2 OSTaskCreate<Task1,<void*>0,&Task1Stk[128-1],3>; //创建Task1任务,优先级为3 OSTaskCreate<Task2,<void*>0,&Task2Stk[128-1],4>; //创建Task2任务,优先级为4 OSTaskCreate<Task3,<void*>0,&Task3Stk[128-1],5>;//创建Task3任务,优先级为5 OSTaskCreate<Task4,<void*>0,&Task4Stk[128-1],6>; //创建Task4任务,优先级为64.4液晶显示初始化设计GUI_PrtPic<0,0,239,319,gImage_root01>;//示波器面板〔背景图显示GUI_Line<224,268,224,315,0xffff>; //Running至Off间6根短白线GUI_Line<184,268,184,315,0xffff>;GUI_Line<144,268,144,315,0xffff>;GUI_Line<104,268,104,315,0xffff>;GUI_Line<64,268,64,315,0xffff>;GUI_Line<24,268,24,315,0xffff>;WaveTrackCnt=0;GUI_PrtStr<208,270,"Coupling",0xfee4,0x0274>;//"Coupling"和"DC"显示GUI_PrtStr<188,280,"DC",0x0000,0xffff>;GUI_PrtStr<168,273,"Volt/Div",0xfee4,0x0274>; //"Volt/Div"和"0.42V"显示GUI_PrtStr<148,275,"0.42V",0x0000,0xffff>;GUI_PrtStr<128,270,"Time/Div",0xfee4,0x0274>; //"Time/Div"和"60uS"显示GUI_PrtStr<108,275,"60uS",0x0000,0xffff>;GUI_PrtStr<88,274,"TrigVolt",0xfee4,0x0274>; //TrigVolt显示sprintf<UART0_StrBuff,"%1.2fV",CH1TptVal*3.3/255>;GUI_PrtStr<68,276,UART0_StrBuff,0x0000,0xffff>;GUI_PrtStr<48,280,"Invert",0xfee4,0x0274>; //"Invert"和"Off"显示GUI_PrtStr<28,283,"Off",0x0000,0xffff>;4.5定时器设计PWMPR=0x00;//不分频,计数频率为FpclkPWMMCR=0x02; //设置PWMMR0匹配时复位PWMTCPWMMR0=CYCLE_DATA;//设置PWM周期PWMMR6=DUTY_CYCLE_DATA; //设置PWM占空比PWMLER=0x41; //PWMMR0、PWMMR6锁存PWMPCR=0x4000; //允许PWM6输出,单边PWMPWMTCR=0x09; //启动定时器,PWM使能4.6AD转换设计ADCR=<1<<7>| //SEL=0x80,选择通道7<<Fpclk/4500000-1><<8>| //CLKDIV=Fpclk/4500000-1,即转换时钟为4.5MHz<1<<16>| //BURST=1,软件控制转换操作<2<<17>| //CLKS=2,使用9clock转换,8位精度<1<<21>| //PDN=1,正常工作模式<非掉电转换模式><0<<22>| //TEST1:0=00,正常工作模式<非测试模式><1<<24>| //START=1,直接启动ADC转换<1<<27>; //EDGE=0<CAP/MAT引脚下降沿触发ADC转换> dat=ADDR; //读取ADC结果,并清除DONE标志位4.7数据处理voidOSC_PCM<void> //2048个数据采集,每个数据为8位{ uint32i,dat;for<i=0;i<1024*2;i++>{while<<ADDR&0x80000000>==0>;//等待转换结束dat=ADDR;//读取ADC结果CH1[i]=<dat>>8>&0xFF;//提取AD转换值}}4.8触发设计uint8OSC_LockTrigerPoint<void> //触发点锁定{ uint32i;uint32Avg0,Avg1;CH1Tpt1=0;for<i=250;i<1250;i++>{Avg0=<CH1[i+3]+CH1[i+2]+CH1[i+1]+CH1[i+0]>>>2;//对采样值滤波Avg1=<CH1[i+7]+CH1[i+6]+CH1[i+5]+CH1[i+4]>>>2;//对采样值滤波if<<Avg1-Avg0>>0>//比较2个采样点,判断是否为上升沿{CH1TptVal=80; //触发点电压为:3.3*80/255=1.04Vif<<Avg1>CH1TptVal>&&<Avg0<CH1TptVal>>//是否为触发点{CH1Tpt1=i;//保存触发点对应的采样序号i=0xffff;//破坏循环条件,退出for循环}}i++;//没有找到触发点则向上继续收缩}if<i==1250>//如果搜索到1240意味无法找到触发点{CH1Tpt1=250;//给定一个初始值用于显示return<0>;}else{return<1>;}}4.9周期设计uint8OSC_FindPeriod<void> //求〔寻找周期{uint32i;uint32Avg0,Avg1;if<CH1Tpt1>240>//已经锁定触发点,可以寻找周期{for<i=CH1Tpt1+8;i<1250;i++>{Avg0=<CH1[i+3]+CH1[i+2]+CH1[i+1]+CH1[i+0]>>>2;Avg1=<CH1[i+7]+CH1[i+6]+CH1[i+5]+CH1[i+4]>>>2;if<<Avg1-Avg0>>0>{//CH1TptVal=128;if<<Avg1>CH1TptVal>&&<Avg0<CH1TptVal>>//是否为触发点{CH1Tpt2=i;i=0xffff;}}i++;}}if<i==1250>{CH1Tpt2=250;//给定一个初始值用于显示return<0>;}else{CH1Fre=422880/<CH1Tpt2-CH1Tpt1>;return<1>;}}4.10求最值设计voidOSC_CH1MaxMin<void> //求〔寻找最大值和最小值{uint32i;uint32Max,Min;Max=CH1[CH1Tpt1-125];Min=CH1[CH1Tpt1-125];for<i=CH1Tpt1-125;i<CH1Tpt1+125;i++>{if<CH1[i]>Max>{Max=CH1[i];}if<CH1[i]<Min>{Min=CH1[i];}}CH1Max=Max;CH1Min=Min;}4.11主函数与调用的TASK设计#include"config.h"#include"stdlib.h"OS_STK Task0Stk[128]; //DefinetheTask0stack定义用户任务0的堆栈OS_STK Task1Stk[128]; //DefinetheTask1stack定义用户任务1的堆栈OS_STK Task2Stk[128]; //DefinetheTask2stack定义用户任务2的堆栈OS_STK Task3Stk[128]; //DefinetheTask3stack定义用户任务3的堆栈OS_STK Task4Stk[128]; //DefinetheTask4stack定义用户任务4的堆栈void Task0<void*pdata>; //Task0任务0void Task1<void*pdata>; //Task1任务1void Task2<void*pdata>; //Task2任务2void Task3<void*pdata>; //Task3任务3void Task4<void*pdata>; //Task4任务4intmain<void>{ OSInit<>; //操作系统初始化 OSTaskCreate<Task0,<void*>0,&Task0Stk[128-1],2>; //创建Task0任务,优先级为2 OSTaskCreate<Task1,<void*>0,&Task1Stk[128-1],3>; //创建Task1任务,优先级为3 OSTaskCreate<Task2,<void*>0,&Task2Stk[128-1],4>; //创建Task2任务,优先级为4 OSTaskCreate<Task3,<void*>0,&Task3Stk[128-1],5>;//创建Task3任务,优先级为5 OSTaskCreate<Task4,<void*>0,&Task4Stk[128-1],6>; //创建Task4任务,优先级为6 OSStart<>; //启动操作系统 return0; }Task0任务0//采样1600个数据,锁定触发点voidTask0<void*pdata>{uint32i; pdata=pdata; //防止编译警告,以下同 TargetInit<>; //初始化目标板 while<1> {OS_ENTER_CRITICAL<>; //进入临界区for<i=0;i<1600;i++> //采样1600个数据{while<<ADDR&0x80000000>==0>;//等待转换结束CH1[i]=<ADDR>>8>&0xFF;//提取AD转换值〔8位}OS_EXIT_CRITICAL<>; //退出临界区 OSC_LockTrigerPoint<>; //锁定触发点OSC_FindPeriod<>; //求频率OSC_CH1MaxMin<>; //求最大、最小值GUI_ClrTrack<>; //清除旧轨迹〔前一次波形GUI_DispTrack<>; //显示新轨迹〔当前波形 OSTimeDly<50>; //延时 }}Task1任务1//调用函数:sprintf,GUI_PrtStr,OSTimeDlyvoidTask1<void*pdata>{ pdata=pdata; while<1> { sprintf<UART0_StrBuff,"CH1max=%1.2fV",CH1Max*3.3/256>; //显示通道1最大值〔1位正数、2位小数 GUI_PrtStr<5,10,UART0_StrBuff,0xfee4,0x0274>; //坐标位置5、10,前景黄色,背景蓝色 sprintf<UART0_StrBuff,"CH1min=%1.2fV",CH1Min*3.3/256>; //显示通道1最小值〔1位正数、2位小数 GUI_PrtStr<5,110,UART0_StrBuff,0xfee4,0x0274>; sprintf<UART0_StrBuff,"CH1Fre=%6dHz",CH1Fre>;//显示通道1频率〔6位正数 GUI_PrtStr<5,210,UART0_StrBuff,0xfee4,0x0274>;OSTimeDly<100>; //延时 }}Task2任务2voidTask2<void*pdata>{ pdata=pdata; while<1> { GUI_PrtStr<208,270,"Coupling",0xfee4,0x0274>; //直流耦合 GUI_PrtStr<188,280,"DC",0x0000,0xffff>; //前景黑色,背景白色 GUI_PrtStr<168,273,"Volt/Div",0xfee4,0x0274>; //Y轴;0.42V/格 GUI_PrtStr<148,275,"0.42V",0x0000,0xffff>; GUI_PrtStr<128,270,"Time/Div",0xfee4,0x0274>; //X轴;60uS/格 GUI_PrtStr<108,275,"60uS",0x0000,0xffff>; GUI_PrtStr<88,274,"TrigVolt",0xfee4,0x0274>; //触发电平显示 sprintf<UART0_StrBuff,"%1.2fV",CH1TptVal*3.3/255>; GUI_PrtStr<68,276,UART0_StrBuff,0x0000,0xffff>; GUI_PrtStr<48,280,"Invert",0xfee4,0x0274>; //反向显示关 GUI_PrtStr<28,283,"Off",0x0000,0xffff>;OSTimeDly<2000>; }}Task3任务3//CH1Tpt1:通道1符合触发条件对应的第一个采样序号,CH1Tpt2:通道1符合触发条件对应的第二个采样序号voidTask3<void*pdata>{ pdata=pdata; while<1> { sprintf<UART0_StrBuff,"CH1Tpt1=%6d\n\r",CH1Tpt1>; UART0_SendStr<UART0_StrBuff>; //通过串口0,发送CH1Tpt1 sprintf<UART0_StrBuff,"CH1Tpt2=%6d\n\r",CH1Tpt2>; UART0_SendStr<UART0_StrBuff>; //通过串口0,发送CH1Tpt2 GUI_PrtStr<226,268,"Running",0xfee4,0x0274>;//交替显示RunningOSTimeDly<200>; GUI_PrtStr<226,268,"Running",0xfee4,0xa000>;OSTimeDly<200>; }}Task4任务4//按键控制voidTask4<void*pdata>{ uint32pwm; pdata=pdata; while<1>{/*自检信号,可以调节PWM占空比*/if<<IO0PIN&

温馨提示

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

评论

0/150

提交评论