简易数字示波器设计.docx

上传人:b****5 文档编号:5324747 上传时间:2022-12-15 格式:DOCX 页数:19 大小:260.34KB
下载 相关 举报
简易数字示波器设计.docx_第1页
第1页 / 共19页
简易数字示波器设计.docx_第2页
第2页 / 共19页
简易数字示波器设计.docx_第3页
第3页 / 共19页
简易数字示波器设计.docx_第4页
第4页 / 共19页
简易数字示波器设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

简易数字示波器设计.docx

《简易数字示波器设计.docx》由会员分享,可在线阅读,更多相关《简易数字示波器设计.docx(19页珍藏版)》请在冰豆网上搜索。

简易数字示波器设计.docx

简易数字示波器设计

电信专业综合实践

 

设计题目:

在LPC2210开发板的基础上

----------简易数字示波器设计

 

学校:

班级:

姓名:

学号:

指导老师:

2011.1.1

 

第一章设计内容与要求

1.1设计内容:

在LPC2210开发板的基础上设计一简易数字示波器。

1.2设计要求:

Ø数字示波器的硬件系统的电路原理图设计

Ø数字示波器的图形界面设计

Ø数字示波器的信号触发、矢量显示、轨迹消隐实现

Ø被测信号的周期、最大/最小值实现

1.3系统功能:

以LPC2210开发板的液晶屏模拟数字示波器的显示屏,实现被测波形的显示。

1.4应用分析:

本设计对基于ARM(AdvancedRISCMachine)的简易示波器的设计过程进行了介绍。

主要对系统的硬件设计部分和软件设计部分进行了分析。

硬件设计部分首先给出了系统框图,然后对各个组成模块进行了介绍。

并给出了各模块所使用的主要元器件。

包括电源部分、放大部分、控制部分、键盘功能及芯片的采集和显示部分。

软件设计部分编写了使能部分、AD转换、显示部分、数值计算部分。

 

第二章系统的总体设计

2.1总体框图

2-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任务,优先级为6

4.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;//不分频,计数频率为Fpclk

PWMMCR=0x02;//设置PWMMR0匹配时复位PWMTC

PWMMR0=CYCLE_DATA;//设置PWM周期

PWMMR6=DUTY_CYCLE_DATA;//设置PWM占空比

PWMLER=0x41;//PWMMR0、PWMMR6锁存

PWMPCR=0x4000;//允许PWM6输出,单边PWM

PWMTCR=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.04V

if((Avg1>CH1TptVal)&&(Avg0

{

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

{

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

{

if(CH1[i]>Max)

{

Max=CH1[i];

}

if(CH1[i]

{

Min=CH1[i];

}

}

CH1Max=Max;

CH1Min=Min;

}

4.11主函数与调用的TASK设计

#include"config.h"

#include"stdlib.h"

OS_STKTask0Stk[128];//DefinetheTask0stack定义用户任务0的堆栈

OS_STKTask1Stk[128];//DefinetheTask1stack定义用户任务1的堆栈

OS_STKTask2Stk[128];//DefinetheTask2stack定义用户任务2的堆栈

OS_STKTask3Stk[128];//DefinetheTask3stack定义用户任务3的堆栈

OS_STKTask4Stk[128];//DefinetheTask4stack定义用户任务4的堆栈

voidTask0(void*pdata);//Task0任务0

voidTask1(void*pdata);//Task1任务1

voidTask2(void*pdata);//Task2任务2

voidTask3(void*pdata);//Task3任务3

voidTask4(void*pdata);//Task4任务4

intmain(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,OSTimeDly

voidTask1(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",CH

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1