应用嵌入式微控制器的数字频率合成实现方法

2023-11-07 05:24陈砚圃石立春
探测与控制学报 2023年5期
关键词:累加器微控制器正弦

陈砚圃,刘 含,郭 博,石立春

(1.西京学院计算机学院,陕西 西安 710123;2.西京学院电子信息学院,陕西 西安 710123)

0 引言

波形信号生成技术在引信、遥测、通信、导航、雷达等领域的应用极其广泛[1-4]。直接数字频率合成(DDS)技术[5]能够对信号的频率、相位、幅度等参数进行精确控制,是多年来普遍采用的波形信号生成方法。基于DDS专用芯片[1-4]或FPGA[6-10]技术生成波形信号是目前最常见的两种解决方案。另外,随着嵌入式微控制器的主频、CPU处理字长、存储容量的提高以及其片上外设越来越丰富,电子装置中更多的功能直接由嵌入式微控制器实现已成自然趋势。为了降低电路的复杂性并提高系统的灵活性与可靠性,本文对基于嵌入式微控制器直接实现DDS而生成波形信号的方法进行研究。

基于定时中断实现DDS生成波形信号的方法简单、直接,但频繁的定时中断使生成信号的频率范围受限,进一步提出基于直接存储器存取(DMA)实现DDS生成波形信号的方法,数据从信号预存区到数模转换(DAC)的传送由并行于CPU工作的DMA完成,DDS时钟频率高,因而可生成频率范围更宽的信号。

1 信号生成的DDS技术

基于DDS技术的信号生成,是利用预存的信号1个周期内的NTAB个离散波形值组成的信号波形表,再以一定的间隔从波形表中循环取出波形值并送至DAC而生成一定频率的周期信号。利用DDS技术可以生成任意波形的周期信号,且输出信号的频率非常精确。图1为DDS信号生成器的原理框图,由相位累加器、信号波形表、数模转换器与低通滤波器等部分组成。其中,Kf为频率控制字,用于控制生成信号的频率;fc为DDS的时钟频率;p为相位累加器的字长(2进制位数);r为信号波形表地址线的位数,也是相位累加器高位输出的位数;q为信号波形表数据线的位数,对应数模转换器的分辨率;fo为拟生成信号的频率。

图1 DDS信号生成器的原理框图Fig.1 Schematic diagram of DDS signal generator

每隔1个DDS时钟周期(Tc=1/fc),相位累加器的当前值Sp均会加入1次频率控制字Kf,相位累加和的高r位作为地址对信号波形表寻址,查表结果为信号波形的1个离散值。在DDS时钟的作用下,查表输出的信号波形的离散序列经DAC转换并通过低通滤波器而得到平滑的模拟波形。

DDS生成信号的频率由DDS时钟频率和频率控制字决定,即

(1)

通常fc的取值受限于DAC的转换速度。1个信号周期内离散波形值的个数为

(2)

为了生成高质量的信号波形,通常Kf的取值远小于2p。DDS生成信号的频率分辨率为

(3)

可见,只要相位累加器的字长p足够大,DDS生成信号的频率就足够精确。

2 嵌入式微处理器实现DDS

2.1 基于定时中断实现DDS

利用嵌入式微控制器实现DDS生成波形信号,可采用串行方式依次实现图1中的各个环节。相位累加器进行加法操作用到的DDS时钟可由嵌入式微控制器的定时器产生。将定时器的定时时长设定为DDS的时钟周期Tc,在定时中断服务程序中完成相位累加,从信号波形表中查得波形值,通过DAC将波形值转换为模拟信号等操作。以正弦波为例,采用定时中断的方法实现DDS信号生成的具体流程如下:

1) 建立信号波形表

对正弦信号的1个周期进行NTAB等份离散采样,相应的NTAB个离散波形值为

VTAB[n]=round[(2q-1-1)sin(2πn/NTAB)+2q-1]
n= 0, 1, …,NTAB-1,

(4)

式(4)中,round[·]为取最接近的整数。嵌入式微控制器的片上DAC多为单极性输出,方括号中的第二项(直流分量)用于避免NTAB个离散波形值VTAB[n]出现小于0的情况。

