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