STM23单片机驱动的信号发生器设计详解
摘要
此信号发生器以STM32F429IGT6芯片为控制核心的单片机,整个系统能产生正弦波、方波、三角波和AM、FM两种
调制波。具体产生方式入下:通过按键控制DDS分别能产生正弦波和AM、FM两种调制波,单片机控制模拟开关使DDS
产生的正弦波通过比较器生成方波且占空比在10%-50%之间变化,其中低频部分(1Hz-100kHz)使用OPA1611运放芯
片和高频部分(100kHz-5MHz)使用OPA847运放芯片。生成的方波低频部分通过积分电路,高频部分通过RC低通滤波
器产生三角波。产生的信号最后通过放大电路使其幅度控制在0.1V-5V,并连续可调,单片机通过按键控制方波、正
弦波和三角波的频率在1Hz-5MHz范围内可调,通过按键控制AM和FM两种波形的调制波频率在100Hz-1kHz范围内可
调,载波频率可以在1MHz-5MHz调节。
关键词: DDS,正弦波,方波,三角波,调制波
1 绪论
1.1 课题背景与研究意义
随着二十世纪四十年代电子仪器时代的兴起到现在,示波器和函数信号发生器的技术越来越成熟,精度和集成
度越来越高,体积也越来越小,并且有了各种不同种类为了满足特殊测试的便携式示波器和信号发生器的出现[2]。
本文根据函数信号发生器的原理,设计了一款适合外地实验和教学课程等的小型信号发生器系统。信号发生器是应
用在电子电路以及测试实验等领域的一种常用信号源,它是一种电信号设备,所以信号发生器的应用是非常广泛
的,同示波器、频率计一样是最基本的、最普通的电子仪器,大部分的电参量都要用到它[3]。微电子技术、计算机
技术和信号处理技术等都极大刺激了DDS(数字频率合成器技术)的发展。信号对于电子产品极为重要,能够制作一
个产生信号种类多频带广的信号发生器一直是一个重要的研究目标。信号发生器是实验室常见的仪器设备,无论是
在教学还是在实验中都有着广泛的应用,制作一个信号发生器,不仅是对教材基础知识掌握的体现,也是动手能力
的体现。
1.2 国内外研究现状及发展趋势
信号发生器能够产生各种信号,它可以根据不同人们的要求,产生每个人需要的波形,具有方便快捷,实时性
强等优点,正在慢慢代替传统的函数发生器。随着计算机、数字集成电路和微电子技术的发展,频率合成技术有了
新的突破—直接数字频率合成技术DDS(Direct Digital Synthesis),他是将先进的数字信号处理理论与方法导入到
信号合成领域的一项新技术,它的出现为进一步提高信号的频率稳定度提供了新的解决方法[4]。随着微电子技术的
快速进步和国家社会的重视,智能硬件仪器也有了快速展发,智能程度也不断提高,功能更加齐全丰富,性能也更
加稳定可靠。本课题的目的就是依据DDS原理和比较器、放大器、积分电路和模拟开关设计开发出一个能产生正弦
波、方波、三角波且能产生AM和FM两种调制波。
信号发生器有着一种独立的来源,并且可以和很多智能测试设备联合使用。关键技术在于信号发生器多种高性
能仪器支持技术,因为它可以提供高品质的精密信号源和扫描源代码,您可以极大地简化了检测相应的系统程序,降
低测试成本,大大提高检测精度[5]。 虽然我国很早以前就开始信号发生器的研制,也取得了很多的成果,但是我国
信号发生器产业和其他先进国家仍然有很大的差距。因此对于这类产品的研发我辈义不容辞。
1.3 研究的主要内容
本设计由DDS、积分器、模拟开关、差分放大器和STM32F429单片机组成。单片机控制DDS模块产生正弦波、FM调
制波、AM调制波,单片机再控制模拟开关使正弦波通过积分器产生三角波,通过比较器产生占空比可调方波。主要
2 方案论证与系统总体设计
本设计的方案论证主要是选择合适的STM32芯片、运算放大器芯片、模拟开关芯片和DDS信号,最后选择好整个
电子系统的整体方案。方案的选择至关重要,一个好的方案才是一个成功的基石。STM32芯片主要看他们芯片功能的
大小,RAM和ROM内存的大小以及芯片工作的速度,单片机需要控制DDS、模拟开关、矩阵键盘和LCD液晶显示器,其
需要实现的功能较多,数据存储量也多,所以对于单片机芯片的选择不可小视。运放芯片和模拟开关芯片主要看他
们的频带宽度以及各频带的芯片参数,因为我们要做的频带较宽,所以芯片选择很重要。DDS主要选择能产生波形
多,各方面能达到题目要求,在这之上选择功能更多,性能更好的DDS。
2.1 系统功能框图
本设计主控是STM32单片机和DDS构成,以STM32F429IGT6芯片控制DDS产生正玹波和FM、AM两种调制波,单片机
控制模拟开关将DDS产生的正弦波通过比较器电路转换成同频同相的方波,产生的方波通过积分电路和RC低通滤波电
路生成三角波。产生的波形最后都通过运算放大电路使信号幅度在0.1V—5V连续可调。其中低频部分(1Hz—
100kHz)和高频部分(100kHz—5MHz)所用的运放芯片不同。通过单片机控制DDS产生的方波、正弦波和三角波的频
率在1Hz—5MHz范围内并连续可调,控制产生的FM和AM两种调制信号的频率范围在100Hz—1kHz,载波信号在1MHz—
5MHz可调。其中DDS输出信号控制在500mV左右,比较器输出电压控制在1V。
图2.1 系统框图
2.2 方案论证
2.2.1 处理器方案论证
方案一:使用51单片机STC8051作为主控芯片,完成数据处理,DDS的频率和波形输出控制、模拟开关的控制、键
盘的控和LCD液晶显示器的显示控制等。但是51单片机运行速度比较低,大部分都在12MHz左右,且只包含5个中断
源,两个定时器和一个串口,局限性很大。RAM和ROM都很小,整体来看效果不好。
方案二:采用32位STM32处理器STM32F429IGT6由于STM32F429IGT6以Crotex-M4为主核,具有单精度浮点运算单
元(FPU)。最高主频达到180MHz且GPIO口翻转速度为90MHz能满足速度要求,用起来更加的得心应手。内置有高速嵌
入式内存259KB的SRAM,闪存高达2MB。控制LCD液晶完全没问题,不仅体积小而且可靠性高。除此之外,
STM32F429IGT6采用C语言编程,GPIO口很多,使得程序的编写更为方便,电路也随之简化很多。
综上所述,STM32F429IGT6内存更大,工作速度更快,功能更多,本系统要处理大量的数据,整体来看选择方案二。
2.2.2 数字频率合成器方案论证
方案一:使用AD9833,AD9833能够产生正弦波、三角波、方波输出,是一种低功耗可编程控制的数字信号发生
器。波形发生器广泛应用于各种测量、激励和时域响应领域,AD9833无需外接元件,输出频率和相位都可通过软件编
程,易于调节,频率寄存器是28位的,主频时钟为25MHz时,精度为0.1Hz,主频时钟为1MHz时,精度可以达到0.004Hz
[6]。工作电压范围为2.3V-5.5V。AD9833各当面性能级指标都挺符合本次课题,但是AD9833只能产生正弦波、三角
波及方波三种波,如果使用AD9833我们还要加硬件电路做出AM和PM调制波,硬件工序增多,难度加大,成本怎加,
且对硬件的质量精度要求高,难以达到,该模块没有散热部分,温度影响大。
方案二:使用AD9959,AD9959是一款四通道数字频率合成器 。此芯片有四个 DDS 核,因此可以对内部四个不
同通道独立进行编程。AD9959不仅可以产生三角波、方波和正弦波三种基本信号,还可以产生AM、PM和FM调制波。
AD9959虽然能产生1Hz-500MHz的方波、正玄波、三角波和AM、PM调制波,但是AD9959产生1Hz-100kHz信号的时
候,有谐波干扰,信号出现大幅度失真,AD9959低频部分做的不是很好,适合较高频率信号的使用。
方案三:使用AD9854,AD9854数字合成器是高集成度的器件,采用先进的DDS技术,片内整合了两路高速、高性
能正交D/A转换器通过数字化编程可以输出I、Q两路合成信号[7]。 AD9854拥有着48位的频率分辨率下(频率分辨率
可达1uHZ),AD9854频带范围为1Hz-150MHZ[8]。内部有高速比较器,可以将正弦波转化成方波。AD9854能产生正
弦波、方波和各种调制波,且各个频率段信号都正常输出,除此之外,该模块带有散热功能,收温度影响大大降
低。
综上所述,AD9833产生频率种类达不到题目要求,AD9959产生低频信号发生较大失真。只有AD9854能产生题目
要求的波形种类且无失真的输出,所以选择方案三。
2.2.3 正弦波和调制波产生方案论证
方案一:采用模拟分离元件做,使用RC振荡器或者桥式振荡器等的方法产生信号,再通过滤波、积分器等产生
其他波,然后正玄波再通过混频器产生AM和FM两种调制波,通过调整振荡器可以改变输出频率,但采用分散的模拟
元器件,电路没有数字电路那么的稳定,容易受环境因素的干扰,稳定性不高,精度低,成本高,实用价值低,性
价比低。
方案二:采用压控振荡器的方法,压控振荡器是采用输入线性波形锯齿电压来控制输出频率的。它的优缺点是
电路相对于比较简单、结构不复杂,但是精度比较差,频率受VCO可变频率范围影响,频率范围不好把控,且只能产
生方波和正弦波[9]。
方案三: 利用DDS,DDS只需将所需正弦波频率伏值相位写入相应的寄存器中,然后累加器在波形储存器中查找
相应的波形数据,然后通过内部的D/ A转换器形成模拟正弦波,最后经过低通滤波器得到光滑完整的高质量信号。
综上所述,模拟分离元器件对模拟电路要求过多,精度低,压控振荡器频率不好把控产生波形种类少。DDS波型
种类能满足题目要求且精度高,所以选择方案三。
2.2.4 运放芯片方案论证
方案一:使用OPA1611。OPA1611是TI推出的一款高性能、单通道、双极输入运算放大器。与同类竞争器件相
比,隶属 TI Burr-Brown Audio 产品线的 OPA1612 可将噪声与失真分别降低 60 % 和 50 %[10]。通过芯片数据手
册知道OPA1611的带宽1Hz-40MHz,满足此课题1Hz-5MHz的带宽要求,且压摆率高达27V/μs,开环增益高达130dB特
别适合应用在中高频信号。
方案二:使用OP07芯片,OP07芯片有着低噪声,低失调电压(对于OP07A最大为25μV)。OP07还具有输入偏置
电流低(OP07A为±2nA)和开环增益高(对于OP07A为300V/mV)的特点,所以OP07特别使用于微弱信号的测量放大
等方面[11]。但是根据芯片数据手册OP07的频带范围主要在1Hz-100kHz是一个工作在低频的芯片,所以不太适合较
高频率的项目。
方案三:使用OPA690,OPA690一般作用于单位增益稳定,电压反馈运放。根据芯片手册OPA690一般应用在
150MHz以上的信号,属于高频芯片,先前只应用在宽带电流反馈的运放。虽然此课题包含一些高频成分,但是对于
OPA690最佳频带范围差距过大。
方案四:使用OPA847,OPA847有着高达2G的频带宽度,有着极低的输入电压和电流,同时仅使用18mA的电源电
流,功耗低,绿色环保。同时输入电压噪声也非常低(0.85nV /√ Hz ),所以综合看来是一款很不错的高频芯片
综上所述,OPA1611开环增益高,压摆率高,主频涉及中高频。OPA847频带范围广,噪声低,是一个性能很佳高
频芯片。所以选择方案一OPA1611芯片作为低频(1Hz—100kHz)部分的放大芯片。选择方案四OPA847芯片作为高频
部分(100kHz—5MHz)的放大芯片。
2.2.5 模拟开关芯片的方案论证
方案一:使用TS12A4515,TS12A4515是一个单路模拟开关,其中高电平断开,低电平导通。可以在2 V和12 V之
间的单电源下连续工作。根据数据手册TS12A4515导通电阻随工作电压变化,在12V的工作电压下导通电阻能达到最
小,对电路基本没有影响。TS12A4515的总谐波失真度(THD)一般稳定在0.004,信号频率高于10KHz后,频率越高
失真度有明显的降低,且随着频率的降低芯片对输入信号的增益(db)降低,对于此题目1Hz-5MHz的频率范围是个
很好的选择。
方案二:使用TS5ATS5A22362DGSR,TS5ATS5A22362DGSR是一个双路模拟开关,两路导通方式相反。最低导通电
阻0.65 ,工作电压在2.3V—5.5V ,且满足此题目要两路模拟开关的需求,能节约成本,减少硬件电路。但是
TS5ATS5A22362DGSR输出信号的失真度低频稳定在0.0037,高频的时候失真度急剧上升。频率越高芯片所带增益越
高,以及内部导通电阻受温度影响很大。所以此芯片是一个适合低频电路的模拟开关。对于此题目1Hz-5MHz的中高
频率范围不是个很好的选择。
方案三:使用TS5A22362,TS5A22362是一个二选一模拟开关,有两路输入,一路输出,高电平和低电平分别选
择输出两路中的一路。工作电压在2.3V-5.5V之间,最低导通电阻在0.65 ,当工作电压在3.3V时电路增益基本为
零,当工作电压在5V时电路增益随信号频率增加大幅度增加,导通电阻随输入信号的幅度大小变化很大,且容易受
温度影响,对于幅度在0.1V—5V,频率在1Hz-5MHz的信号来讲不是最适合。
综上所述,TS12A4515相比其他两款,在要求的频率范围内,TS12A4515导通电阻,失真度,增益等各方面数据
等很好,虽然为单通道需要八个,但是单价低。所以选择方案一。
2.3 系统总体设计
本设计以STM32F429IGIGT6为主制芯片的单片机控制DDS和模拟开关完成各种波形产生。STM32单片机控制AD9854
产生正弦波和AM及PM调制波。低频情况下(1Hz—100kHz),当要求产生正玄波和PM及AM波时,STM32单片机控制模
拟开关一和模拟开关八通路,其他断开,使产生的信号直接进入运算放大器进行幅度控制;当要求产生三角波的时
候,控制模拟开关二、四和八通路,其他断开,使方波进入积分器从而生成三角波,然后再进入运算放大器。当要
求产生方波的时候,控制模拟开关二、三和八通路,其他断开,使正玹波通过比较器变成方波,然后再进入运算放
大器。高频情况下(100kHz—5MHz),当要求产生正玄波和PM及AM波时,STM32单片机控制模拟开关一和模拟开关九
通路,其他断开;当要求产生三角波的时候,控制模拟开关五、七和九通路,其他断开。当要求产生方波的时候,
控制模拟开关五、六和九通路,其他断开。STM32单片机通过程序编写控制AD9854产生正弦波、方波和三角波频率在
1Hz-5MHz,AM和PM调制波频率在100Hz-1KHz。通过调节运算放大器的滑动变阻器使其幅值控制在0.1V—5V之间。
图2.2 系统总体结
3 系统硬件设计
本设计的硬件电路设计包括AD8954模块电路设计、运算放大器电路设计、模拟开关电路设计,积分电路设计,
矩阵键盘电路设计和比较器电路设计。硬件电路设计是整个课题最重要的一关,只要电路设计好,后面就非常轻
松。电路设计主要考察的是我们对模拟电路知识的掌握、对每个模块电路的深入了解和我们日常实验中对设计模拟
电路积累的经验。设计模拟电路我们首先要通过书本和网洛文件了解设计原理和方法,然后通过电路指标计算所需
要的每个电阻和电容等基本器件的大小。本次硬件电路设计采用采用 AltiumDesigner 18进行电路的原理图设计,
主要设计的电路原理图包括AD9854电路、运算放大器电路、积分电路、比较器电路和模拟开关电路。
3.1 Altium Designer软件平台
图3.1 Altium Designer软件平台
Altium Designer改变了板级设计的传统思想,全面集成了SOPC设计实现功能和FPGA设计功能,从而允许工程师
能将系统设计中的FPGA与PCB设计及嵌入式设计集成在一起[12]。此软件主要功能有:高级信号完整性分析、PCB版
制作、电路模拟仿真和原理图设计。
3.2信号产生电路
3.2.1 DDS原理
DDS是从相位出发直接合成所需波形,一个DDS由由相位累加器、加法器、波形存储(ROM)、D/A转换器和低通滤波
器LPF构成[13]。DDS的原理框图如图3.2所示:
图3.2 DDS原理框图
如图3.2所示频率控制字、相位控制子和波形控制字分别由字母K、P和W表示。相位累加器在时钟的控制下以步
长K作累加,输出的N位二进制码与相位控制字P、波形控制字W通过加法器相加后作为波形ROM的地址,对波形ROM进
行寻址,波形ROM输出D位的幅度码S(n)经过D/A转换器变成阶梯波S(t),再经过低通滤波器就可以得到平滑的合成信
号波形[14]。合成的信号波形形状取决于波形ROM中存放的数值,所以用DDS可以产生想要的波形。
3.2.2 AD9854电路设计
本系统信号产生部分由AD9854模块电路产生,再通过外部电路辅助实现对各种波形的产生和幅度的控制。
AD9854的时钟频率为300MHz,按照奎斯特采样定律可以产生150MHz的信号,是一个十分强大的数字频率合成器,片
内自带锁相环用于产生300MHz时钟信号和产生调制波时所需要的载波。片内有2个DAC和高速比较器,两个DAC寄存器
相位预置值相差90度,由此产生正弦波和余弦波,信号通过比较器产生方波。整个芯片需要实现特别多的功能,所
以需要快速刷新AD9854芯片内的频率、幅度和相位控制。所有的功能实现均使用内部的寄存器进行二进制编码控
制,共有39个寄存器,其中频率、幅度和相位寄存器使用100MHz的8位并行接口以达到速度要求减小误差。DDS模块
除AD9833芯片外,其他的外围电路都是些电源转换电路和滤波电路,对AD9854输出的进行调理,以便输出更加完美
的信号。
图3.3 AD9854原理图
3.3 运算放大器电路
3.3.1 运算放大器基本原理
通过输入信号的方式不同,我们可以将放大器分为同向和反向放大器。由于运算放大器的电压增益非常大,数
万倍不止,一个很小的信号通过运算放大器都会成为一个非常大的信号,所以通常将输出端与反相输入端连接,形
成一个负反馈以保证电路的稳定性。运放又有开环回路和闭环回路之分。开环增益非常大容易导致失真,一般不
用,将运算放大器的输出端与反向输入端连接起来,就是闭环负反馈放大器电路,这也是本设计需要用到的运放设
计。闭环负反馈放大器根据信号输入放大器正负端点的不同,又可分为反相放大器与同相放大器两种。反相闭环放
大器如图3.4。输入与输出电压的关系为:
公式(3-1)
同相闭环放大器如图3.5。输出与输入电压的关系为:
公式(3-2)
图3.4 反相闭环放大器
图3.5 同相闭环放大器
3.3.2 运算放大器电路设计
一、低频部分(1Hz—100kHz)运算放大模块主要由OPA1611芯片构成,由于频率很低的时候积分器出来的三角
波幅度很大需要缩小,方波5V电压也需要缩小,频率越高三角波幅度越小需要放大,且需要调节DDS产生的正弦波和
调制波所以此放大器必须满足缩小放大功能,因此采用反向闭环放大器设计。由于放大和缩小的比例相差过大,此
次我采用两阶放大,一阶放大主要用于缩小,二阶放大只用于放大。如图所示U1B作为一阶放大,放大倍数最高为
20k/4k=4倍,但是可以很好进行缩小,U2B为第二阶放大,由于R3的缘故他只能进行放大,最大放大倍数为
(10k+100)/100=101倍,所以整个电路最大放大倍数为404倍。当需要缩小的时候,将第二阶放大倍调为零即R5调为
零,需要放大的时候,先调第一阶放大,如果没有达到目标再调第二阶放大。整个电路两个反向放大所以正负不会
改变,且电路最后加上了大约600KHz的低通,滤除了大部分高频干扰,所以电路总体很实用很稳定。
二、高频部分(100kHz—5MHz)放大模块主要由高频芯片OPA847构成,由于方波需要缩小,三角波需要放大,
正弦波和调制波需要放大缩小,所以需要采用反向闭环放大器设计。由于频率越高,RC电路衰减越大可以到几毫
伏,需要放大几千倍,所以放大和缩小不能用一块芯片进行。因为放大倍数过大,为了电路稳定和波形质量着想,
此次设计缩小部分采用一阶放大,放大部分采用两阶放大,一共三阶放大电路。U1作为一阶放大,R4和R8大小相
近,只能进行缩小,U2作为第二阶放大最高能放大约200倍;U3作为第三阶放大最高放大倍数为1000倍,所以整个电
路放大几千倍没问题。当需要缩小的时候,滑变R5和R7调为零,只需调节R4,当需要放大的时候R4调满,R5和R7联
合调节。C5和R10,C6和R11各自组成的高通滤波器,滤掉了低频和直流干扰,让电路更好的工作
3.4 模拟开关模块设计
模拟开关模块主要使用TS12A4515t芯片,一脚和八脚作为开关两端,七脚作为控制端。为了让此芯片效果更
好,我将控制端的信号输入口增加了一个简单的三极管放大电路,通过此芯片的数据手册得知控制信号越强(不超
过12V)芯片开关反应速度越快,导通电阻越小。
3.5 积分电路模块设计
3.5.1 积分电路原理
输出与输入信号的积分成正比的电路,称为积分电路,积电路可将方波波转换为三角波。如图3.9所示为此电路低频
部分(1Hz—100kHz)使用的基本的积分电路图,电路运算公式为:
公式(3-3)
高频部分(100kHz—5MHz)由于芯片频带限制,到了高频OPA1611的压摆率跟不生,芯片运行过慢,且频率越好
噪声越强,所以高频部分使用RC低通滤波器,基本电路如图3.10,RC低通滤波器由于有电容的原因频率过低电容和
阻抗过大,信号衰减过大,频率高电容阻抗低,衰减低,所以特别适合用于高频电路,截止频率公式为:
公式(3-4)
图3.9 积分电路图电路
图3.10 低通滤波电路
3.5.2 积分电路模块设计
积分电路模块低频部分主要由OPA1611芯片和外围电路组成,高频部分由RC低通滤波组成。如图3.11所示,P1作
为输入端,P2作为输出端,电容C1和电阻R2和OPA1611组成基本的积分电路,根据上一章积分电路简单的介绍,能知
道此电路正常的频带范围内能够产生幅值为5V左右的三角波。由于OPA1611作为放大芯片,不可避免的有失调电压和失调电流等的产生。C1作为电容本身阻止就非常大,特别在低频,该芯片的失调电压通过即使只有一点点都会被放
大成一个很大的直流信号干扰电路,所以加上R1负反馈回一部分电流,从而减小失调电流和电压的影响,达到更好
的效果。如图3.12所示为RC电路,滤波器阶数越高波形转换越好但是相应的衰减越厉害。综合考虑和实验选择一阶
滤波。截止频率大约为
图3.11 积分电路模块
图3.12 RC低通滤波电路
3.6 比较器模块设计
3.6.1 比较器基本原理
比较器就是对两个数据进行比较,对不同结果有不同输出电压的叫做比较器。比较器两端输入模拟信号进行比
较,输出结果是零或者一的数字信号,也就是方波信号。比较器一般可分为滞回比较器和过零电压比较器。此次课
题使用的就是过零电压比较器模型,不过改变了了他的阈值电压,使输出方波占空比可调。如图3.13是一个简单的
运放芯片,在比较器电路中,V1和V2两路电压相比,如果V1大于V2则Vout输出一个高电平,由于运放内部的设计,
这个高电平需要外接,为了方便一般接在Vcc上。V1和V2两路电压相比,如果V1小于V2则Vout输出一个低电平,这个
低电平和运放的负电压一样,不需要外接。此次设计将AD9854产生的正玹波输入V1,V2外接5V电压加上滑动变阻器
分压就可以实现输出占空比可调的方波。
3.6.2 比较器电路设计
比较器电路模块低频部分由OPA1611和外围电路组成,高频部分由OPA847和外围电路组成。外围电路一样,只是
芯片不同。如图3.14所示P3作为输入口输入正弦波信号,P4作为输出口输出方波,R5和R6作为分压电阻,通过调节
R5控制输入比较器的基准电压,以达到控制方波占空比。电源采用正负五伏电源,输出端口与+5V相接,所以比较器
输出的高电平为+5V,低电平为-5V。最后电路输出的是正负五伏的方波,加上了R8和R9作为输出电压分压电路,让
输出电压大小为1V。根据不同实际情况,电阻大小可能会改变。R7就是为了减小电流,防止输入芯片的电流过大而
发生故障。
3.7 矩阵键盘电路设计
此设计需要实现的功能较多,使用独立键盘难以达到目标,所以使用按键较多的矩阵键盘。矩阵键盘采用8个IO
口控制电路,一共有着四行四列16个按键,如图3.16矩阵键盘电路图所示。原理和独立键盘基本一样,就是逐列扫
描和逐行扫描,然后判断键盘位置。本次设计需要波形转换按键,频率控制按键,所以我设计S1、S2、S3按键分别
为方波、正弦波和三角波产生按键,S4和S5分别为这三种基本波形的频率加和频率减按键(1Hz—5MHz内)。S6,S7
为AM和PM启动按键,S9,S10控制调制波频率(100Hz—1kHz内),S11,S12控制载波频率(1MHz—5MHz内)。。
4 系统程序
本系统由STM32F429IGT6单片机作为程序控制系统,通过keil5软件编程平台实现对单片机的控制。通过芯片
GPIO口进行对AD9854模块的控制,使其产生正弦波和AM、PM调制波。然后使用矩阵键盘控制GPIO口的高低电平的转
换实现对模拟开关的控制,由模拟开关决定通过比较器还是积分器还是直接通过放大器调理,通过不同的器件最后
产生不同的波形。最后通过键盘控制频率在范围内变动。
4.1 Keil开发平台介绍
图4.1 Keil开发平台
Keil又分为Keil C51和Keil MDK。Keil MDK是专门对ARM芯片的编程工具,Keil MDK软件有强大的库函数和集成
调试工具,全在windows环境下运行,无论是对于初学者上手学32单片机还是工作人员进行项目开发都是不二选择
的。Keil MDK使用C语言编程。很多代码逻辑清晰,通俗易懂。这在开发大型软件上很有优势。
4.2 系统主程序
主程序首先就是对系统各个需要用程序控制的硬件模块的初始化,这些包括液晶显示初始化、滴答定时器初始
化、键盘初始化、模拟开关初始化以及AD9854初始化。当初始化完成后,接着就通过键盘控制正弦波、方波、三角
波和AM、PM我种波形的产生,最后又通过键盘控制频率的变化。主程序流程图如下
图4.2 主程序流程图
4.3 系统子程序
4.3.1 AD9854控制程序
此次课题信号发生部分采用AD8954产生,需要AD9854产生AM、FM调制波和正玹波。通过程序编写进寄存器我们
想要的波形数据,当系统时钟到来时,相位累加器在波形存储器中查找对应波形的幅值表,然后经进行D/A转换得到
模拟的梯形波,最终通过低通滤波器让波形平滑输出,得到数字合成信号。程序流程图如4.3.3所示。首先对AD9854
初始化,然后在AD9854并行口写入数据;设置想要的波形数据,然后往AD9854芯片中下载好程序,信号就可以输
出,最后通过频率寄存器控制波形的频率。主要程序如下:
HAL_GPIO_WritePin(ADDR_PORT[i],ADDR_PIN[i],(GPIO_PinState)(addr_buf&0x01)); //写入频率地址
addr_buf >>= 1;
HAL_GPIO_WritePin(DATA_PORT[i],DATA_PIN[i],(GPIO_PinState)(data_buf&0x01)); //写入频率数值
data_buf >>= 1;
AD9854_WR_Clr; //更新时钟
AD9854_WR_Set;
16
FTW = (Frequency × 96)/SYSCLK //频率转换,Frequency为输入频率,SYSCLK为系统时钟频率.
4.3.2液晶显示
液晶显示是将波形的基本情况显示在液晶屏幕上,包括波形类型和频率等。首先对液晶进行初始化,设置好背
景颜色、画笔颜色、字的坐标等;写好每一页的不同的字,做好翻页程序。然后按下按键,单片机检测到按下的低
电平就会执行相应的功能,实现波形变换和频率变化。主要程序如下:
LCD_Fill(0,40,800,370,WHITE); //翻页清屏函数,
Show_Str(350,150,800,350,“方波输出”,32,1); //显示波形种类
sprintf(buff,“%f”,FreqTemp/10.0); //将频率数字转化成一个个字符
Show_Str(350,300,800,480,buff,32,0); //每个数位逐一显示出
4.3.3模拟开关程序
模拟开关是通过开和关特性完成线路信号不同走向,从而转换出各个波形。本次使用了四块ts12a4515模拟开
关,通过按键控制单片机IO口产生高低电平来控制开和关,不同模拟开关的开和端能够产生不同波形,其中,模拟
开关一接通其他断开,能产生正玹波和AM和PM调制波,模拟开关二、三接通其他断开,能产生方波,模拟开关二、
四接通其他断开,能产生三角波。主要程序如下:
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); //模拟开关端口配置,推挽式输出,使上拉电压非常高为3.3V
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
//模拟开关功能函数,端口输出低电压。
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
//模拟开关功能函数,端口输出高电压。
程序流程图如下:
5 仿真测试
仿真测试是电路设计必不可少的一个环节,我们更据理论设计的电路实际使用仿真的时候,电路效果可能还会
受芯片制造指数所影响,所以还是要仿真的时候,根据仿真情况稍微改动电路参数。此次仿真测试包括运算放大器
模块(电压调理)、积分电路模块和比较器电路模块仿真测试。运算放大器模块主要看最高最低能将多大的电压控
制到0.1V—5V,积分电路模块主要看能否完好无损的将方波转换为三角波,且输出电压是否在放大器调理范围内,
比较器电路主要看正弦波能够完好无损的转换为方波,并且方波幅度是否正确以及占空比是否可调。此次仿真测试
使用multisim 14软件进行电路测试,主要测试的电路有运算放大电路,积分电路和比较器电路。
5.1 multisim软件平台介绍
图5.1 multisim软件平台
Multisim包含了电路原理图的图形输入、电路硬件描述语言输入方式,具有丰富的仿真分析能力[15]。可以将
虚拟信号通过计算机输入到硬件电路中,可以将硬件电路产生的信号输入到计算机进行分析,是一个很方便实用的
仿真测试工具。Multisim能进行基本器件建模的仿真、电路构成的仿真、系统组成的仿真和仪器仪表的原理的仿
真。目前Multisim最新版本是Multisim 14。
5.2 运算放大模块测试
运算放大器模块由OPA1611和OPA847芯片为主的放大电路,由于Multisim 14版本中没有OPA1611芯片,所以用
OPA1612代替,且用函数信号发生器代替DDS信号发生器,此次放大电路将低频部分(1Hz—100kHz)和高频部分
(100kHz—5MHz),低频通过OPA1612芯片放大调理,高频通过OPA847芯片放大调理。此次仿真主要看1Hz—5MHz内
的波形能不能在0.1V-5V内自由变换,并且波形失真畸变程度。所以只需要用函数信号发生器发射1Hz—100kHz的信
号到OPA1612电路,发射100KHz-5MHz的信号到OPA847电路,通过发射不同波形不同幅度的信号,输出端用示波器观
看能不能通过电路将幅度控制到0.1V-5V内。
图5.2 OPA1612芯片放大电路仿真图
图5.3 OP847芯片放大电路仿真图
数据频率
10Hz 100Hz 1kHz 10kHz 100kHz 1MHz 5MHz
最小控制电压 12mV 12mV 12mV 12mV 2mV 2mV 2mV
最大控制电压 9V 9V 8V 8V 5V 5V 5V
失真畸变成度 完好无损 完好无损 完好无损 完好无损 完好无损 完好无损 完好无损
表5.1 不同频率下的放大波形数据
放大器通过将低频和高频部分分开,低频使用OPA1611,高频部分使用OPA847能够很好的完成放大工作。最小能
将10mV左右的电压控制在0.1V—5V,最大能将8V左右的电压控制在0.1V—5V,实现目标。
5.3 比较器模块测试
比较器模块由OPA1611和OPA847芯片为主的比较电路,同样用OPA1612进行仿真,用函数信号发生器代替DDS发出
1Hz—5MHz的正玹波信号,其中1Hz–100kHz通过OPA1611芯片电路,100KHz–5MHz通过OPA847芯片电路。然后在输出
端观察通过比较电路出来的方波信号,主要观察方波的低电平和高电平是否正确,波形失真畸变程度。然后调节滑
动变阻器改变比较的阈值电压,观察方波占空比是否能变化
表5.2 不同频率下的方波波形数据
数据频率
10Hz 100Hz 1kHz 10kHz 100kHz 1MHz 5MHz
失真畸变成度 少量畸变 完好无损 完好无损 完好无损 完好无损 完好无损 完好无损
高电平 5V 5V 5V 5V 4.7V 4.7V 4.7V
低电平 -5V -5V -5V -5V -4.7V -4.7V -4.7V
占空比最高 50% 50% 50% 50% 50% 50% 50%
占空比最低 10% 10% 10% 10% 10% 10% 10%
将正玹波转化成方波通过低频部分(1Hz—100kHz)使用OPA1611,高频部分(100k—5MHz)使用OPA847芯片的
方法,基本能实现目标,其中100Hz以下因为芯片自身原因存在着少量畸变但是在实际应用中还是可以使用。低频部
分高低电平5V和-5V实现目标,高频部分高低电平4.7V和-4.7V虽然差了一点,但是可以通过调节分压电阻大小将电
压大小控制在1V。所以实现1Hz—5MHz的方波生成。
5.4 积分电路模块测试
比较器积分电路由OPA1611芯片电路组成的积分电路和RC低通滤波器构成。其中1Hz—100kHz低频部分使用
OPA1611电路,100kHz—5MHz高频部分直接使用RC低通滤波器。同样使用函数信号发生器代替DDS,由函数信号发生
器产生1Hz—5MHz信号,其中不同频段通过各自的积分电路,输出端用示波器观察输出信号的畸变程度、失真情况以
及幅度大小。为了仿真方便高频部分直接使用比较器电路加上RC电路仿真。
数据频率
10Hz 100Hz 800Hz 10kHz 100kHz 1MHz 5MHz
失真畸变成度 严重失真 严重失真 少量失真 完好无损 完好无损 完好无损 少量畸变
变化后电压 14V 14V 1V 1V 200mV 22mV 5mV
表5.3 不同频率下三角波波形数据
将正弦波转化成方波通过低频部分(1Hz—100kHz)使用OPA1611,高频部分(100k—5MHz)使用低通滤波的方
法,基本能实现目标,因为电路要求频带很宽,OPA1611作为中频芯片,电路的各方面参数都是为了满足主要频率而
设计,所以在800Hz以下电路出现严重失真没有达到要求,所以能产生800Hz—5MHz的三角波,且变化后伏值都在1V
以下,在放大器的调节范围类。基本实现目标。
6 系统调试及误差分析
6.1 调试步骤
调试是本设计也是每个硬件系统设计最重要,最后一步。在完成了前面几章所有过程以及搭建完电路后就可以
进行调试。调试最基本的需要示波器一台,函数信号发生器一台以及万用表一个,基本步骤如下:
(1)用万用表检查各个线路是否焊好以免出现短路现象,如果短路立即线路到好为止。
(2)用函数信号发生器调试积分电路、比较器电路和运算放大器电路,观察能否正常实现电路功能。
(3)用STM32F429IGT6控制AD9854调试程序,观察DDS能否正常出波形及用示波器探测到的频率和液晶显示是否
一样,波形能否正常进行波形转换。
(4)前面三步都完成过后将整个电路集联观察五种波形是否能正常产生,波形的失真畸变情况以及能否达到目
标要求。
6.2 正弦波调试结果
正弦波调试只需控制AD9854产生1Hz—5MHz的正弦波,然后控制模拟开关使之进入运算放大器,最后观察波形情
况即可。如图6.1和图6.2为系统产生的正弦波。调试结果如表6.1所示。
图6.1 0.1V正弦波调试图
图6.2 5V正弦波调试图
表6.1 正弦波调试结果
数据
频率
10Hz 100Hz 1kHz 10kHz 100kHz 1MHz 5MHz
能否到0.1V 能 能 能 能 能 能 能
能否到5V 能 能 能 能 能 能 能
失真畸变成度 完好无损 完好无损 完好无损 完好无损 完好无损 完好无损 完好无损
调试结果很好,1Hz—5MHz都能将正弦波电压完好无损的控制在0.1V—5V,达到预期目标。
6.3 方波调试结果
方波调试只需要控制DDS产生的正弦波通过比较器就能转换成方波,如图6.3和图6.4为系统产生的方波,调试结果如
表6.2所示。
25
图6.3 0.1V方波调试图
图6.4 5V方波调试图
表6.2方波调试结果
数据
频率
10Hz 1kHz 5kHz 10kHz 100kHz 1MHz 5MHz
能否到0.1V 能 能 能 能 能 能 能
能否到5V 能 能 能 能 能 能 能
失真畸变成度 严重畸变 较大畸变 少量畸变 完好无损 完好无损 完好无损 完好无损
占空比最高 50% 50% 50% 50% 50% 50% 50%
占空比最低 10% 10% 10% 10% 10% 10% 10%
测试结果和预期目标有所差距,这是一些芯片本身因素和有些地方电路焊接效果不好造成,基本达到预期要求。
6.4 三角波调试结果
调试三角波需要控制系统产生的方波进入积分电路和RC低通滤波电路,低频部分通过积分电路,高频部分通过
RC电路。如图6.5和图6.6是系统产生的三角波,调试结果如表6.3。
图6.5 0.1V三角波调试图
图6.6 5V三角波调试图
表6.3三角波调试结果
数据
频率
10Hz 1kHz 7kHz 50kHz 300kHz 3MHz 5MHz
能否到0.1V 不能 不能 能 能 能 能 能
能否到5V 不能 不能 能 能 能 能 能
失真畸变成度 严重失真 严重失真 少量失真 完好无损 完好无损 严重畸变 严重畸变
由于低频部分(1Hz—100kHz)频率范围较宽,由上文提到的受OPA1611自生因素影响,7kHz以下三角波转换幅
度过大造成失真,且不在放大器最大调理幅值内;高频部分(1Hz—100kHz)由于使用RC低通滤波器,3MHz后信号衰
减过大到几毫伏,导致芯片噪声占信号主要部分,再加上信号弱受环境因素等影响,所以放大出来波形面目全非,
需要外接无源低通滤波器滤除噪声或放大电路的反馈电阻上接电容减小震荡。
附录
A1.1 实物图
。`A1.2 AD9854应用程序
//方波输出函数
void AD9854_SetSine(uint32_t Freq,uint16_t Shape)
{
uint8_t count;
uint8_t Adress;
Adress = 0x04;
Freq_convert(Freq); //频率转换
for(count=6;count>0;)
AD9854_WR_Byte(Adress++,FreqWord[--count]);
AD9854_WR_Byte(0x21,(Shape>>8) & 0x00FF); AD9854_WR_Byte(0x22,(Shape&0x00ff));
AD9854_WR_Byte(0x23,(Shape>>8) & 0x00FF);
AD9854_WR_Byte(0x24,(Shape&0x00ff));
AD9854_UDCLK_Set; //更新AD9854输出
ad9854_delay(400);
AD9854_UDCLK_Clr;
}
//函数功能:AD9854的FM初始化
void AD9854_InitFM(void)
{
AD9854_WR_Byte(0x1d,0x10); // 关闭比较器
AD9854_WR_Byte(0x1e,CLK_Set); // 设置系统时钟倍频
AD9854_WR_Byte(0x20,0x60); // 设置为可调节幅度,
}
//函数功能:AD9854的FM输出函数
void AD9854_SetFM(u32 Freq1,u32 Freq2)
29
{
u8 count=6;
u8 Adress1,Adress2;
const u16 Shape=4000;
Adress1=0x04; // 选择频率控制字1地址的初值
Adress2=0x0a; // 选择频率控制字2地址的初值
Freq_convert(Freq1);
for(count=6;count>0;) // 写入6字节的频率控制字
AD9854_WR_Byte(Adress1++,FreqWord[--count]);
Freq_convert(Freq2);
for(count=6;count>0;) // 写入6字节的频率控制字
AD9854_WR_Byte(Adress2++,FreqWord[--count]);
AD9854_WR_Byte(0x21,Shape>>8); AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
AD9854_WR_Byte(0x23,Shape>>8); AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
}
//AM波初始化
void AD9854_InitAM(void)
{
AD9854_WR_Byte(0x1d,0x10); // 关闭比较器
AD9854_WR_Byte(0x1e,CLK_Set); AD9854_WR_Byte(0x1f,0x01);
AD9854_WR_Byte(0x20,0x60); // 设置为可调节幅度
}
//函数功能:AD9854的AM输出函数
void AD9854_SetAM(u32 Freq,u16 Shape)
{
u8 count;
u32 Freq=60000; //设置载频
u8 Adress;
Adress=0x04;
Freq_convert(Freq);
for(count=6;count>0;) // 写入6字节的频率控制字
AD9854_WR_Byte(Adress++,FreqWord[--count]);
AD9854_WR_Byte(0x21,Shape>>8);
AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
AD9854_WR_Byte(0x23,Shape>>8); AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
}
A1.3 中断控制程序
void SysTick_Handler(void)
{
HAL_IncTick(); //HAL_Delay函数需要在中断里调用此函数
if(++KeyCou==50)
{
KeyCou=0;
KeyScan();
if(Trg==0x01) //方波输出
{
n=1;
30
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
AD9854_SetSine(FreqTemp, AmpTemp);
}
else if(Trg==0x02) //正弦波输出
{
n=2;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
AD9854_SetSine(FreqTemp, AmpTemp);
}
else if(Trg==0x04) //三角波输出
{
n=3;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
AD9854_SetSine(FreqTemp, AmpTemp);
}
else if(Trg==0x12) //AM波输出
{
n=4;
AD9854_InitAM();
am_test(tiaozhi,100); //am_test(调制波频率,调制度设置)
AD9854_SetAM(zaiFreque,AmpTemp);
}
else if(Trg==0x14) //FM波输出
{
n=5;
AD9854_InitFM();
31
AD9854_SetFM(tiaozhi,zaiFreque);
}
else {;}
}
}
//矩阵键盘驱动程序
void KeyScan(void)
{
//切换端口为行线输入,列线输出,先对列线清0
IOToggle = 0 ;
GPIO_Keyboard_Configuration();
GPIOH -> ODR &= 0x0fff; // 列线输出全0
//GPIO_Write(GPIOC,0x0fff); delay_us (2); //必须加上延时,否则无法正确读出键值
KeyValue = GPIO_ReadInputData(GPIOC); // 读取PC端口状态
KeyValue = GPIOH -> IDR;
KeyInit =(uchar) ((KeyValue & 0x0f00)>>8);
//下面是算法,相当于消除按键抖动
ReadData1=KeyInit^0x0f;
Trg1=ReadData1&(ReadData1^Cont1); // 触发键
Cont1=ReadData1; // 长按键
//行线输出全0读列线
GPIO_Keyboard_Configuration();
GPIOH -> ODR &= 0xf0ff; // 行线输出全0
//GPIO_Write(GPIOC,0xf0ff); delay_us (2);
KeyValue = GPIOH -> IDR;
KeyInit =(uchar) ((KeyValue & 0xf000)>>8);
//下面是算法,相当于消除按键抖动
ReadData2=KeyInit^0xf0;
Trg2=ReadData2&(ReadData2^Cont2); // 触发键
Cont2=ReadData2; // 长按键
Trg=Trg1|Trg2;
}
总结
通过12周四个月的时间终于完成了本课题的设计,从刚开始的选择方案,再到了解每个模块的理论知识,最后
再自己设计电路仿真测试。每一个环节都是对我们所学知识掌握程度的考验,同时也是一个很大的锻炼我们能力的
机会,整个过程下来我学到了很多。
刚拿到题目的时候很开心,因为是自己熟悉喜欢的模拟电路和嵌入式组成的电子系统。前四周都是完成开题相
关资料及文献查阅,复习模电等知识,简单总结和初步拟定方案进行仿真验证可行性,都是研究理论的可行性。后
面两周就是修改电路,根据设计指标对电路参数进行相应的调整以满足电路要求。在后面的时间里都是在老师的指
导下完成论文的编写,在这过程中会涉及到电路仿真和原理图的绘制,如果仿真过程中出现新问题还要计时修改电
路。开始的时候我们让AD9854产生正弦波、方波和AM、PM调制波,然后让正弦波通过积分电路生成三角波,左后都
经过一个OPA1611运算放大器进行调理伏值,是其幅度在0.1V—5V之间,波形的转换通过单片机控制模拟开关实现其
功能。但是做到后面发现AD9854不能产生高频方波,1Hz—5MHz的OPA1611放大器100KHz以上的时候放大方波,方
波就会出现畸变,查资料才发现,方波相比于正弦波和三角,所要求的芯片压摆率要更大,明显是芯片压摆率跟不
上,并且芯片所涉及到的频带宽度过宽,低频和高频的时候芯片的信噪比,失调电压和增益等芯片指数会明显的不
同,但是我们设计电路的参数只能考虑一部分频带,所以OPA1611不能直接做低频和高频两部分。最后我选择低频
(1Hz—100kHz)部分用OPA1611做,高频部分(100kHz—5MHz)用高频芯片OPA847做。通过仿真和调试能很好的
完成电路指标。
通过这次毕业设计让我明白了芯片的选型和电路方案的选择对于硬件电路至关重要,以前差不多都是老师拿方
案,我们没有体会过这一点的重要性,这次毕业设计增强了自己解决问题的能力。
作者:QQ1694456187