APP下载

基于Arduino平台的简易示波器设计与实现

2018-05-30贵州民族大学机械电子工程学院普天尧

电子世界 2018年9期
关键词:示波器寄存器波形

贵州民族大学机械电子工程学院 普天尧

1.Arduino平台简介

Arduino是一个基于一系列单片机电路板的开源电子设计平台,它同时提供了免费的开发环境(Arduino IDE)。相较其他单片机平台,Arduino具有多种优势,使其越来越广泛地被应用于高校教学、课程设计之中。

1.1 易用性

Arduino使用C/C++语言编写程序,并且其核心库文件提供了大量的基于AVR-GCC库二次封装形成的API(Application Programming Interface)[1]。因此,使用者无需熟悉单片机寄存器的功能和设置方法,稍懂一些C语言即可开始项目设计,适合在高校低年级学生的实践课程、竞赛培训等中应用、推广。

1.2 开放性

Arduino的硬件电路、IDE软件及核心库文件均是开源的,在不用于商业用途的前提下,允许使用者在其基础上扩展开发。

1.3 交流性

Arduino在世界各地拥有众多开发者和用户,因此可以在网络上搜索到丰富的案例教程,以及一些I/O设备在Arduino下的类库,从而有效地降低开发难度、缩短开发周期。

1.4 低成本

Arduino开发板价格相对便宜,例如本文设计使用的Arduino UNO R3控制器,价格在15到20元。此外,不需要编辑器,直接使用USB数据线即可完成程序下载,开发成本低,适合学生学习、创作。

2.系统硬件设计

数字示波器其工作原理是将输入的模拟信号经ADC(Analog to Digital Converter)采样后得到数字信号,并对其进行存储、运算后将信号波形及所需参数输出到显示屏。

Arduino UNO是Arduino的主流产品,它包含14个数字输入/输出端口,6个模拟输入端口,一个16MHz的晶体振荡器[2]。其微控制器是ATmega328,它内部提供一个10位精度的逐次逼近型ADC。本文采用该系列最新版本UNO R3来实现信号的采样、存储及处理。波形及参数显示使用LCD12864,以串行方式将其与Arduino的硬件SPI口连接[3]。开关S1、S2用于采样率大小的增减,开关S3用于波形的锁定。示波器的电路图如图1所示:

图1 示波器硬件电路图

3.系统软件设计

Arduino程序主要由函数setup()和loop()构成。setup()函数中的代码只被执行一次,通常用于完成I/O口状态的配置等初始化工作。loop()函数是一个死循环,其中程序将反复运行。

本文设计的数字示波器的软件部分主要包括:信号采样模块、键盘扫描模块、信号参数计算模块及波形显示模块。其中,信号采样需要使用定时器中断,其余模块均放入loop()中实现。

3.1 信号采样模块

采样率,即单位时间内的采样次数,单位Sa/s,是数字示波器的重要指标,其大小影响波形质量。数字示波器的采样主要有实时采样和等效采样两种模式。综合考虑控制器的性能指标,本设计中采用实时采样,即固定时间间隔采样,该模式下如果波形使用矢量显示,采样率应不低于数字实时带宽的10倍[4]。

Arduino核心库提供了函数analogRead()用于模数转换,它读入一个模拟输入信号耗时100μs,即使用该函数能够获得的最大采样率为10000Sa/s,此时数字示波器的测量频率小于1kHz。为了实现更高的采样率,需要对ATmega328内置ADC进行设置。ADC的工作模式使用ADC自动触发连续采样,在该模式下,完成一次转换的时间是13.5个ADC周期。该ADC模块包含一个预分频器,通过对系统时钟分频可以获得一个适合的ADC时钟频率。在经过多次性能测试后,本设计的预分频系数设置为8,即 fADC=2MHz,对应的采样周期为:

因此该系统的最高采样频率:

完成一次模数转换后其结果存放在ADC数据寄存器中,故需等时间间隔读取ADC结果,并以数组形式存入控制器内存,这个过程本文采用定时器中断实现。ATmega328的定时器在CTC(Clear Timer On Compare)模式下,计数值与寄存器OCRnA的数值进行比较,若匹配则进入中断,之后计数值清零。这里不对定时器时钟分频,则当OCRnA取107时,定时器中断发生的频率与ADC采样频率一致。

3.2 键盘扫描模块

该示波器配置三个按钮,其中一个用于锁定波形,另外两个按钮分别用于采样率大小的增减。每次进入键盘扫描函数后,会检测指定引脚的电平变化,满足条件时则对相关参数进行修改。波形锁定是通过改变标志变量的值,从而控制LCD绘图程序是否运行;而对定时器中OCRnA寄存器的值进行修改则可以调整定时器中断周期,从而调整采样率大小。

3.3 信号参数计算模块

为了使得每次扫描的数据同步,显示的波形稳定,需要查找到信号的同步触发点,并将该点作为信号显示的起点并丢弃前面的数据。因此,尽管波形显示区域设置为96╳64,但这里采样深度取192点。

除了波形显示外,本设计将对采样数据进行处理,获得输入信号的峰峰值Vpp和频率f。Vpp的计算是通过查找采样数据中的最大值和最小值来实现。频率可以使用周期法测量,已知采样率,通过对采样数据处理得到输入信号每个周期的平均采样次数,进而确定其周期T,频率f=1/T。具体实现代码如下:

3.4 波形显示模块

通常情况下,为了实现LCD12864的正常显示功能,使用者需要严格地按要求写入驱动程序。然而利用Arduino平台进行系统设计时,可以跳过这个繁冗的步骤,本设计中直接调用U8glib库函数来实现液晶屏的设置及图形绘制功能。U8glib是目前Arduino上使用最广泛的图形显示类库,支持多种型号的液晶显示屏。Arduino控制器和LCD采用硬件SPI通信,引脚连接如图1所示。程序中需包含U8glib.h头文件,并建立一个LCD对象,代码如下:

上述代码中的draw()函数,其中应包含实现图形显示的代码。

4.测试分析及结论

为了验证示波器的波形显示功能和频率测量性能,本文使用信号发生器提供等幅值不同频率的正弦输入信号。示波器输出波形及信号参数如图2所示:

图2 不同频率的信号波形显示

表1给出输入信号频率不同时频率测量的相对误差。

表1 频率测量结果

经测试数据显示,利用Arduino平台提供的开源硬软件可以实现一个误差较小的简易数字示波器。

基于Arduino的系统设计具有软件结构简单、实现成本低、开发周期短等优势,适合引入到高校工科专业实验课程的教学活动中,有助于提高学生的学习兴趣,培养学生的创新思维和实际操作能力。

[1]陈吕洲.Arduino程序设计基础[M].北京:北京航空航天大学出版社,2015.

[2]范钦武.基于arduino和enc28j60的温湿度监控系统设计[J].科技视界,2014(23):108-109.

[3]吴汉清.玩转Arduino电子制作[M].北京:机械工业出版社,2016.

[4]康玲竹.数字示波器特性及应用[J].船电技术,2009(06):59-60.

猜你喜欢

示波器寄存器波形
对《压力容器波形膨胀节》2018版新标准的理解及分析
Lite寄存器模型的设计与实现
基于LFM波形的灵巧干扰效能分析
一款教学示波器的Y通道设计与实现
分簇结构向量寄存器分配策略研究*
可携带式虚拟双踪示波器
基于TEGRA K1的实时信号处理示波器的设计
基于ARM的任意波形电源设计
大连台使用CTS-1记录波形特点
高速数模转换器AD9779/AD9788的应用