陳硯圃,劉 含,郭 博,石立春
(1.西京學(xué)院計(jì)算機(jī)學(xué)院,陜西 西安 710123;2.西京學(xué)院電子信息學(xué)院,陜西 西安 710123)
波形信號(hào)生成技術(shù)在引信、遙測(cè)、通信、導(dǎo)航、雷達(dá)等領(lǐng)域的應(yīng)用極其廣泛[1-4]。直接數(shù)字頻率合成(DDS)技術(shù)[5]能夠?qū)π盘?hào)的頻率、相位、幅度等參數(shù)進(jìn)行精確控制,是多年來(lái)普遍采用的波形信號(hào)生成方法。基于DDS專用芯片[1-4]或FPGA[6-10]技術(shù)生成波形信號(hào)是目前最常見(jiàn)的兩種解決方案。另外,隨著嵌入式微控制器的主頻、CPU處理字長(zhǎng)、存儲(chǔ)容量的提高以及其片上外設(shè)越來(lái)越豐富,電子裝置中更多的功能直接由嵌入式微控制器實(shí)現(xiàn)已成自然趨勢(shì)。為了降低電路的復(fù)雜性并提高系統(tǒng)的靈活性與可靠性,本文對(duì)基于嵌入式微控制器直接實(shí)現(xiàn)DDS而生成波形信號(hào)的方法進(jìn)行研究。
基于定時(shí)中斷實(shí)現(xiàn)DDS生成波形信號(hào)的方法簡(jiǎn)單、直接,但頻繁的定時(shí)中斷使生成信號(hào)的頻率范圍受限,進(jìn)一步提出基于直接存儲(chǔ)器存取(DMA)實(shí)現(xiàn)DDS生成波形信號(hào)的方法,數(shù)據(jù)從信號(hào)預(yù)存區(qū)到數(shù)模轉(zhuǎn)換(DAC)的傳送由并行于CPU工作的DMA完成,DDS時(shí)鐘頻率高,因而可生成頻率范圍更寬的信號(hào)。
基于DDS技術(shù)的信號(hào)生成,是利用預(yù)存的信號(hào)1個(gè)周期內(nèi)的NTAB個(gè)離散波形值組成的信號(hào)波形表,再以一定的間隔從波形表中循環(huán)取出波形值并送至DAC而生成一定頻率的周期信號(hào)。利用DDS技術(shù)可以生成任意波形的周期信號(hào),且輸出信號(hào)的頻率非常精確。圖1為DDS信號(hào)生成器的原理框圖,由相位累加器、信號(hào)波形表、數(shù)模轉(zhuǎn)換器與低通濾波器等部分組成。其中,Kf為頻率控制字,用于控制生成信號(hào)的頻率;fc為DDS的時(shí)鐘頻率;p為相位累加器的字長(zhǎng)(2進(jìn)制位數(shù));r為信號(hào)波形表地址線的位數(shù),也是相位累加器高位輸出的位數(shù);q為信號(hào)波形表數(shù)據(jù)線的位數(shù),對(duì)應(yīng)數(shù)模轉(zhuǎn)換器的分辨率;fo為擬生成信號(hào)的頻率。

