基于dsp的正弦波信号发生器.docx
《基于dsp的正弦波信号发生器.docx》由会员分享,可在线阅读,更多相关《基于dsp的正弦波信号发生器.docx(16页珍藏版)》请在冰豆网上搜索。
基于dsp的正弦波信号发生器
自本4班14号王文亮
基于DSP的正弦信号发生器
引言
随着计算机技术的飞速发展,对信号发生器波形的要求越来越高。
目前,常用信号发生器大部分是由模拟电路构成,当这种模拟信号发生器用于低频输出时,由于需要较大的RC值,导致参数准确度难以保证,且造成体积和功耗偏大,而数字式波形发生器,因其输出幅值稳定、输出频率连续可调的优点,已逐渐取代了模拟电路信号发生器。
由于其运算速度高,系统集成度强的优势,可以设计基于DSP的正弦信号发生器,该发生器实时性强、可扩展性好、波形精度高、可调节频率和幅度、稳定性好、用途广泛,各方面均优于模拟信号发生器和数字信号发生器。
而利用DSP产生正弦波的方法主要有采样回放法产生正弦波,查表法产生正弦波,查表结合插值法产生正弦波,泰勒级数法产生正弦波,迭代法产生正弦波,通过比较各种方法的优缺点,本次设计采用泰勒级数展开法得到设定参数的正弦波形输出,达到设计目的。
关键词:
数字信号处理器;信号发生器;泰勒级数法
1信号发生器的原理
利用DSP产生正弦波的方法主要有以下几种:
1.1采样回放法
该方法很容易实现,只需对已有的标准正弦信号源进行采样,得到数据后直接回放或进行变频变幅处理后回放。
该方法关键在于采用高性能的A/D、D/A芯片并合理设计硬件电路,使信号处理过程中保证波形良好,以保证采样数据的精准性。
进行数字变频及变幅处理时,要清楚数据的格式并保证回放数据的点数满足奈奎斯特定理,防止频谱混迭。
1.2查表法产生正弦波
查表法是使用比较普遍的方法,首先自己生成正弦数据表,再进行查表、D/A转换后,得到所需要的波形。
优点是处理速度快,调频调相容易,较采样回放法,避免了数据的单一,增加了精度。
如果存储空间足够大,那么就可以通过制作较大的查找表来得到较高的精度。
如建立一个200个数据点的正弦数据表,具体过程如下,采用查表法来实现对某一正弦波的频率及幅值的设定,在程序里要建立一张正弦查找表。
根据分析及计算得到每周期最多向D/A送多少个数据点,假设送200个数据,因此建立一张有200个数据的正弦查找表。
对于频率为f的正弦波来说,若每周期取200点数据,则取样间隔为(1/f)/200=1/(200f)。
1.3查表结合插值法产生正弦波形
查表结合插值法是在查表法的基础上加以改进得到。
发生相同性能的正弦波,查表法结合插值法的长度远远要小于单纯查表法的表格长度,从而克服了查表法中占用大量内存资源的缺点,节约了存储空间。
查表法结合插值法先将一个周期的单位正弦波N等分,并计算所有离散点的幅值,之后将这些幅值依次排列存入数据区,从而构成一张表格。
查表结合插值法产生正弦波形方法是通过在两个表项点之间插入若干个值来实现的,插入值的大小决定于相邻的两个表项值和插入点的位置。
考虑到DSP的处理速度,一般采用线性插值。
1.4迭代法产生正弦波
迭代法是利用数字振荡器通过迭代方法产生正弦波。
1.5泰勒级数法产生正弦波
泰勒级数法产生正弦波,也是此次设计采用的正弦波产生方法,泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。
本次主要用泰勒级数展开法来实现正弦波信号。
产生正弦波的算法正弦函数和余弦函数可以展开成泰勒级数。
其表达式:
取泰勒级数的前5项,得近似计算式:
递推公式:
sin(nx)=2cos(x)sin[(n-1)x]-sin[(n-2)x]
cos(nx)=2cos(x)sin[(n-1)x]-cos[(n-2)x]
由递推公式可以看出,在计算正弦和余弦值时,需要已知cos(x)、sin(n-1)x、sin(n-2)x和cos(n-2)x。
2正弦波发生器硬件设计
2.1DSP简介
数字信号处理(DigitalSignalProcessing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。
20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。
数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。
在过去的二十多年时间里,信号处理已经在通信等领域得到极为广泛的应用。
图2.1是数字信号处理系统的简化框图。
此系统先将模拟信号转换为数字信号,经数字信号处理后,再转换成模拟信号输出。
其中抗混叠滤波器的作用是将输入信号x(t)中高于折叠频率的分量滤除,以防止信号频谱的混叠。
随后,信号经采样和A/D转换后,变成数字信号x(n)。
数字信号处理器对x(n)进行处理,得到输出数字信号y(n),经D/A转换器变成模拟信号。
此信号经低通滤波器,滤除不需要的高频分量,最后输出平滑的模拟信号y(t)。
图2.1数字信号处理系统简化框图
DSP是以众多学科为理论基础的,它所涉及的范围极其广泛。
例如,在数学领域,微积分、概率统计、随机过程、数值分析等都是数字信号处理的基本工具,与网络理论、信号与系统、控制论、通信理论、故障诊断等也密切相关。
近来新兴的一些学科,如人工智能、模式识别、神经网络等,都与数字信号处理密不可分。
可以说,DSP是把许多经典的理论体系作为自己的理论基础,同时又是一系列新兴学科的理论基础。
2.2正弦波发生器硬件组成
基于DSP的正弦信号发生器的硬件结构图如图2.2所示,它主要由DSP主控制器,输出D/A通道和人机界面等几个主要部分组成。
图2.2基于DSP的信号发生器系统框图
2.3控制器部分
本系统采用TI公司的TMS320LF2407DSP处理器,该器件具有外设集成度高,程序存储器容量大,A/D转换精度高,运算速度高,I/O口资源丰富等特点,芯片内部集成有32KB的FLASH程序存储器、2KB的数据/程序RAM,两个事件管理器模块(EVE和EVB)、16通道A/D转换器、看门狗定时器模块、16位的串行外设接口(SPI)模块、40个可单独编程或复用的通用输入输出引脚(GPIO)以及5个外部中断和系统监视模块。
TMS320LF2407芯片中的事件管理模块(EV)是一个非常重要的组成部分。
SPWM波形的产生和输出就是由这一部分完成的,它由两个完全相同的模块(EVA和EVB)组成,每个模块都含有2个通用定时器、3个比较器、6至8个PWM发生器、3个捕获单元和2个正交脉冲编码电路(QEP)。
由于TMS320LF2407有544字的双口RAM(DARAM)和2K字的单口RAM(SARAM);而本系统的程序仅有几KB,且所用RAM也不多,因此不用考虑存储器的扩展问题,而对于TMS320LF2407的I/O扩展问题,由于TMS320LF2407器件有多达40个通用、双向的数字I/O(GPIO)引脚,且其中大多数的基本功能和一般I/O复用的引脚,而实际上,本系统只需要17路I/O信号,这样,就可以为系统剩余50%多的I/O资源,因此可以说,该方案既不算浪费系统资源,也为系统今后的升级留有余地。
2.4微输出D/A通道部分
本系统的输出通道部分主要负责实现波形的输出,此通道的入口为TMS320LF2407的PWM8口,可输出SPWM等幅脉冲波形,出口为系统的输出端,这样,经过一系列的中间环节,便可将PWM脉冲波转化为交流正弦波形,从而实现正弦波的输出,其原理框图如图3.2所示。
图3.2输出通道的原理结构
图3.2中的缓冲电路的作用是对PWM口输出的数字量进行缓冲,并将电压拉高到5V左右,以供后级模拟电路滤波使用。
这一部分电路由两个芯片组成。
一片用三态缓冲器,由于PWM口的输出为3.3V的TTL电平,这样,在设计时就应当选用输入具有5V的TTL输入,CMOS输出电平的转换芯片(如TI公司的74HCT04);另一片则可选用TOSHIBA公司出品的光电耦合器6N137;输出端连接的5V精密稳压电源可选用BURR-BROWN公司生产的REF02型精密稳压电源,以输出标准的5V电压。
系统中的减法电路的主要作用是把0-10V直流脉动信号的转换成-5~+5V的正弦交流信号,并使其电压增益为1。
设计使可利用差分式电路来实现其功能,为了简化电路,可以选用较为常用的AD公司的AD524,并将AD524接成电压跟随器的形式,同时适当的选取电阻以满足要求,此外,为了使产生的正弦波信号具有2-5mA的驱动能力,可选用AD624来构成末级的信号放大电路。
AD624是高精度低噪声仪用放大器,若外接一只增益电阻,即可得到1-1000之间的任意增益值,其误差小于1%。
由于AD624的建立时间只有15μs,所以它非常适宜在高速数据采集系统中使用。
2.5人机接口部分
2.5.1驱动器设计
位驱动器电路由两片集成电路组成,即由位驱动的CMOS芯片和将TTL电平转换成CMOS电平的电平转换芯片组成,电平转换芯片可以和输出通道的电平转换芯片共用一片74HCT244(本部分使用4路,输出通道使用3路),其主要作用是对DSP输出的3.3VTTL电平与5VCMOS电平进行匹配,从而带动具有CMOS电平的位驱动器,根据动态扫描显示的要求,位驱动器需要选用每路输出吸收电流都要大于200mA的芯片,因此,本设计选用了TI公司的74LS06来做LED的大电流驱动器件。
2.5.2键盘设计
本系统选用四个独立式按键,分别接入PF3-PF6口,并使用四个220Ω上拉电阻接VCC。
所谓独立式,就是将每一个独立键按一对一地直接接到I/O输入线上,而在读键值时,直接读I/O口,每一个键的状态通过读入键值的一位(二进制位)来反应,所以这种方式也称为一维直读方式,这种方式的查键软件比较简单,但占用I/O线较多,一般在键的数量较少时采用,不过,由于DSP芯片有足够的I/O接口可供使用,因而可大大方便设计,设计时可以充分利用这一特点来连接硬件,至于按键的削抖动措施,则可在软件中完成。
3正弦波发生器软件设计
3.1程序设计流程
本系统软件可以按照模块化设计思想来编写,包括主程序、常数计算程序、占空比计算程序和相应的一些功能子程序,主程序用于调用各功能子程序、初始化变量、查询键盘、判断显示数据是否需要刷新、同时判断一个脉冲是否完成发送等工作,具体方案见图3.1所示的流程图。
图3.1主程序流程图
在程序中,应在第N-1个脉冲周期里计算占空比,并在第N个脉冲周期里输出波形,这就要求在设计时要在一个脉冲周期内完成计算,如果选用20MHz的晶振,那么,在一倍频下,执行一条执行只需50ns,若输出400Hz的正弦波,即每一个周期(即2.5ms)要输出200个脉冲,这样,也就是说,一个脉冲需要12.5μs(相当于12500/50=250条指令)。
而执行一个占空比的计算程序只需要几十条指令,这种算法从软件开销上考虑是可以实现的。
3.2正弦信号发生器程序清单
3.2.1正弦波程序清单
.title"sin.asm";为汇编文件取名为“sin.asm”
.mmregs;定义存储器映像寄存器
.def_c_int00
.refsinx,d_xs,d_sinx,cosx,d_xc,d_cosx;定义标号
sin_x:
.usect"sin_x",360;为"sin_x"保留360个存储空间
STACK:
.usect"STACK",10;为堆栈保留10个存储空间
k_theta.set286;theta=pi/360(0.5deg)
PA0.set0
_c_int00
.text;定义文本程序代码段
STM#STACK+10,SP;设置堆栈指针
STMk_theta,AR0;AR0-->K_theta(increment)
STM0,AR1;(AR1)=X(rad)
STM#sin_x,AR6;AR6-->sin(x)
STM#90,BRC;formsin0(deg.)—sin90(deg)
;重复执行块语句(下条语句开始至loop1-1)91次
RPTBloop1-1
LDMAR1,A
LD#d_xs,DP;DPd_xs
STLA,@d_xs;(A)低16位→d_xs
STLA,@d_xc;(A)低16位→d_xc
CALLsinx;调用sinx程序
CALLcosx;调用conx程序
LD#d_sinx,DP;DPd_sinx
LD@d_sinx,16,A;A=sin(x)
MPYA@d_cosx;B=sin(x)*cos(x)
STHB,1,*AR6+;AR6-->2*sin(x)*cos(x)
MAR*AR1+0;修改辅助寄存器AR1
loop1:
STM#sin_x+89,AR7;sin91(deg.)--sin179(deg.)
STM#88,BRC;重复执行下条指令至loop2-1
RPTBloop2-1;处90次
LD*AR7-,A;((AR7))→A,然后AR7减去1
STLA,*AR6+;(A)低16位→AR6
loop2:
STM#179,BRC;sin180(deg.)--sin359(deg.)
;(BRC)=179,重复执行180次
STM#sin_x,AR7;AR7指向sin_x首地址
RPTBloop3-1;
LD*AR7+,A;((AR7))→A,然后AR7加1
NEGA;累加器变负
STLA,*AR6+;A低16位→AR6
loop3:
STM#sin_x,AR6;generatesinwaveAR6指向sin_x
STM#1,AR0;AR01
STM#360,BK;BK360
loop4:
PORTW*AR6+0%,PA0;PA0=*AR6+0%,向PA0输出数据
Bloop4;
sinx:
.defd_xs,d_sinx;定义标号d_xs,d_sinx
.data;定义数据代码段
table_s.word01c7h;c1=1/(8*9)
.word030bh;c1=1/(6*7)
.word0666h;c1=1/(4*5)
.word1556h;c1=1/(2*3)
d_coef_s.usect"coef_s",4;为"coef_s"保留4个存储空间
d_xs.usect"sin_vars",1;为d_xs中sin_vars保留1个存储空间
d_squr_xs.usect"sin_vars",1;为d_squr_xs中sin_vars保留1个存储空间
d_temp_s.usect"sin_vars",1;为d_temp_s中sin_vars保留1个存储空间
d_sinx.usect"sin_vars",1;为d_sinx中sin_vars保留1个存储空间
c_l_s.usect"sin_vars",1;为d_xs中sin_vars保留1个存储空间
.text;定义代码开始段
SSBXFRCT;设置FRCT=1以解决冗余符号位
STM#d_coef_s,AR5;AR5指向d_coef_s首地址
RPT#3;重复下条指令4次
MVPD#table_s,*AR5+;table_s中的数复制到AR5指向的单元
STM#d_coef_s,AR3;AR3指向d_coef_s首地址
STM#d_xs,AR2;AR2指向d_xs首地址
STM#c_l_s,AR4;AR4指向c_l_s首地址
ST#7FFFh,c_l_s;7FFFh→c_l_s
SQUR*AR2+,A;AR2指向累加器A中的数值求其平方
STA,*AR2;(A)左移16位→AR2
||LD*AR4,B;(AR4)左移16位→B
MASR*AR2+,*AR3+,B,A;从累加器A中减去(AR2)*(AR3)
MPYAA;操作数与累加器A中高位相乘
STHA,*AR2;(A)高16位→AR2
MASR*AR2-,*AR3+,B,A;从累加器A中减去(AR2)*(AR3)
MPYA*AR2+;AR2指向的数与累加器A的高16位相乘
STB,*AR2;(B)左移16位→AR2
||LD*AR4,B;(AR4)左移16位→B
MASR*AR2-,*AR3+,B,A;从累加器A中减去(AR2)*(AR3)
MPYA*AR2+;与累加器A中高16位相乘
STB,*AR2;(B)左移16位→AR2
||LD*AR4,B;(AR4)左移16位→BMASR*AR2-,*AR3+,B,A;从累加器A中减去(AR2)*(AR3)
MPYAd_xs;d_xs指向的操作数与累加器A中高16位相乘
STHB,d_sinx;(B)高16位→d_sinx
RET;返回
cosx:
.defd_xc,d_cosx;定义标号d_xc,d_cosx
d_coef_c.usect"coef_c",4;为coef_c保留4个存储空间
.data;定义数据代码段
table_c.word0249h;c1=1/(7*8)
.word0444h;c2=1/(6*5)
.word0aabh;c3=1/(3*4)
.word4000h;c4=1/2
d_xc.usect"cos_vars",1;为d_xc中cos_vars保存1个存储单元
d_squr_xc.usect"cos_vars",1;为d_squr_xc中cos_vars保存1个存储单元
d_temp_c.usect"cos_vars",1;为d_temp_c中cos_vars保存1个存储单元
d_cosx.usect"cos_vars",1;为d_cosx中cos_vars保存1个存储单元
c_l_c.usect"cos_vars",1;为c_l_c中cos_vars保存1个存储单元
.text;定义文本代码段
SSBXFRCT;FRCT=1以清除冗余符号位
STM#d_coef_c,AR5;AR5指向d_coef_c首地址
RPT#3;重复下条指令4次
MVPD#table_c,*AR5+;把table_c中的数复制到中AR5
STM#d_coef_c,AR3;AR3指向d_coef_c首地址
STM#d_xc,AR2;AR2指向d_xc首地址
STM#c_l_c,AR4;AR4指向c_l_c首地址
ST#7FFFh,c_l_c;7FFFh→c_l_c
SQUR*AR2+,A;求X的平方存放在累加器A中
STA,*AR2;(A)左移16位→AR2
||LD*AR4,B;(AR4)左移16位→B
MASR*AR2+,*AR3+,B,A;A=1-x^2/56,T=x^2
MPYAA;A=T*A=x^2(1-x^2/56)
STHA,*AR2;(d_temp)=x^2(1-x^2/56)
MASR*AR2-,*AR3+,B,A;A=1-x^2/30(1-x^2/56),
T=x^2(1-x^2/56)
MPYA*AR2+;B=x^2(1-x^2/30(1-x^2/56))
STB,*AR2;(d_temp)=x^2(1-x^2/30(1-x^2/56))
||LD*AR4,B;B=1
MASR*AR2-,*AR3+,B,A;A=1-x^2/12(1-x^2/30(1-x^2/56))
SFTAA,-1,A;-1/2
NEGA;
MPYA*AR2+;B=1-x^2/2(1-x^2/12(1-x^2/30
;(1-x^2/56)))
MAR*AR2+;
RETD;
ADD*AR4,16,B;B=1-x^2/2(1-x^2/12(1-x^2/30
;(1-x^2/56)))
STHB,*AR2;cos(theta)
RET;
.end;
3.2.2链接文件
MEMORY
{
PAGE0:
EPROM:
org=0E000h,len=1000h
VECS:
org=0FF80h,len=0080h
PAGE1:
SPRAM:
org=0060h,len=0020h
DARAM1:
org=0080h,len=0010h
DARAM2:
org=0090h,len=0010h
DARAM3:
org=0200h,len=0200h
}
SECTIONS
{
.text:
>EPROMPAGE0;文本代码段其实地址为0E000h,长度为1000h
.data:
>EPROMPAGE0;数据代码段其实地址为0D000h
STACK:
>SPRAMPAGE1;堆栈起始地址为0060h,长度为0020h
sin_vars:
>DARAM1PAGE1;标号为sin_vars段的起始地址为0080
;长度为0010h
coef_s:
>DARAM1PAGE1;标号为coef_s段的起始地址为0070h
;长度为0010h
cos_vars:
>DARAM2PAGE1;标号为cos_vars段的起始地址为0090h
;长度为0010h
coef_c:
>DARAM2PAGE1;标号为coef_c段的起始地址为0080h
;长度为0020h
sin_x:
align(512){}>DARAM3PAGE1
.vectors:
>VECSPAGE0
}
3.2.3复向量文件
.title"sin_v.asm"
.ref_c_int00
.sect".vectors"
B_c_int00
.end
4设计总结
随着电子技术的高速发展,DSP的各项性能到不断提高,其独特的硬件结构和快速实现各种信号处理,高速而精确的运算能力以及内部操作极大的灵活性,使得DSP得到广泛的应用。
本文提出了一种基于TMS320C5402的正弦信号发生器的设计,介绍了所设计的正弦信号发生器硬件电路结构和软件程序流程图。
该信号发生器弥补了通常信号发生器模式固定,波形不可编程的缺点,其具有实时性强,波形精度高,可方便调节频率和幅度、稳定性好等优点。
5参考文献
[1]戴明帧.数字信号处理的硬件实现[M].北京:
航空工业出版社,1988
[2]张伟雄,陈亮,徐光辉.DSP集成开发与应用实例[M]。
北京:
电子工业出版社
[3]刘湘涛、江世民.单片机原理与应用[M].电子工业出版社,2006.
[4]戴明桢,周建江.TMS320C54XDSP结构,原理及应运[M]北京航空航天出版社
[5]赵红怡.DSP技术与应用实例.西安:
电子工业出版社,2009
[6]严怀龙.