2) 参数初始化

① 利用DDS时钟频率fc与生成信号的频率fo,计算频率控制字

(5)

② 复位相位累加器:Sp=0。

3) 定时器初始化

定时器设为定时中断模式,且定时时长为DDS时钟周期Tc。

4) 定时中断服务

① 信号波形表的索引号:m=Sp≫(p-r);

② 基于索引号m查信号波形表,得到q位的离散波形值V[m];

③ 将V[m]传送至DAC的数据寄存器,完成离散波形值到模拟量的转换;

④ 相位累加求和:Sp|new=Sp|old+Kf;

⑤ 结束。

以上定时中断实现DDS生成信号的方法,过程简单、容易实现。但每间隔1个DDS时钟周期均须进入1次定时中断,中断过于频繁并占用过多的CPU时间。特别是在中断服务程序中,波形表索引号的获取、波形表的查取、波形值的数模转换、相位的累加更新等操作均需一定的时间,再计入定时中断的响应和返回时间,完成一次定时中断的时间较长。因此定时中断实现DDS中的时钟频率fc较低,由式(1)可知生成信号的上限频率受限。

2.2 基于DMA实现DDS

为了解决定时中断实现DDS生成信号时上限频率低的问题,必须设法提高DDS的时钟频率fc。为此将离散序列到DAC的传送工作交给DMA完成,而CPU只负责离散序列的更新。近年来嵌入式技术的发展突飞猛进,多数嵌入式微控制器已经集成了片上DMA。利用DMA可以将预存于存储器中的离散序列自动、高速地传送至DAC生成模拟信号,而且DMA与CPU在时间上并行工作,工作效率高。但是,DMA所传送的数据并非源于信号波形表,而是依据DDS原理从信号波形表中查得的离散序列。信号频率不同,相应的离散序列也不相同,而且该序列通常不具备周期性,不能构成一个有限长的连续存储区供DMA循环传送。为此,在SRAM中开辟1个由上、下半区组成的连续存储区作为信号预存区,用于预存待传送的离散序列。当DMA完成上半区的传送并开始传送下半区时,由CPU更新上半区的预存序列;同样,当DMA完成下半区的传送并开始传送上半区时,由CPU更新下半区的预存序列。序列的更新在上、下半区DMA结束中断中完成,由于每次中断CPU更新的是一批波形离散值,而不是一次中断只更新一个波形离散值,因此能够大大减少中断的次数以及中断响应和返回的累计时间,因而可以显著提高DDS时钟频率。

以正弦信号的生成为例,设对信号的1个周期进行NTAB等份采样,采样得到的NTAB个离散波形值VTAB[n]组成信号的波形表。信号波形表中的内容不会因为生成信号频率的不同而变化,为了节省SRAM的开销,该表通常预存于Flash中。由式(5)给出的频率控制字对相位进行累加求和,再以相位作为索引从信号波形表中查得用于生成信号的离散序列。由NRAM个波形值组成的离散序列预存于信号预存区,在定时器的定时触发下DMA将离散序列传送至DAC而生成信号,而CPU并行完成信号预存区的动态更新。DMA实现DDS生成信号的具体流程如下:

1) 初始化

① 定时器初始化:定时时长设为DDS时钟周期;DMA初始化:数据传送的源区与目标分别为信号预存区和DAC,工作模式为半程与全程中断、循环发送;

② 频率控制字Kf=fo·2p/fc;

③ 信号波形表索引号、信号预存区索引号与相位累加和的初始化,即n=0;m=0;Sp=0;

④n=Sp≫(p-r);

⑤VRAM[m]=VTAB[n];

⑥m++,Sp+=Kf;

⑦ 若m

⑧ 结束。

其中④~⑦完成信号预存表的初始化。

2) 在DMA中断中完成动态更新VRAM[m]

上半区传送结束:

①m=0;

②n=Sp≫(p-r);

③VRAM[m]=VTAB[n];

④m++;

⑤Sp+=Kf;

⑥ 若m

⑦ 结束。

下半区传送结束:

