基于STM32的信号发生器设计.docx
《基于STM32的信号发生器设计.docx》由会员分享,可在线阅读,更多相关《基于STM32的信号发生器设计.docx(20页珍藏版)》请在冰豆网上搜索。
基于STM32的信号发生器设计
基于STM32的信号发生器设计
【摘要】本系统以单片机STM32F107为操纵核心,通过按键输入所需波形参数的数字量,然后由STM32F107自带的DA把数字量转换成模拟量来调整波形的幅值、频率及方波的占空比;电压步进100mV,频率步进50Hz,方波占空比可调;按键应用的是独立按键,用来切换波形、时钟,幅值,频率和占空比;其频率的调解确实是调剂其中断距离的时刻,幅值确实是调剂其数字的大小;为了波形的合成,采纳的点的个数都是128个;显示部份采纳TFT液晶,实时显示其波形名称,幅值、频率和占空比参数转变。
关键字:
信号发生器设计;三相;STM32;DA转换
前言
信号发生器作为一种历史悠长的测量仪器,早在20年代电子设备刚显现时就产生了。
随着通信和雷达技术的进展,40年代显现了要紧用于测试各类接收机的标准信号发生器,使得信号发生器从定性分析的测试仪器进展成定量分析的测量仪器。
同时还显现了可用来测量脉冲电路或作脉冲调制器的脉冲信号发生器。
自60年代以来信号发生器有了迅速的进展,显现了函数发生器。
那个时期的信号发生器多采纳模拟电子技术,由分立元件或模拟集成电路组成,其电路结构复杂,且仅能产生正弦波、方波、锯齿波和三角波等几种简单波形。
自从70年代微处置器显现以后,利用微处置器、模数转换器和数模转换器,硬件和软件使信号发生器的功能扩大,产生比较复杂的波形。
这时期的信号发生器多以软件为主,实质是采纳微处置器对D/A的程序操纵,就能够够取得各类简单的波形。
在80年代以后,数字技术日趋成熟,信号发生器绝大部份再也不利用机械驱动而采纳数字电路,从一个频率基准有数字合成电路产生可变频率信号。
90年代末显现了集中真正高性能的函数信号发生器,HP公司推出了型号为HP770S的信号模拟装置系统,它是由HP8770A任意波形数字化和HP1770A波形发生软件组成。
信号发生器技术进展至今,引导技术潮流的仍是国外的几大仪器公司,如日本横河、Agilent、Tektronix等。
美国的FLUKE公司的FLUKE-25型函数发生器是现有的测试仪器中最具多样性功能的几种仪器之一,它和频率计数器组合在一路,在任何条件下都能够给出很高的波形质量,能给出低失真的正弦波和三角波,还能给出过冲很小的快沿方波,其最高频率可达到5MHz,最大输出幅度可达到10Vpp。
国内也有很多公司已经有了类似的仪器。
如南京盛普仪器科技的SPF120DDS信号发生器,华高仪器生产的HG1600H型数字合成函数\任意波形信号发生器。
国内信号发生器起步晚,但进展至今,已经渐渐跟上国际的脚步,能够利用高新技术开发出达到国际水平的高性能多功能信号发生器。
信号发生器在生产实践和科技领域中有着普遍的应用,各类波形曲线都可用三角函数方程式来表达。
函数信号发生器是各类测试和实验进程中不可缺少的工具,在通信、测量、雷达、操纵教学等领域应用十分普遍。
不论是在生产、科研仍是在教学上,信号发生器都是电子工程师信号仿真实验的最正确工具。
而且,信号发生器的设计方式多,设计技术也愈来愈先进,随着我国经济和科技的进展,对对应的测试仪器和测试手腕也提出了更高的要求,信号发生器已成为测试仪器中相当重要的一类,因此,开发信号发生器具有重大意义。
1设计任务
1.1波形发生器系统的设计指标
设计完成一个频率振幅可调的正弦波、方波和三角波信号发生器。
大体要求
(1)依照ADC的值(8位)来设定输出信号的幅值,幅值范围0-3.3V,设定的幅值显示在LCD上。
(2)输出信号的频率范围为100Hz-1KHz,128个点。
(3)可通过按键或触摸笔切换输出信号类型。
2设计方案
2.1信号产生部份
方案一:
采纳模拟分立元件或单片压控函数发生器,能够产生正弦波、方波、三角波,通过调整外部元件能够改变输出频率,但采纳模拟元器件由于元件分散性太大,因此产生频率稳固性较差,精度低,地抗干扰能力低,本钱高,而且灵活心性较差,不能实现任意波形和波形运算输出等智能化的功能。
方案二:
利用集成函数发生器芯片ICL8038。
芯片ICL8032能输出方波、三角波、正弦波和锯齿波四种不同的波形,将他作为信号发生器。
它是电压操纵频率的集成芯片,失真度很低。
可输入不同的外部电压来实现不同的频率输出。
为了达到数控的目的,可用高度的DAC来输出电压以操纵正弦波的频率。
方案三:
采纳锁相式频率合成方案,锁相式频率合成一个高稳固度和精准度的大量离散技术,他在必然程度上解决了既要频率稳固精准又要频率在较大的范围内可调的矛盾,可是频率受VCO可便频率范围的阻碍,高低频率比不可能做的很高,而且只能产生正弦波或方波。
方案四:
直接数字频率合成技术(DDS)。
DDS是一种纯数字化方式。
它现将所需正弦波一个周期的离散样点的幅值数字量存入ROM中,然后按必然的地址距离读出,并经DA转换器形成模拟正弦波,再经低通滤波器取得质量较好的信号。
方案五:
利用函数将波形的点数据保留在芯片的RAM中,依照所要的波形的频率计算出它的周期,经计算取得在按时器定不时刻固定的前提下产生一个完整的波形所需要的输出的点数,如此数据指针能够依照点数的数量来进行移动,取得频率准确、切换快速的信号。
VCO不能实现稳固频率信号的输出而且难于数字操纵。
而且电容、电阻参数随温度等其他因素的阻碍,频率稳固度和电路的稳固度都较低,实现也比较复杂,不予采纳。
尽管ICL8038可专门好的实现频率输出的操纵,但查看ICL8038的设计资料可知频率输出范闹为0.01Hz~1kHz不能达到题目的要求,故不予选用。
PLL方案和DDS方案都能实现100Hz~1KHz的稳固的信号输出,.且能达到较小的频率步进,可是PLL的动态特性却很差,在频率改变时,环路从小稳固到稳固的进程有时刻问延迟。
相较较而言,DDS的频率输出范围一样低于PLL,且杂散也大于PLL方案,但DDS信号源具有输出频率稳固度高、精度更高、分辨率更高且易于程控等优势,且频率改变不存在失调进程,尽管有杂散干扰,只需在输出级加滤波器仍能够取得质量专门好的波形。
而方案五集中了上述四个方案的各个优势,因此采纳方案五来实现波形信号的产生。
2.2幅度进行调整部份
方案一:
用高速模拟乘法器实现
采纳AD835高速模拟乘法器,来实现模拟调制。
模拟乘法器AD835的-3dB截止频率为250MHz,能够知足题日的要求。
可是AD835的差分输入范围仅为±1V,因此必需对输入信号进行预处置,如此在增加硬件的同时,又加大了设计的难度。
方案二:
采纳高速的D/A转换器
在STM32f107中集成着一个高速的D/A转换器,咱们能够直接在软件中设置一个幅度的参数来改变输出波形的幅度大小。
综上所述,采纳方案二,尽管增加了软件的难度,延迟了波形的输出时问,可是能够不用外加硬件拓展,节省了本钱。
2.3对频率调整部份
方案一:
通过在存储芯片ROM中保留不同频率信号的信号发生点数,在频率切换时挪用ROM中所存储的不同点数模块来实现频率的切换。
方案二:
在存储芯片RAM中保留由软件实时产生的波形点数,通过所取的点数的不同来决定发生的波形的频率。
由于设计中的信号要进行不断的改变,因此波形的数据不能存储在ROM中,应该存储RAM中,因此采纳方案二的设计方式。
3系统整体设计
3.1系统总框图
如图1所示为系统总框图。
图1系统总框图
3.2各模块功能
3.2.1波形产生电路
通过软件将波形数据存储到RAM当中去,再把这些数据输送到D/A转换器进行转换取得模拟波形。
3.2.2按键部份
用STM32F107开发板上自身带有的键盘取得键值,通过中断效劳程序将键值信息传给操纵芯片。
3.2.3显示部份
波形直接在示波器上显示,波形的中间调试参数在液晶屏上显示。
液晶原题图如图2所示。
图2液晶原题图
DAC转换器
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。
DAC能够配置为8位或12位模式,也能够与DMA操纵器配合利用。
DAC工作在12位模式时,数据能够设置成左对齐或右对齐。
DAC模块有2个输出通道,每一个通道都有单独的转换器。
在双DAC模式下,2个通道能够独立地进行转换,也能够同时进行转换并同步地更新2个通道的输出。
DAC能够通过引脚输入参考电压VREF+以取得更精准的转换结果。
DAC要紧特点
●2个DAC转换器:
每一个转换器对应1个输出通道
●8位或12位单调输出
●12位模式下数据左对齐或右对齐
●同步更新功能
●噪声波形生成
●三角波形生成
●双DAC通道同时或别离转换
●每一个通道都有DMA功能
●外部触发转换
●输入参考电压VREF+
DAC输出电压:
数字输入通过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。
任一DAC通道引脚上的输出电压知足下面的关系:
DAC输出=VREFx(DOR/4095)
单个DAC通道的框图如以下图3所示。
图3单个DAC通道的框图
4各个模块的实现及分析
4.1正弦波的产生
本设计中信号的产生直接用STM32F107芯片上集成的D/A转换器和软件的结合来生成。
波形的信号数据采纳了函数计算的方式来取得:
Y=sin(N)(4-1)
其中,N表示所要取得的点数的多少。
在设计中我选择N=128,即一个完整的大体的正弦信号有128个数据信号点组成。
将数据存储到操纵芯片STM32F107的RAM当中,依照所要的频率来取得信号数据的多少,点数多少的计算如下:
N=T/2t(4-2)
其中,N表示点数,T表示所要产生的波形信号的周期,t表示按时器的时问长短,从RAM中取得点数的距离为:
M=128/N(4-3)
其中M表示在RAM中的表格取得点数的距离,依照不同的距离的大小决定产生一个完整的波形信号所要的数据多少不同。
设计中要求信号的最高产生的频率为1KHZ,依照条奎斯特定理,采样的频率最少要为所要信号的频率的两倍,可是为了更好的保证信号的完整输出,咱们至少要让它采样10个点才能输出完整波形,就要求采样的频率为他的10倍即10KHZ.采样时刻的大小为100us。
4.2三角波的产生
在设计中,三角波的产生就直接利用按时器定不时刻的长短来操纵信号数据的输出,信号数据从一个较低(或高)的位置开始依照必然的规律步进,当其达到一个高度时再依照相同的步进下降到原先的数据大小,如此反复的输出就组成了三角波模拟信号的输出。
4.3方波的产生
在设计中,方波的产生由大小不同的两个信号数据交替输出形成,每一个信号数据输出的时刻长短依照所要点信号频率来决定。
4.4幅度的操纵
在设计中,为了能使波形在示波器中显示,如此就要设定好波形的幅度,在设计时我把波形的幅度操纵在128之内,才能专门好的显示波形。
同时为了改变幅度的大小,我设置了一个参数直接与所取得的信号数据相乘,这就改变了信号数据的大小,也就使得D/A转换时的数据大小产生转变,从而体此刻输出的信号波形在幅度上发生改变。
4.5频率的操纵
在输出的信号数据的时刻距离一按时,当产生一个完整波形时所需要的点数发生转变时信号的周期就发生转变,如此它的频率就相应的转变。
因此,在设计中,通过固定按时器的按时长短,改变波形数据的点数多少就改变了信号的频率。
4.6按键模块
按键是直接与STM32F107芯片的PC4、PB10、PC13、PA0连接,通过ARM芯片对引脚输入数据,0表示有效,l表示无效。
键l用来选择输出波形,键2用来改变波的幅值,键3用来改变波形的频率,键4用来改变方波的占空比。
按键原理图如图4所示。
图4按键原理图
4.7RTC的设置
RTC(Real-timeclock)是实不时钟的意思。
神舟IV号开发板的处置器STM32F107集成了RTC(Real-timeclock)实不时钟,在处置器复位或系统掉电但有实不时钟电池的情形下,能维持系统当前的时刻和日期的准确性。
实不时钟是一个独立的按时器。
RTC实不时钟模块拥有一组持续计数的计数器,在相应软件配置下,可提供时钟日历的功能。
修改计数器的值能够从头设置系统当前的时刻和日期。
RTC由两个要紧部份组成。
第一部份(APB1接口),用来和APB1总线相连。
此单元还包括一组16位寄放器,可通过APBI总线对其进行读写操作APBI接口由APB1总线时钟驱动,用来与APBI总线接口。
另一部份(RTC核心)由一组可编程计数器组成,分成两个要紧模块。
第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时刻基准TR_CLK。
RTC的预分频模块包括了一个20位的可编程分频器(RTC预分频器)。
若是在RTC_CR寄放器中设置了相应的许诺位,那么在每一个TRCLK周期中RTC产生一个中断(秒中断)。
第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时刻。
系统时刻按TRCLK周期累加并与存储在RTCALR寄放器中的可编程时刻相较较,若是RTC_CR操纵寄放器中设置了相应许诺位,比较匹配时将产生一个闹钟中断。
图5为简化的RTC框图。
图5简化的RTC框图
5软件设计
本系统的软件设计采纳C语言,对ARM7进行编程实现各项功能。
采纳KEIL软件编写,能够实现波形的切换、幅度频率的调剂和方波的占空比调剂、液晶显示等功能。
主程序要紧起到一个导向和决策功能,决定何时系统采取何种动作。
其余各类功能的实现要紧通过具体的子程序来完成。
系统总流程图如图6所示。
图6系统总流程图
6调试部份
操纵电路的调试
对操纵电路进行时序仿真,在仿真图中几乎总会显现咱们所不需要的毛刺,这些毛刺有时会给系统带来致命的阻碍,咱们必需采取方法排除如此的毛刺。
由于毛刺一样出此刻信号发生电平转换的时刻,也即输出信号的成立时刻内,而在输出信号的维持时刻内不大会显现。
因此,假设带有毛刺的信号持续时刻较长,咱们可在输出信号的持续时刻内用必然宽度的高电平脉冲选通一个与门来取得该信号,现在毛刺自然已被排除。
高电平脉冲可由软件操纵锁存器来取得。
假设带有毛刺的信号维持时刻较短,可利用D触发器的D输入端对毛刺不灵敏的特点,在输出信号的维持时刻内用触发器读取输出信号,现在毛刺自然也已被排除,触发器的时钟沿可由软件操纵地址译码器来取得。
另外,在某些情形下,需要对信号进行必然的延时,以完成特定的功能。
利用D触发器可在时钟的操纵下对信号进行比较精准的延时,这种方式的最小延时是半个时钟周期。
延时也是排除毛刺的手腕之一。
硬件电路的调试
在硬件电路调试中,要注意焊接的艺术和元件的布局,让整体显得美观。
不能显现漏焊、错焊等现象。
在烧录入程序以后,对电路进行测试,看电路是不是能达到预期的功能。
若是不能,那么要进行程序的调试,并检测电路连接、元件利用等方面的问题,尽力排除故障,让系统功能实现。
7系统测试与数据分析
7.1正弦波、方波和三角波的频率测试
正弦波、方波和三角波的频率测试结果如表1所示。
表1正弦波、方波和三角波的频率测试结果
7.2正弦波、方波和三角波的幅值测试
频率调至500Hz
正弦波、方波和三角波的幅值测试结果如表2所示。
表2正弦波、方波和三角波的幅值测试结果
7.3方波占空比测试
幅值调至1.0V频率调至500Hz
方波占空比测试结果如表3所示。
表3方波占空比测试结果
总结
通过这次基于STM32的信号发生器设计,让我对数字信号的产生、调剂和DA转换原理有了加倍深刻的了解,除此之外,对M3内核的了解和STM32F107板上资源的了解与运用又加倍娴熟了一步。
在测试时期,尤其是在方案选择和程序的编写上,有很深的体会,有时候一个简单的错误就有可能造成致命错误,致使信号无法正常产生。
通过本次课程设计,我加倍深刻的熟悉到团队合作的重要性,在刚开始设计的时候由于对信号的产生不太熟悉,处处搜集资料选择方案,致使延误很多时刻,以后与同窗商量,一路探讨。
最后成功设计出所需波形,完成任务。
因此说合作,是设计成功的关键,只有大伙儿团结一致,才能更快更好的完成任务。
参考文献
[1]康华光.电子技术基础模拟部份第四版[M].北京:
高等教育出版社,1999.6.[2]阎石.数字电子技术基础第四版[M].北京:
高等教育出版社,1999.6.
[3]王福瑞等.单片微机测控系统设计大全[M].北京航空航天大学出版社,1998(331-337).
[4]宁改娣,杨拴科.DSP操纵器原理及应用[M].科学出版社,2002.
[5]周建功等.ARM嵌入式系统基础教程[M].北京:
北京航空航天大学出版社,2005.1.
[6]周建功等.ARM嵌入式系统实验教程[M].北京:
北京航空航天大学出版社,2005.1.
[7]唐清善.ProtelDXP高级实例教程[M].中国水利水电出版社,2004.4.
[8]罗浩等.一种新的基于ARM的数据搜集系统设计[J].信阳师范学院学报(自然科学版),2006.4.
[9]秦伟等.基于ARM处置器的数据搜集系统的设计[J].自动化技术与应用.2006年第10期.
[10]杜春雷.ARM体系结构与编程.清华大学出版社,2003.
[11]李宁.ARM开发工具ReaIViewMDK利用入门[M].北京航空航天大学出版社,2020.
[12]李宁.基于MDK的STM32处置器开发应用[M].北京航空航天大学出版社,2020.
[13]刘黎明等.单片机与嵌入式系统应用[J].英文刊名MICROCONTROLLER&EMBEDDEDSYSTEM.2002(7).
附录信号发生器各模块的程序
/*----------------------------------------------------------------------------
*功能:
STM32DAC数模转换(正弦波/矩形波/三角波)输出实验
*说明:
按SW5输出正弦波/按SW4输出矩形波/按SW3输出三角波,输出端口PA4
*----------------------------------------------------------------------------*/
#include
#include//STM32F10xLibraryDefinitions
#include"STM32_Reg.h"//STM32registerandbitDefinitions
#include"STM32_Init.h"//STM32Initialization
#include"common.h"
#include"sine_wave_1024.h"
//输出端口:
PA4
#defineSINE_WAVE1//sine正弦波
#defineRECT_WAVE2//rectangular矩形波
#defineHACKLE_WAVE3//hackle三角波
UINT8flag=0;
UINT8func=SINE_WAVE;
/*----------------------------------------------------------------------------
MAINfunction
*----------------------------------------------------------------------------*/
intmain(void)
{
UINT16i=0;
UINT32*pDAC_BASE=(UINT32*)DAC_BASE;
stm32_Init();//STM32setup
LED_Init();
//打开DAC时钟使能
RCC->APB1ENR|=(UINT32)(1<<29);
//设置DAC操纵参数*(pDAC_BASE+0x00)=(0x01<<0)|(0x00<<2)|(0x04<<3)|(0x03<<6)|(0x0b<<8);
*(pDAC_BASE+0x04)=0x01
printf("---------------Programstart---------------\r\n");
while(TRUE)//Loopforever
{
if(!
Get_SW5())
{
func=SINE_WAVE;
}
elseif(!
Get_SW4())
{
func=RECT_WAVE;
}
elseif(!
Get_SW3())
{
func=HACKLE_WAVE;
}
switch(func)
{
caseSINE_WAVE:
//-------------------------------------------------------------
#ifdefSINE_WAVE
if(i<1024)i+=2;
elsei=0;
*(pDAC_BASE+0x08)=Sine_WAVE[i]<<4;
#endif
//-------------------------------------------------------------
break;
caseRECT_WAVE:
#ifdefRECT_WAVE
for(i=0;i<2000;i++)
*(pDAC_BASE+0x08)=0x0fff;
for(i=0;i<2000;i++)
*(pDAC_BASE+0x08)=0;
#endif
//-------------------------------------------------------------
break;
caseHACKLE_WAVE:
#ifdefHACKLE_WAVE
if(flag)
{
flag=0;
while(TRUE)
{
if(i<4096)i+=1;
elsebreak;
*(pDAC_BASE+0x08)=i;
}
}
else
{
flag=1;
while(TRUE)
{
if(i>0)i-=1;
elsebreak;
*(pDAC_BASE+0x08)=i;
}
}
#endif
break;
default:
break;
}
//-------------------------------------------------------------
}//endwhile
}//endmain
/*-------------------