圖1 DDS信號(hào)生成器的原理框圖Fig.1 Schematic diagram of DDS signal generator
每隔1個(gè)DDS時(shí)鐘周期(Tc=1/fc),相位累加器的當(dāng)前值Sp均會(huì)加入1次頻率控制字Kf,相位累加和的高r位作為地址對(duì)信號(hào)波形表尋址,查表結(jié)果為信號(hào)波形的1個(gè)離散值。在DDS時(shí)鐘的作用下,查表輸出的信號(hào)波形的離散序列經(jīng)DAC轉(zhuǎn)換并通過(guò)低通濾波器而得到平滑的模擬波形。
DDS生成信號(hào)的頻率由DDS時(shí)鐘頻率和頻率控制字決定,即
(1)
通常fc的取值受限于DAC的轉(zhuǎn)換速度。1個(gè)信號(hào)周期內(nèi)離散波形值的個(gè)數(shù)為
(2)
為了生成高質(zhì)量的信號(hào)波形,通常Kf的取值遠(yuǎn)小于2p。DDS生成信號(hào)的頻率分辨率為
(3)
可見(jiàn),只要相位累加器的字長(zhǎng)p足夠大,DDS生成信號(hào)的頻率就足夠精確。
利用嵌入式微控制器實(shí)現(xiàn)DDS生成波形信號(hào),可采用串行方式依次實(shí)現(xiàn)圖1中的各個(gè)環(huán)節(jié)。相位累加器進(jìn)行加法操作用到的DDS時(shí)鐘可由嵌入式微控制器的定時(shí)器產(chǎn)生。將定時(shí)器的定時(shí)時(shí)長(zhǎng)設(shè)定為DDS的時(shí)鐘周期Tc,在定時(shí)中斷服務(wù)程序中完成相位累加,從信號(hào)波形表中查得波形值,通過(guò)DAC將波形值轉(zhuǎn)換為模擬信號(hào)等操作。以正弦波為例,采用定時(shí)中斷的方法實(shí)現(xiàn)DDS信號(hào)生成的具體流程如下:
1) 建立信號(hào)波形表
對(duì)正弦信號(hào)的1個(gè)周期進(jìn)行NTAB等份離散采樣,相應(yīng)的NTAB個(gè)離散波形值為
VTAB[n]=round[(2q-1-1)sin(2πn/NTAB)+2q-1]
n= 0, 1, …,NTAB-1,
(4)
式(4)中,round[·]為取最接近的整數(shù)。嵌入式微控制器的片上DAC多為單極性輸出,方括號(hào)中的第二項(xiàng)(直流分量)用于避免NTAB個(gè)離散波形值VTAB[n]出現(xiàn)小于0的情況。
2) 參數(shù)初始化
① 利用DDS時(shí)鐘頻率fc與生成信號(hào)的頻率fo,計(jì)算頻率控制字
(5)
② 復(fù)位相位累加器:Sp=0。
3) 定時(shí)器初始化
定時(shí)器設(shè)為定時(shí)中斷模式,且定時(shí)時(shí)長(zhǎng)為DDS時(shí)鐘周期Tc。
4) 定時(shí)中斷服務(wù)
① 信號(hào)波形表的索引號(hào):m=Sp?(p-r);
② 基于索引號(hào)m查信號(hào)波形表,得到q位的離散波形值V[m];
③ 將V[m]傳送至DAC的數(shù)據(jù)寄存器,完成離散波形值到模擬量的轉(zhuǎn)換;
④ 相位累加求和:Sp|new=Sp|old+Kf;
⑤ 結(jié)束。
以上定時(shí)中斷實(shí)現(xiàn)DDS生成信號(hào)的方法,過(guò)程簡(jiǎn)單、容易實(shí)現(xiàn)。但每間隔1個(gè)DDS時(shí)鐘周期均須進(jìn)入1次定時(shí)中斷,中斷過(guò)于頻繁并占用過(guò)多的CPU時(shí)間。特別是在中斷服務(wù)程序中,波形表索引號(hào)的獲取、波形表的查取、波形值的數(shù)模轉(zhuǎn)換、相位的累加更新等操作均需一定的時(shí)間,再計(jì)入定時(shí)中斷的響應(yīng)和返回時(shí)間,完成一次定時(shí)中斷的時(shí)間較長(zhǎng)。因此定時(shí)中斷實(shí)現(xiàn)DDS中的時(shí)鐘頻率fc較低,由式(1)可知生成信號(hào)的上限頻率受限。
為了解決定時(shí)中斷實(shí)現(xiàn)DDS生成信號(hào)時(shí)上限頻率低的問(wèn)題,必須設(shè)法提高DDS的時(shí)鐘頻率fc。為此將離散序列到DAC的傳送工作交給DMA完成,而CPU只負(fù)責(zé)離散序列的更新。近年來(lái)嵌入式技術(shù)的發(fā)展突飛猛進(jìn),多數(shù)嵌入式微控制器已經(jīng)集成了片上DMA。利用DMA可以將預(yù)存于存儲(chǔ)器中的離散序列自動(dòng)、高速地傳送至DAC生成模擬信號(hào),而且DMA與CPU在時(shí)間上并行工作,工作效率高。但是,DMA所傳送的數(shù)據(jù)并非源于信號(hào)波形表,而是依據(jù)DDS原理從信號(hào)波形表中查得的離散序列。信號(hào)頻率不同,相應(yīng)的離散序列也不相同,而且該序列通常不具備周期性,不能構(gòu)成一個(gè)有限長(zhǎng)的連續(xù)存儲(chǔ)區(qū)供DMA循環(huán)傳送。為此,在SRAM中開(kāi)辟1個(gè)由上、下半?yún)^(qū)組成的連續(xù)存儲(chǔ)區(qū)作為信號(hào)預(yù)存區(qū),用于預(yù)存待傳送的離散序列。當(dāng)DMA完成上半?yún)^(qū)的傳送并開(kāi)始傳送下半?yún)^(qū)時(shí),由CPU更新上半?yún)^(qū)的預(yù)存序列;同樣,當(dāng)DMA完成下半?yún)^(qū)的傳送并開(kāi)始傳送上半?yún)^(qū)時(shí),由CPU更新下半?yún)^(qū)的預(yù)存序列。序列的更新在上、下半?yún)^(qū)DMA結(jié)束中斷中完成,由于每次中斷CPU更新的是一批波形離散值,而不是一次中斷只更新一個(gè)波形離散值,因此能夠大大減少中斷的次數(shù)以及中斷響應(yīng)和返回的累計(jì)時(shí)間,因而可以顯著提高DDS時(shí)鐘頻率。
以正弦信號(hào)的生成為例,設(shè)對(duì)信號(hào)的1個(gè)周期進(jìn)行NTAB等份采樣,采樣得到的NTAB個(gè)離散波形值VTAB[n]組成信號(hào)的波形表。信號(hào)波形表中的內(nèi)容不會(huì)因?yàn)樯尚盘?hào)頻率的不同而變化,為了節(jié)省SRAM的開(kāi)銷,該表通常預(yù)存于Flash中。由式(5)給出的頻率控制字對(duì)相位進(jìn)行累加求和,再以相位作為索引從信號(hào)波形表中查得用于生成信號(hào)的離散序列。由NRAM個(gè)波形值組成的離散序列預(yù)存于信號(hào)預(yù)存區(qū),在定時(shí)器的定時(shí)觸發(fā)下DMA將離散序列傳送至DAC而生成信號(hào),而CPU并行完成信號(hào)預(yù)存區(qū)的動(dòng)態(tài)更新。DMA實(shí)現(xiàn)DDS生成信號(hào)的具體流程如下:
1) 初始化
① 定時(shí)器初始化:定時(shí)時(shí)長(zhǎng)設(shè)為DDS時(shí)鐘周期;DMA初始化:數(shù)據(jù)傳送的源區(qū)與目標(biāo)分別為信號(hào)預(yù)存區(qū)和DAC,工作模式為半程與全程中斷、循環(huán)發(fā)送;
② 頻率控制字Kf=fo·2p/fc;
③ 信號(hào)波形表索引號(hào)、信號(hào)預(yù)存區(qū)索引號(hào)與相位累加和的初始化,即n=0;m=0;Sp=0;
④n=Sp?(p-r);
⑤VRAM[m]=VTAB[n];
⑥m++,Sp+=Kf;
⑦ 若m ⑧ 結(jié)束。 其中④~⑦完成信號(hào)預(yù)存表的初始化。 2) 在DMA中斷中完成動(dòng)態(tài)更新VRAM[m] 上半?yún)^(qū)傳送結(jié)束: ①m=0; ②n=Sp?(p-r); ③VRAM[m]=VTAB[n]; ④m++; ⑤Sp+=Kf; ⑥ 若m ⑦ 結(jié)束。 下半?yún)^(qū)傳送結(jié)束: ①m=NRAM/2 ②n=Sp?(p-r); ③VRAM[m]=VTAB[n]; ④m++; ⑤Sp+=Kf; ⑥ 若m ⑦ 結(jié)束。 為了生成頻率精準(zhǔn)、上限頻率高以及波形質(zhì)量好的信號(hào),應(yīng)盡可能選擇片上嵌有大容量靜態(tài)存儲(chǔ)器(SRAM)、DMA數(shù)據(jù)傳送單元、高頻定時(shí)器以及分辨率高、轉(zhuǎn)換速度快的DAC的嵌入式微控制器。實(shí)驗(yàn)采用國(guó)內(nèi)使用較為普遍的STM32系列中的中高端嵌入式微控制器STM32F407,其主要特色有:頻率為168 MHz的系統(tǒng)時(shí)鐘,192 KB的SRAM,17個(gè)各類定時(shí)器,2路支持多達(dá)64 K個(gè)數(shù)據(jù)循環(huán)數(shù)傳的DMA,2路12位的高速DAC。 首先對(duì)定時(shí)中斷實(shí)現(xiàn)DDS算法生成正弦信號(hào)進(jìn)行實(shí)驗(yàn)測(cè)試。定時(shí)器選用基本定時(shí)器TIM6,其輸入時(shí)鐘頻率為84 MHz。TIM6工作于定時(shí)中斷模式,每中斷一次,中斷服務(wù)程序均完成一次波形表取值、DAC轉(zhuǎn)換、相位累加求和等操作。TIM6的定時(shí)中斷頻率就是DDS的時(shí)鐘頻率fc。CPU完成一次中斷處理的時(shí)間為中斷響應(yīng)時(shí)間、中斷返回時(shí)間與中斷服務(wù)時(shí)間之和,其實(shí)測(cè)值大約為0.5 μs。留出1倍的余量,DDS時(shí)鐘周期取1 μs,相應(yīng)的DDS時(shí)鐘頻率為fc=1 MHz??紤]到該微控制器片上DAC的分辨率為12位,在正弦信號(hào)的1周期內(nèi)取NTAB=4 096個(gè)采樣值構(gòu)成信號(hào)波形表。如果直接采用由式(4)建立的信號(hào)波形表,生成信號(hào)的幅度最大,峰峰值約為3.3 V。實(shí)際中需根據(jù)生成信號(hào)的幅度調(diào)整式(4)的峰峰值。測(cè)試中將生成信號(hào)的峰峰值統(tǒng)一設(shè)定為Vpp=1.0 V,則式(4)的峰峰值大約應(yīng)調(diào)整為1 256。在實(shí)現(xiàn)DDS的過(guò)程中,相位累加和Sp與頻率控制字Kf的字長(zhǎng)均取32位,由式(3)可知生成信號(hào)頻率的理論誤差約為0.000 2 Hz。 實(shí)驗(yàn)中,生成信號(hào)的頻率分別預(yù)設(shè)為10、20、30和100 kHz時(shí),數(shù)字示波器的實(shí)測(cè)波形如圖2所示,同時(shí)也是頻率和峰峰值的測(cè)量值??梢钥闯?生成信號(hào)的頻率非常準(zhǔn)確,頻率為10、20和30 kHz時(shí)信號(hào)的波形非常好,但當(dāng)頻率為100 kHz時(shí),在信號(hào)的波峰和波谷附近的波形不再光滑,明顯由分段直線組成。其實(shí)由于DDS時(shí)鐘頻率fc是固定的,隨著信號(hào)頻率fo的升高,1個(gè)信號(hào)周期內(nèi)離散值的個(gè)數(shù)Ns=fc/fo會(huì)減少。fo=100 kHz時(shí),生成信號(hào)的1個(gè)周期僅用到10個(gè)離散值(Ns=10),生成信號(hào)的波形畸變明顯。為了使生成信號(hào)有較好的波形,通常要求Ns不小于32。Ns=32時(shí)對(duì)應(yīng)的信號(hào)頻率fo大約為30 kHz,因而如果采用STM32F407,要想得到高質(zhì)量的信號(hào)波形,生成信號(hào)的頻率應(yīng)設(shè)在30 kHz以下。 圖2 基于定時(shí)中斷實(shí)現(xiàn)DDS生成正弦信號(hào)的實(shí)測(cè)波形Fig.2 The measured waveform of sine signal generated by DDS algorithm of timing interrupt method 基于DMA實(shí)現(xiàn)DDS生成信號(hào)旨在提高信號(hào)的上限頻率,同時(shí)解決定時(shí)中斷實(shí)現(xiàn)DDS時(shí)進(jìn)入中斷過(guò)于頻繁的問(wèn)題。嵌入式微控制器的基本定時(shí)器TIM6工作于非中斷定時(shí)模式,DMA1工作于將信號(hào)預(yù)存區(qū)中的離散序列循環(huán)發(fā)送至DAC1的工作模式。TIM6的定時(shí)溢出信號(hào)用于連續(xù)觸發(fā)DMA1,而TIM6的定時(shí)溢出率就是DDS的時(shí)鐘頻率。雖然為了提高生成信號(hào)的上限頻率須盡可能提高DDS的時(shí)鐘頻率,但其最高頻率根本上受到DAC1轉(zhuǎn)換速率的限制。實(shí)驗(yàn)表明,數(shù)據(jù)傳送到DAC1的時(shí)間間隔不小于8/84 μs時(shí),數(shù)模轉(zhuǎn)換能夠正常、有效工作。信號(hào)的波形表和預(yù)存區(qū)均由正弦信號(hào)1個(gè)周期內(nèi)的4 096個(gè)波形離散構(gòu)成,生成信號(hào)的峰峰值仍取1.0 V。完全不占用CPU時(shí)間,DMA1不斷將信號(hào)預(yù)存區(qū)中的波形值循環(huán)傳送至DAC1。使能DMA1的半程中斷和全程中斷,每完成2 048個(gè)波形值到DAC1的傳送,CPU將進(jìn)入1次中斷并在中斷服務(wù)程序中基于DDS原理和信號(hào)波形表對(duì)信號(hào)預(yù)存區(qū)進(jìn)行更新。半程中斷時(shí)更新信號(hào)預(yù)存區(qū)上半?yún)^(qū)的2 048個(gè)波形值,全程中斷時(shí)更新信號(hào)預(yù)存區(qū)下半?yún)^(qū)的2 048個(gè)波形值。由于每完成2 048個(gè)波形值的數(shù)模轉(zhuǎn)換后才產(chǎn)生1次中斷,平均而言CPU用于中斷的響應(yīng)和返回時(shí)間可以忽略,而且DMA1將波形值傳送到DAC1的操作不占用CPU的時(shí)間,因此可以有效提高DDS的時(shí)鐘頻率。實(shí)測(cè)表明,1次中斷服務(wù)的用時(shí)大約為120 μs,平均到1個(gè)波形值的中斷服務(wù)時(shí)間大約為0.06 μs,遠(yuǎn)小于DAC1所需的轉(zhuǎn)換時(shí)間。因此實(shí)驗(yàn)中將TIM6的定時(shí)長(zhǎng)度設(shè)為8/84 μs,對(duì)應(yīng)的DDS時(shí)鐘頻率fc=10.5 MHz。DDS過(guò)程中的相位累加和Sp與頻率控制字Kf的字長(zhǎng)仍取32位,由式(3)可知生成信號(hào)頻率的理論誤差約為0.002 Hz。 實(shí)驗(yàn)中,正弦信號(hào)的頻率分別預(yù)設(shè)為100、300、600和1.0 MHz時(shí),生成信號(hào)的示波器實(shí)測(cè)波形如圖3所示??梢钥闯?生成信號(hào)的頻率非常精確;頻率為100、300 kHz時(shí)信號(hào)的波形很好,但300 kHz時(shí)信號(hào)的峰峰值有所下降(850 mV);頻率為600 kHz時(shí),信號(hào)的波形已接近三角波,信號(hào)的峰峰值進(jìn)一步下降(670 mV);頻率為1.0 MHz時(shí),信號(hào)的波形畸變明顯,信號(hào)的峰峰值繼續(xù)下降(434 mV)。 圖3 基于DMA實(shí)現(xiàn)DDS生成正弦信號(hào)的實(shí)測(cè)波形Fig.3 The measured waveform of sine signal generated by DDS algorithm of DMA method 實(shí)驗(yàn)表明,基于DMA實(shí)現(xiàn)DDS所生成的正弦信號(hào),當(dāng)頻率高達(dá)數(shù)百kHz時(shí)信號(hào)的波形依舊很好,信號(hào)的上限頻率得到了顯著提高。顯然,在保證波形質(zhì)量的基礎(chǔ)上,生成信號(hào)頻率的提高主要是DDS時(shí)鐘頻率的提高,進(jìn)而1周期內(nèi)離散波形值的個(gè)數(shù)增多的自然結(jié)果。但是,隨著頻率的不斷提高(大于100 kHz),信號(hào)幅度出現(xiàn)持續(xù)下降,而且當(dāng)頻率高至一定程度時(shí),信號(hào)的波形由正弦波逐漸向三角波演變。分析表明,片上DAC放大器的壓擺率不足是這一現(xiàn)象的直接起因。實(shí)驗(yàn)還表明,當(dāng)信號(hào)的幅度較小時(shí),信號(hào)的幅度和波形質(zhì)量隨頻率的提高而下降的現(xiàn)象明顯減弱。實(shí)際上,當(dāng)信號(hào)幅度減小時(shí),信號(hào)波形的斜率會(huì)隨之減小,壓擺率對(duì)波形的影響自然也隨之減弱。 總之,DMA實(shí)現(xiàn)DDS所生成信號(hào)的性能主要決定于片上DAC及其放大器的性能。為了獲得頻率高、幅度穩(wěn)定且波形畸變小的生成信號(hào),要求嵌入式微控制器的片上DAC的轉(zhuǎn)換速度及其放大器的壓擺率均須足夠高。 本文研究了僅借助嵌入式微控制器的定時(shí)器、DMA與DAC等片上外設(shè),無(wú)需引入DDS專用集成電路,基于定時(shí)中斷或DMA實(shí)現(xiàn)DDS直接生成波形信號(hào)的方法?;诙〞r(shí)中斷實(shí)現(xiàn)DDS生成信號(hào)的方法,適用于片上未嵌入DMA的嵌入式微控制器,但CPU頻繁地出入定時(shí)中斷限制了生成信號(hào)的上限頻率;基于DMA實(shí)現(xiàn)DDS生成信號(hào)的方法,從信號(hào)預(yù)存區(qū)到DAC的傳送由獨(dú)立于CPU并行工作的DMA完成,支持較高的DDS時(shí)鐘頻率,生成信號(hào)的頻率范圍更寬。采用STM32系列的嵌入式微控制器STM32F407,以正弦信號(hào)為例對(duì)兩種方法均進(jìn)行了實(shí)驗(yàn)測(cè)試,結(jié)果表明要生成高質(zhì)量的信號(hào)波形,定時(shí)中斷實(shí)現(xiàn)法所生成信號(hào)的頻率上限為數(shù)十kHz,而DMA實(shí)現(xiàn)法所生成信號(hào)的頻率上限達(dá)數(shù)百kHz。實(shí)驗(yàn)還發(fā)現(xiàn),對(duì)DDS時(shí)鐘頻率較高的DMA實(shí)現(xiàn)法,生成信號(hào)的上限頻率主要受DAC放大器壓擺率的限制。為了獲得更高頻率的信號(hào),在選擇嵌入式微控制器時(shí),不僅要求片上DAC的轉(zhuǎn)換速率足夠高,其放大器的壓擺率也須足夠高。3 實(shí)驗(yàn)與結(jié)果分析


4 結(jié)論