①m=NRAM/2

②n=Sp≫(p-r);

③VRAM[m]=VTAB[n];

④m++;

⑤Sp+=Kf;

⑥ 若m

⑦ 结束。

3 实验与结果分析

为了生成频率精准、上限频率高以及波形质量好的信号,应尽可能选择片上嵌有大容量静态存储器(SRAM)、DMA数据传送单元、高频定时器以及分辨率高、转换速度快的DAC的嵌入式微控制器。实验采用国内使用较为普遍的STM32系列中的中高端嵌入式微控制器STM32F407,其主要特色有:频率为168 MHz的系统时钟,192 KB的SRAM,17个各类定时器,2路支持多达64 K个数据循环数传的DMA,2路12位的高速DAC。

首先对定时中断实现DDS算法生成正弦信号进行实验测试。定时器选用基本定时器TIM6,其输入时钟频率为84 MHz。TIM6工作于定时中断模式,每中断一次,中断服务程序均完成一次波形表取值、DAC转换、相位累加求和等操作。TIM6的定时中断频率就是DDS的时钟频率fc。CPU完成一次中断处理的时间为中断响应时间、中断返回时间与中断服务时间之和,其实测值大约为0.5 μs。留出1倍的余量,DDS时钟周期取1 μs,相应的DDS时钟频率为fc=1 MHz。考虑到该微控制器片上DAC的分辨率为12位,在正弦信号的1周期内取NTAB=4 096个采样值构成信号波形表。如果直接采用由式(4)建立的信号波形表,生成信号的幅度最大,峰峰值约为3.3 V。实际中需根据生成信号的幅度调整式(4)的峰峰值。测试中将生成信号的峰峰值统一设定为Vpp=1.0 V,则式(4)的峰峰值大约应调整为1 256。在实现DDS的过程中,相位累加和Sp与频率控制字Kf的字长均取32位,由式(3)可知生成信号频率的理论误差约为0.000 2 Hz。

实验中,生成信号的频率分别预设为10、20、30和100 kHz时,数字示波器的实测波形如图2所示,同时也是频率和峰峰值的测量值。可以看出,生成信号的频率非常准确,频率为10、20和30 kHz时信号的波形非常好,但当频率为100 kHz时,在信号的波峰和波谷附近的波形不再光滑,明显由分段直线组成。其实由于DDS时钟频率fc是固定的,随着信号频率fo的升高,1个信号周期内离散值的个数Ns=fc/fo会减少。fo=100 kHz时,生成信号的1个周期仅用到10个离散值(Ns=10),生成信号的波形畸变明显。为了使生成信号有较好的波形,通常要求Ns不小于32。Ns=32时对应的信号频率fo大约为30 kHz,因而如果采用STM32F407,要想得到高质量的信号波形,生成信号的频率应设在30 kHz以下。

图2 基于定时中断实现DDS生成正弦信号的实测波形Fig.2 The measured waveform of sine signal generated by DDS algorithm of timing interrupt method

基于DMA实现DDS生成信号旨在提高信号的上限频率,同时解决定时中断实现DDS时进入中断过于频繁的问题。嵌入式微控制器的基本定时器TIM6工作于非中断定时模式,DMA1工作于将信号预存区中的离散序列循环发送至DAC1的工作模式。TIM6的定时溢出信号用于连续触发DMA1,而TIM6的定时溢出率就是DDS的时钟频率。虽然为了提高生成信号的上限频率须尽可能提高DDS的时钟频率,但其最高频率根本上受到DAC1转换速率的限制。实验表明,数据传送到DAC1的时间间隔不小于8/84 μs时,数模转换能够正常、有效工作。信号的波形表和预存区均由正弦信号1个周期内的4 096个波形离散构成,生成信号的峰峰值仍取1.0 V。完全不占用CPU时间,DMA1不断将信号预存区中的波形值循环传送至DAC1。使能DMA1的半程中断和全程中断,每完成2 048个波形值到DAC1的传送,CPU将进入1次中断并在中断服务程序中基于DDS原理和信号波形表对信号预存区进行更新。半程中断时更新信号预存区上半区的2 048个波形值,全程中断时更新信号预存区下半区的2 048个波形值。由于每完成2 048个波形值的数模转换后才产生1次中断,平均而言CPU用于中断的响应和返回时间可以忽略,而且DMA1将波形值传送到DAC1的操作不占用CPU的时间,因此可以有效提高DDS的时钟频率。实测表明,1次中断服务的用时大约为120 μs,平均到1个波形值的中断服务时间大约为0.06 μs,远小于DAC1所需的转换时间。因此实验中将TIM6的定时长度设为8/84 μs,对应的DDS时钟频率fc=10.5 MHz。DDS过程中的相位累加和Sp与频率控制字Kf的字长仍取32位,由式(3)可知生成信号频率的理论误差约为0.002 Hz。

