基于STM32的多功能示波器设计

  • 格式:docx
  • 大小:244.59 KB
  • 文档页数:20

基于STM32的多功能示波器设计

高级组:示波器论文——李振辉队

一、摘要

示波器是一种十分常用电子测量仪器,它将电信号转换成图像信息或者数值输出,方便人们对各种电现象的研究。但是传统示波器具有不方便携带,功能不易拓展等缺点。本设计一种多功能存储示波器,该示波器采用STM32处理器,实现了采样、处理、存储等功能;采用双电源供电;可对波形进行存储和再现。而且其大小仅为与成人手掌大小一般,充分体现了此多功能示波器的便携性,满足了现场测试的要求,同时降低了成本。

二、设计要求

1.基本要求

1)可以单片机显示屏上实时地显示当前电压值,并且有波形显示以及坐标方格显示。

2)示波器最高测量电压不低于10V,精度不低于20mv。

3)具有改变采样频率以及幅度变换功能,即改变“X增益”和“Y增益”,并且有图像上下移动的功能。

4)具有输入电压过高的报警功能,电压达到设定值提醒功能,电压动荡提醒功能等。

5)支持图像保存功能以及图像回调功能。

2.拓展要求

1)具有多通道信号输入功能,即可以同时测量多路信号。

2)利用十字交叉线精确标志处出波形上点的横纵坐标,实现横纵坐标的对应显示。

3)人机交互功能,上位机通讯功能,以及其他创新功能。

三、 数字示波器的性能参数设计

我们都知道数字示波器,所谓数字示波器其实就是通过采样定理对模拟的连续信号进行数据采集,再经A/D转换器转换成数字信号,使用软件编程等一系列的技术制造出来的高性能示波器。

数字存储示波器的指标很多,包括采样率、带宽、灵敏度、通道数、存储容量、扫描时间和最大输入电压等。其中关键的技术指标主要有采样率、垂直灵敏度(分辨率)、水平扫描速度(分辨率)。这几项指标直接与所选A/D、FIFO和高速运放器件的性能,以及电路设计有关。下面根据所选器件的性能参数,合理地分析和确定示波器的采样率和分辨率。

1、采样率与水平扫描分辨率

采样率主要取决于A/D转换器的转换速率,由于最高测量电压不低于10V,精度不低于20mv,故在此使用STM单片机内置的12位的A/D转换器即可。常用每秒取样点数Sa/s(sample/second)来表示。为了使示波器具有较高的信号波形分析细节,采用数字内插技术来恢复和重建信号波形。取信号每周期采样点数为20,插值倍数为4。水平显示像素点数为400个,共10格。水平扫速与采样时钟频率的关系表如下。

2、 垂直灵敏度

垂直分辨率的高低直接影响数字示波器对波形细节的显示,垂直分辨率越高,则示波器上的信号波形细节越小,它取决于A/D转换精度和显示屏的显示分辨率。本文设计中取最大采样输入电压为2 Vpp,垂直刻度为8格,共256个像素点,因此垂直精度为0.25 V/格。共设计9个灵敏度档位,每档灵敏度与程控放大倍数的关系如表2所示。

四、数字示波器的硬件设计

1、 系统硬件总体框图

系统硬件总体框图如图1所示,主要由STM32控制单元,信号输入阻抗匹配单元,信号调理单元,A/D采样与存储单元,时钟单元,显示单元等组成。输入信号经阻抗匹配后,送入信号调理单元,将信号的幅度放大或衰减到适合A/D采样的范围内,A/D采样单元对幅度为2VPP的信号进行A/D采样,并将采样结果存入存储单元中。CPU从存储单元中读存数据并进行内插运算,然后根据用户通过输入的指令将信号波形显示在液晶屏上。硬件电路原理图用Altium designer 进行布线设计,Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows XP操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合。

系统框图如下:

2、 输入阻抗匹配电路

对于低速数据采集,由于信号反射对信号的传输过程影响微乎其微,所以低速数据采集系统良好的高阻抗性能,对提高系统的测量精确度有很大的意义。本设计中采用电压跟随器实现阻抗变换,数据采集阻抗变换电路的设计方案如图2所示,其输入阻抗为10MΩ。

3、信号调理电路

