陳硯圃,劉 含,郭 博,石立春
(1.西京學院計算機學院,陜西 西安 710123;2.西京學院電子信息學院,陜西 西安 710123)
波形信號生成技術在引信、遙測、通信、導航、雷達等領域的應用極其廣泛[1-4]。直接數字頻率合成(DDS)技術[5]能夠對信號的頻率、相位、幅度等參數進行精確控制,是多年來普遍采用的波形信號生成方法。基于DDS專用芯片[1-4]或FPGA[6-10]技術生成波形信號是目前最常見的兩種解決方案。另外,隨著嵌入式微控制器的主頻、CPU處理字長、存儲容量的提高以及其片上外設越來越豐富,電子裝置中更多的功能直接由嵌入式微控制器實現已成自然趨勢。為了降低電路的復雜性并提高系統的靈活性與可靠性,本文對基于嵌入式微控制器直接實現DDS而生成波形信號的方法進行研究。
基于定時中斷實現DDS生成波形信號的方法簡單、直接,但頻繁的定時中斷使生成信號的頻率范圍受限,進一步提出基于直接存儲器存取(DMA)實現DDS生成波形信號的方法,數據從信號預存區到數模轉換(DAC)的傳送由并行于CPU工作的DMA完成,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生成信號的頻率就足夠精確。
利用嵌入式微控制器實現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)可知生成信號的上限頻率受限。
為了解決定時中斷實現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 ⑦ 結束。 為了生成頻率精準、上限頻率高以及波形質量好的信號,應盡可能選擇片上嵌有大容量靜態存儲器(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的轉換速度及其放大器的壓擺率均須足夠高。 本文研究了僅借助嵌入式微控制器的定時器、DMA與DAC等片上外設,無需引入DDS專用集成電路,基于定時中斷或DMA實現DDS直接生成波形信號的方法。基于定時中斷實現DDS生成信號的方法,適用于片上未嵌入DMA的嵌入式微控制器,但CPU頻繁地出入定時中斷限制了生成信號的上限頻率;基于DMA實現DDS生成信號的方法,從信號預存區到DAC的傳送由獨立于CPU并行工作的DMA完成,支持較高的DDS時鐘頻率,生成信號的頻率范圍更寬。采用STM32系列的嵌入式微控制器STM32F407,以正弦信號為例對兩種方法均進行了實驗測試,結果表明要生成高質量的信號波形,定時中斷實現法所生成信號的頻率上限為數十kHz,而DMA實現法所生成信號的頻率上限達數百kHz。實驗還發現,對DDS時鐘頻率較高的DMA實現法,生成信號的上限頻率主要受DAC放大器壓擺率的限制。為了獲得更高頻率的信號,在選擇嵌入式微控制器時,不僅要求片上DAC的轉換速率足夠高,其放大器的壓擺率也須足夠高。3 實驗與結果分析


4 結論