首页 > 范文大全 > 正文

一种基于DDS和Qt的“所见即所得”波形发生器

开篇:润墨网以专业的文秘视角,为您筛选了一篇一种基于DDS和Qt的“所见即所得”波形发生器范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要: 提出一种基于直接数字频率合成(dds)技术和qt编程的任意波形发生器(AWG)的整体设计方案。完成了DDS在FPGA中的硬件修改设计以及在Linux环境下Qt程序的软件设计和内核驱动程序的开发,并给出实验结果。实验结果表明:通过触摸笔绘制任意波形,即可产生与所绘波形在时间和电压上均相同的实际电信号,达到“所见即所得”的效果,以满足各种测试和试验的要求。关键词:任意波形发生器;DDS; FPGA; Qt

中图分类号:TN911-34文献标识码:A

文章编号:1004-373X(2010)22-0028-03

"What You See is What You Get" Waveform Generator Based on DDS and Qt

ZHANG Kang-kang, WANG Zhong-xun, WANG Heng, LIU Jian-ying

(Institute of Science and Technology for Optoelectronics Information, Yantai University, Yantai 264005, China)

Abstract: A total design scheme of the arbitrary waveform generator (AWG) which is based on direct digital frequency synthesizer (DDS) technology and Qt programming is proposed. The DDS hardware modification on FPGA, the software design of Qt program and the development of the kernel driver in Linux environment were finished. The experimental results are presented. The experimental results indicate that the signal which is same as the practical electrical signal in time and voltage can be obtained through drawing an arbitrary waveform by the touching pen, the result of "What you see is what you get" is achieved, and the requirements of various tests are fulfilled. Keywords: arbitrary waveform generator;DDS; FPGA; Qt

0 引 言

随着电路设计的多样化,电路测试也对信号源提出了更高的要求。传统的信号源只能产生几种固定的波形,灵活度较差[1]。任意信号发生器(AWG)很好地满足了这个要求,它不仅可以输出标准信号,而且可以方便地产生任意波形,在测控、通信,医疗等领域有着广泛的应用。任意信号发生器通常采用直接数字频率合成(direct digital frequency synthesizer,DDS)技术实现。DDS技术是J.Tiemev在1971年首次提出的一种以全数字技术,它从相位概念出发直接合成所需波形的一种新的合成原理[2]。

Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立图形用户界面所需的所用功能。Qt是完全面向对象的,模块化程度非常高,很容易扩展,并且允许真正地组件编程[3]。Qt具有优良的跨平台特性,支持多种系统和平台,包括Windows系统,所有的UNIX系统以及嵌入式系统等。Qt遵循GPL(general public license)协议,开放主要的源代码,用户可以在GPL的规定下自由添加新特性。

1 DDS模块[4]的设计

1.1 DDS在FPGA中的实现

DDS由相位累加器,波形存储器,D/A转换器,低通滤波器[5]等部分组成。该系统的DDS模块根据需要做了适当的修改。其结构框图如图1所示。

图1 DDS模块

(1) 增加了通信接口电路和DDS控制模块用于接收用户数据和控制DDS的运行状态。

(2) 基准时钟采用5 MHz,经过可控分频器分频后作为DDS的时钟信号,周期分辨率最高可达200 ns(即分频为1)。

(3) 相位累加器的频率控制字固定为1,相位控制字固定为0。

(4) 波形存储器采用RAM[6],可以写入用户自定义的波形数据以产生任意波形,其地址宽度设置为11 b,这样存储深度可达2K点。

(5) 电平偏移电路用于消除D/A输出信号中叠加的无效直流分量,对于有效的直流分量会保留。

1.2 通信接口及控制寄存器的设计

DDS控制寄存器控制整个DDS模块的运行参数和状态,并通过通信接口接收来自ARM的数据。根据需要共设置了8个寄存器,地址从0~7。其功能和分配如表1所示。

表1 控制寄存器的功能及分配

ADDR01234567

DATA分频参数波形点个数及触发模式控制位启动/停止RAM控制及间接寻址

表1其中:

(1) 0~3 B存储分频参数,占用32位,因此分频范围为1~232。

(2) 4~5 B存储相位累加器的参数,用于控制波形点数和触发模式,其各位的含义如表2所示。

(3) 6 B只使用了最低位,为1启动DDS,为0则停止DDS。

(4) 地址7是一个虚地址,并不对应着实际的物理寄存器,而是与相位累加器组合指向RAM的某一个单元,通过对地址7的写操作就间接的实现了对整个RAM的操作,这样大大简化了对DDS的控制操作。

表2 相位累加器各位含义

Bit1514~1110~0

含义触发模式0:单次触发

1:循环触发保留波形点数

1.3 电平偏移及放大电路

电平偏移及放大电路用于消除输出信号中叠加的无效直流分量(允许有效直流量输出)和调整信号增益,其电路图如图2所示。

图2 电平偏移及放大电路

根据图2电路有:

uo1=-R2R1×ui+1+R2+R8R1R3R3+Rvuref

式中:Rv是R4两部分的并联电阻,当R2+R8R1=R3Rv=AU1时,有:uo1=AU1×(uref-ui)

uo2=-AU2×AU1×(uref-ui)=AU2AU1(ui-uref)

式中:AU2=R6+R9R5。

2 Qt程序设计

2.1 GUI设计

GUI(图形用户界面)是人机交互的窗口,GUI的设计直接关系到产品的可操作性,是软件设计中非常重要部分。考虑到触摸屏面板的空间有限,因此控件(Widgets)的设计尽量紧凑。该系统的GUI设计见┩3。