信号调理电路主要采用具有可变增益的数字程控放大器TL082CD。该器件增益调节范围为-6 dB~+24 dB,可调增益的-3 dB带宽为230MHz,可采取单电源或双电源供电。主要用于数字控制自动增益系统、收发信号处理等领域。本设计主要使用其数字控制自动增益功能。

设计电路如下:

4、A/D和存储器电路

在数据采集电路设计中,采用STM32内置的A/D转换电路为12位高速AD转换器,最高采样频率为60 MSa/s,最低采样频率为10 kSa/s。12位转换精度的显示分辨率为4096格,能够满足所选用分辨率为640*480的显示模块。存储器也采用STM32内置的高速缓存,其缓存深度达1 024 K。存储器是一种双口的SRAM,没有地址线,随着写入或读取信号对数据地址指针进行递加或递减,来实现寻址。

5、时钟电路

时钟产生电路为AD转换器提供一系列的采样时钟信号,共有8种频率,分别对应着不同的水平扫速。时钟产生电路主要由高稳定度的温补晶振,本设计采用STM32内置的时钟电路。基准时钟信号由一块60 MHz的温度补偿型有源晶体模块提供,输出的60 MHz信号经过分频器的多次分频得到8种不同的频率。另外,中央控制器采用STM32处理器,主频设为80 MHz。显示器采用分辨率为640*480的显示模块,与STM32之间采用SPI接口。与其它上位机通信采用RS232口。

6、过压报警电路

本电路采用AD790比较放大器进行设计,双电源供电,当输入电压高于设定值时,则发出报警信号,LED灯亮。电路图如下:

整体电路设计连接图如下:

五、系统软件设计

系统软件设计采用模块化设计方法,整个程序主要由初始化程序、人机交互菜单程序、键盘扫描程序、触发程序、显示程序和数据采集及频率控制程序组成。系统软件的流程图如图所示。

显示频的界面代码:

/****************************************************************************

* 名 称:void ili9320_SetCursor(u16 x,u16 y)

* 功 能:设置屏幕座标

* 入口参数:x 行座标

* y 列座标

* 出口参数:无

* 说 明:

* 调用方法:ili9320_SetCursor(10,10);

****************************************************************************/

void ssd1289_SetCursor(u16 x,u16 y)

{

#ifdef LCD_240x320

LCD_WriteReg(0x004e,x); //行

LCD_WriteReg(0x004f,y); //列

#else

LCD_WriteReg(0x004e,y); //行

LCD_WriteReg(0x004f,0x13f-x); //列

#endif

}

void LCD_WriteRAM_Prepare(void)

{

LCD_REG = R34;

}

/******************************************************************************* * Function Name : LCD_WriteRAM

* Description : Writes to the LCD RAM.

* Input : - RGB_Code: the pixel color in RGB mode (5-6-5).

* Output : None

* Return : None

*******************************************************************************/

void LCD_WriteRAM(u16 RGB_Code)

{

LCD_RAM = RGB_Code;

}

/****************************************************************************

* 名 称:void ili9320_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY)

* 功 能:设置窗口区域

* 入口参数:StartX 行起始座标

* StartY 列起始座标

* EndX 行结束座标

* EndY 列结束座标

* 出口参数:无

* 说 明:

* 调用方法:ili9320_SetWindows(0,0,100,100);

****************************************************************************/

//inline void ili9320_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY)

void ssd1289_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY)

{

ssd1289_SetCursor(StartX,StartY);

LCD_WriteReg(0x0044,StartX|EndX<<8);

LCD_WriteReg(0x0045,StartY); //设置窗口的垂直开始地址

LCD_WriteReg(0x0046,EndY);

}

/****************************************************************************

* 名 称:u16 ili9320_GetPoint(u16 x,u16 y)

* 功 能:获取指定座标的颜色值

* 入口参数:x 行座标

* y 列座标

* 出口参数:当前座标颜色值

* 说 明:

* 调用方法:i=ili9320_GetPoint(10,10);

****************************************************************************/

u16 ssd1289_GetPoint(u16 x,u16 y)

{

ssd1289_SetCursor(x,y);

return (ssd1289_BGR2RGB(LCD_ReadRAM()));