实验中,正弦信号的频率分别预设为100、300、600和1.0 MHz时,生成信号的示波器实测波形如图3所示。可以看出,生成信号的频率非常精确;频率为100、300 kHz时信号的波形很好,但300 kHz时信号的峰峰值有所下降(850 mV);频率为600 kHz时,信号的波形已接近三角波,信号的峰峰值进一步下降(670 mV);频率为1.0 MHz时,信号的波形畸变明显,信号的峰峰值继续下降(434 mV)。

图3 基于DMA实现DDS生成正弦信号的实测波形Fig.3 The measured waveform of sine signal generated by DDS algorithm of DMA method

实验表明,基于DMA实现DDS所生成的正弦信号,当频率高达数百kHz时信号的波形依旧很好,信号的上限频率得到了显著提高。显然,在保证波形质量的基础上,生成信号频率的提高主要是DDS时钟频率的提高,进而1周期内离散波形值的个数增多的自然结果。但是,随着频率的不断提高(大于100 kHz),信号幅度出现持续下降,而且当频率高至一定程度时,信号的波形由正弦波逐渐向三角波演变。分析表明,片上DAC放大器的压摆率不足是这一现象的直接起因。实验还表明,当信号的幅度较小时,信号的幅度和波形质量随频率的提高而下降的现象明显减弱。实际上,当信号幅度减小时,信号波形的斜率会随之减小,压摆率对波形的影响自然也随之减弱。

总之,DMA实现DDS所生成信号的性能主要决定于片上DAC及其放大器的性能。为了获得频率高、幅度稳定且波形畸变小的生成信号,要求嵌入式微控制器的片上DAC的转换速度及其放大器的压摆率均须足够高。

4 结论

本文研究了仅借助嵌入式微控制器的定时器、DMA与DAC等片上外设,无需引入DDS专用集成电路,基于定时中断或DMA实现DDS直接生成波形信号的方法。基于定时中断实现DDS生成信号的方法,适用于片上未嵌入DMA的嵌入式微控制器,但CPU频繁地出入定时中断限制了生成信号的上限频率;基于DMA实现DDS生成信号的方法,从信号预存区到DAC的传送由独立于CPU并行工作的DMA完成,支持较高的DDS时钟频率,生成信号的频率范围更宽。采用STM32系列的嵌入式微控制器STM32F407,以正弦信号为例对两种方法均进行了实验测试,结果表明要生成高质量的信号波形,定时中断实现法所生成信号的频率上限为数十kHz,而DMA实现法所生成信号的频率上限达数百kHz。实验还发现,对DDS时钟频率较高的DMA实现法,生成信号的上限频率主要受DAC放大器压摆率的限制。为了获得更高频率的信号,在选择嵌入式微控制器时,不仅要求片上DAC的转换速率足够高,其放大器的压摆率也须足够高。

猜你喜欢
累加器微控制器正弦
例说正弦定理的七大应用
正弦、余弦定理的应用
密码累加器研究进展及应用
“美”在二倍角正弦公式中的应用
Fpga的信号发生器设计原理
物联网技术在微控制器实验教学中的应用
基于霍夫变换的工位点识别算法设计与实现
用于时间延迟积分型图像传感器的流水采样列级运放共享累加器*
基于VSG的正弦锁定技术研究
Atmel针对新一代物联网应用发布全新32位微控制器