图3 GUI设计

左侧为工具栏,右侧黄色区域为绘图区。绘图区提供了滚动条,用于绘制超出屏幕范围的波形。可以绘制较长的序列信号。工具栏从上到下分为绘图模式选择区,波形输出设定区,时间设定区及清屏和退出按钮。

波形的绘制只允许从左向右进行,一个时刻只对应一个数据点;已绘制波形允许修改,修改过程中自动变成红色,修改完毕自动变成默认颜色。

2.2 Qt编程原理和方法

Qt程序设计[7]采用面向对象和事件驱动的方法,整个GUI程序划分为两个类,其中主窗口为一个类,类名为MainWindow,继承自Qt的QMainWindow类,它提供了工具条(toolbar)和一个主窗口(mainwindow);另一个类是DrawWidget,提供了一个绘图区域,有4种事件,分别为触摸笔按下(mousePressEvent),移动(mouseMoveEvent),松开(mouseReleaseEvent)和绘图区重绘事件(paintEvent)。同时提供了处理波形的函数waveProcess和调用底层驱动的接口。

滚动条是通过QScrollView类提供的视图功能来实现的。延迟输出功能通过Qtimer类来实现,延迟范围0~999 s。触摸笔的3个事件的发生顺序和处理过程见图4。

图4 触摸笔的事件及发生顺序

信号/槽机制是Qt的一个中心特征,用于对象间的通讯[8]。绘图事件(paintEvent)采用双缓冲机制。双缓冲技术是[9]一种GUI编程技术,它指的是在一个不在屏幕上的位图上渲染一个物件并把此位图拷贝到屏幕上,常用于消除闪烁和提供一个快速用户界面。该程序采用了Qpixmap类来实现双缓冲。

2.3 驱动程序设计

Linux设备驱动程序[10]是系统内核的一部分,运行于内核态。其可以以两种方式被编译和加载:直接编译进Linux内核和编译成一个可加载和删除的模块,通过modprobe/insmod和rmmod来加载和卸载驱动模块。该系统即采用字符设备驱动。

在系统内部,I/O设备的存/取通过一组固定的入口点来进行,具体到Linux系统,设备驱动程序所提供的这组入口点由一个文件操作结构file_operation来向系统进行说明。

该系统的驱动函数需要提供3个函数调用,read函数用于读取DDS运行状态,write函数用于向DDS写入参数和波形数据,ioctl函数用于复位/启动/停止DDS。另外还需要打开(open)和关闭设备函数(close)。File_operatio的定义如下:

static struct file_operations dev_fops = {

.owner = THIS_MODULE,

.ioctl = wave_ioctl,//对DDS复位/启动/停止等控制操作

.write = wave_write,//写入数据

.read = wave_read,//读取状态

};

驱动程序在wave_ioctl,wave_wirte,wave_read等几个函数中具体实现。

所需的波形参数和数据通过Qt程序打包,调用write函数(对应驱动程序中的wave_wrtie函数)一次性写入DDS模块。

最终将驱动程序编译为模块文件(*.ko),通过命令modprobe和rmmod来加载和卸载驱动模块。

3 系统操作及测试

(1) 设置波形参数,包括绘图模式,时间轴刻度,输出延时等。

(2) 绘制波形,并作相应的修改,最终完成波形绘制。在松开触摸笔之后Qt程序根据所选择的波形绘制模式对波形进行处理和优化并重新显示出来。

(3) 点击单次触发模式或重复(循环)触发模式,此时Qt程序提取时间轴刻度参数,转换为DDS中可控分频器的分频参数,并将这些参数和处理后的波形数据打包传输给DDS模块,输出延时完毕则启动DDS,即产生与所绘波形相同的实际电信号,达到“所见即所得”的效果,如图5所示(时间刻度为100 μs)。

图5 实验截图

4 结 语

任意波形发生器是现代电子技术的一个新发展,本文给出了一种基于DDS和Qt的任意波形发生器的整体设计方案,分析了DDS在FPGA中的实现和Linux下Qt程序的设计。该设计最大的特点是“所见即所得”,即绘制何种波形就可立即产生何种波形,非常直观,从而以满足各种电路测试,通信等领域快速产生任意波形信号的要求。

参考文献

[1]江伟,王元中.基于FPGA的DDS的设计与实现[J].山西电子技术,2007(2):24-25,40.

[2]高玉良,李延辉.现代频率合成与控制技术[M].北京:航空工业出版社,2002.

[3]Xteam(中国)软件技术有限公司.Qt程序设计[M].北京:清华大学出版社,2002.

[4]周国富.利用FPGA实现DDS专用集成电路[J].电子技术应用,1998(3):31-32.

[5]潘松,黄继业.SoPC技术使用教程[M].北京:清华大学出版社,2005.

[6]王晓升,沙胜贤.基于DDS的任意波形发生器实现[J].长春工程学院学报:自然科学版,2005(2):56-58.

[7]倪继利.Qt及Linux操作系统窗口设计[M].北京:电子工业出版社,2006.

[8]唐新华.QT的信号与槽机制介绍[EB/OL].[2008-03-06]./developerworks/cn/linux/guitoolkit/qt/signal-slot/.

[9]刘光照.双缓冲技术[EB/OL].[2009-07-11]./?q=node/176.

[10]CORBET Jonathan, ALESSANDRO R. Linux device dri-vers 3rd ed [M]. [S.l.]: O′Reilly,2005:6-7.