??? 摘? 要: 在詳細闡述正弦脈寬調(diào)制算法的基礎(chǔ)上,,結(jié)合DDS技術(shù),,以Actel FPGA作為控制核心,,通過自然采樣法比較1個三角載波和3個相位差為1 200的正弦波,,利用Verilog HDL語言實現(xiàn)死區(qū)時間可調(diào)的SPWM全數(shù)字算法,,并在Fushion StartKit開發(fā)板上實現(xiàn)SPWM全數(shù)字算法,。通過邏輯分析儀和數(shù)字存儲示波器得到了驗證,為該技術(shù)進一步應(yīng)用和推廣提供了一個良好的開放平臺,。?
??? 關(guān)鍵詞: Actel FPGA,;SPWM;DDS,;Verilog HDL
?
??? 隨著信號處理技術(shù)及集成電路制造工藝的不斷發(fā)展,,全數(shù)字化SPWM(正弦脈寬調(diào)制)算法在調(diào)速領(lǐng)域越來越受到青睞。實現(xiàn)SPWM控制算法的方法很多,,其中模擬比較法因電路復(fù)雜,、且不易與數(shù)字系統(tǒng)連接而很少采用;傳統(tǒng)的微處理器因不能滿足電機控制所要求的較高采樣頻率(≥1 kHz)而逐漸被高性能的DSP硬件系統(tǒng)所取代,但該系統(tǒng)成本高,、設(shè)計復(fù)雜,。與傳統(tǒng)方法相比,在現(xiàn)場可編程邏輯器件FPGA上產(chǎn)生一種新的SPWM控制算法,,具有成本低,、研發(fā)周期短、執(zhí)行速度高,、可擴展能力強等優(yōu)點,。該技術(shù)進一步推動了變頻調(diào)速技術(shù)的發(fā)展。?
??? 本文結(jié)合SPWM算法及FPGA的特點,,以Actel FPGA作為控制核心,,用Verilog HDL語言實現(xiàn)了可編程死區(qū)延時的三相六路SPWM全數(shù)字波形,并在Fushion StartKit開發(fā)板上實現(xiàn)了各功能模塊,,通過邏輯分析儀和數(shù)字存儲示波器上驗證了SPWM波形及死區(qū)時間,,為該技術(shù)進一步應(yīng)用和推廣提供了一個平臺。?
1 Actel Fushion器件介紹[1-2]?
??? Actel Fushion系列器件是一款具有模擬功能的Flash架構(gòu)FPGA,,結(jié)合先進的Flash FPGA數(shù)字技術(shù)和模擬技術(shù),,融合了FPGA數(shù)字內(nèi)核、ADC,、Flash存儲器,、模擬的I/O、RTC等部分,。Fushion器件內(nèi)部具有2 Mbit到8 Mbit不等的用戶可用的Flash存儲器,;30個通道、最高12位精度,、最高600 kS/s采樣率的ADC,;片內(nèi)100 MHz的RC振蕩器與PLL(鎖相環(huán))共同為FPGA提供時鐘;Fushion內(nèi)部40 bit的RTC除支持典型的RTC應(yīng)用外,,還可以控制片內(nèi)1.5 V的電壓調(diào)整器以實現(xiàn)低功耗的睡眠和喚醒模式,。這些特點極大地提高了單芯片的功能,簡化了整個系統(tǒng)設(shè)計,,大幅度減少了電路板面積和系統(tǒng)的總成本,。?
??? Fushion系列AFS600內(nèi)部含有用戶使用的容量為4 Mbit的Flash存儲器,內(nèi)部存儲器模塊以Flash memory Block(FB)形式劃分,,每個FB限制為2 Mbit的空間,,用戶可以單獨使用每個FB塊,也可以自行用邏輯來級聯(lián)所有的FB塊以構(gòu)建大容量的Flash存儲器,。Flash 存儲器讀操作可以從FB陣列,、頁面緩沖區(qū)或狀態(tài)寄存器中讀取數(shù)據(jù),。?
2 數(shù)字系統(tǒng)電路總體設(shè)計方案?
2.1 SPWM算法原理[3]?
??? 正弦脈寬調(diào)制技術(shù)(SPWM)是調(diào)制波為正弦波、載波為三角波或鋸齒波的一種脈寬調(diào)制法,,是現(xiàn)代變頻調(diào)速系統(tǒng)中應(yīng)用最為廣泛的脈寬調(diào)制方式,,目前有自然采樣法、規(guī)則采樣法,、等面積法等,。其中規(guī)則采樣法計算簡單,但諧波含量較大,;一種改進的等面積法諧波含量低,,但計算復(fù)雜,不利于系統(tǒng)實現(xiàn),;自然采樣法是在正弦波和三角波的自然交點時刻控制功率開關(guān)器件的通斷,,是最理想的采樣方法。?
??? 本文采用等腰三角波和三路相差120°的正弦波比較生成SPWM波,,在Fushion StartKit開發(fā)板上采用自然采樣法,,結(jié)合數(shù)字頻率合成技術(shù)DDS,生成死區(qū)延時可調(diào)的SPWM全數(shù)字波形,。?
2.2 數(shù)字系統(tǒng)電路總體方案設(shè)計[4-7]?
??? Verilog HDL硬件描述語言具有很好的易讀性和可重用性,,結(jié)合Verilog HDL硬件描述語言設(shè)計規(guī)范及SPWM工作機理,用自頂向下的分割方法對整個系統(tǒng)進行總體方案設(shè)計,。首先從系統(tǒng)設(shè)計入手,在頂層進行功能方框圖的劃分和結(jié)構(gòu)設(shè)計,。系統(tǒng)頂層功能方框圖如圖1所示,。?
?
?
??? 根據(jù)頂層設(shè)計的思想,采用Verilog HDL語言分別實現(xiàn)各個模塊的設(shè)計,,最后把各個模塊嵌入到頂層模塊中,,使各個模塊有機地組成一個完整的整體。?
3 系統(tǒng)模塊的設(shè)計與實現(xiàn)?
3.1 直接數(shù)字頻率合成模塊[8]?
??? 直接數(shù)字頻率合成DDS是采用數(shù)字化技術(shù),,通過控制頻率控制字直接產(chǎn)生所需的各種不同頻率信號,,突破了模擬頻率合成法的原理,從“相位”的概念出發(fā)進行頻率合成,。這種合成方法不僅可以給出不同頻率的正弦波,,而且還可以給出不同初始相位的正弦波,甚至可以給出各種任意波形,。電路一般包括基準時鐘,、頻率累加器、相位累加器,、幅度/相位轉(zhuǎn)換電路,、D/A 轉(zhuǎn)換器,。在設(shè)計中,將要輸出的波形數(shù)據(jù)(如正弦函數(shù)表)預(yù)先存在ROM(或RAM)單元中,,然后在系統(tǒng)標準時鐘頻率下,,按照一定的順序從ROM(或RAM)單元中讀出數(shù)據(jù),再進行D/A轉(zhuǎn)換,,就可以得到一定頻率的輸出波形,。本設(shè)計直接利用從Flash存儲器的存儲單元中讀出的離散正弦函數(shù)值與生成的三角波進行比較,實現(xiàn)系統(tǒng)的全數(shù)字化要求,。?
3.2 三角波產(chǎn)生模塊?
??? 本模塊采用同步三角波調(diào)制方法,,利用可逆計數(shù)器對輸入時鐘進行計數(shù)。計數(shù)器先執(zhí)行加法,,從0計數(shù)到255,,再執(zhí)行減法計數(shù)從255到0,從而形成三角載波,。如此反復(fù)就可以得到峰峰值255連續(xù)的三角波形,。輸入時鐘是系統(tǒng)時鐘通過鎖相環(huán)輸出的1 MHz的時鐘。?
3.3 建立正弦函數(shù)表?
??? 三角波的幅值范圍在0~255,,而正弦波的幅值在-1~+1之間,,為了實現(xiàn)等幅值比較,將正弦波上移一個單位后,,再將所有值同乘以128,,使正弦波的幅值也在0~255之間。即:?
??? m=128×(sin(x)+1)???????????????????????????????? (1)?
??? 式(1)用C語言對此函數(shù)在一個周期(0~2π)內(nèi)完成768個量化并且直接生成Flash存儲器的初始化文件(.ahx)格式,,再用SmartGen輸入將Flash 存儲器配置成常用的數(shù)據(jù)存儲器,,將預(yù)先生成的.ahx文件導(dǎo)入生成data Storage宏模塊,就建立了正弦函數(shù)表,。生成正弦函數(shù)表的流程圖如圖2所示,。?
3.4 三相正弦波產(chǎn)生和輸出模塊[9,10]?
??? FPGA的Fushion芯片理論上可以實現(xiàn)任何方式的數(shù)學(xué)運算邏輯,,但由于芯片的容量限制,,并不是任何計算都能實現(xiàn)的。因此需事先將正弦函數(shù)離散并加載到FPGA的Flash存儲器中,,在正弦調(diào)制波的離散過程中即可將一個周期完整地離散,。因此,只對其中A相進行離散化處理,,數(shù)據(jù)存儲在Flash存儲器中,,每個數(shù)據(jù)分配1個地址。即可以利用計數(shù)器來產(chǎn)生取正弦波數(shù)據(jù)的地址,,通過數(shù)字頻率合成技術(shù)改變計數(shù)器的計數(shù)頻率就可以改變正弦波的頻率,。這樣即可先輸出一路的正弦波,,另外兩路正弦波產(chǎn)生的方法與此類似,只是起始取數(shù)據(jù)的地址相差120°,,即分別從第256和第512個數(shù)據(jù)開始取數(shù),。?
??? 為了在每個調(diào)制波周期查找正弦函數(shù)表以及分別與載波進行比較,在設(shè)計中采用時分復(fù)用技術(shù),。即依據(jù)三相關(guān)系,,由一個地址計數(shù)器,通過基本量加1轉(zhuǎn)移到另一地址計數(shù)器中,,并且在跳轉(zhuǎn)過程中,,這一地址計數(shù)器加1指向下一單元,從而分時取出三相地址單元的內(nèi)容,。利用對正弦表尋址的高速度,,使一個正弦表在不同時間段查詢不同相的正弦波的幅值,以達到減少正弦表所占用的FPGA資源的目的,。這樣就大大減少了邏輯數(shù)目,,僅增加了地址選擇器和三個同步存儲器,實現(xiàn)了正弦函數(shù)表的復(fù)用,,在很大程度上節(jié)省了芯片的資源,。?
??? 電路的具體實現(xiàn):相位互差120°的三路地址數(shù)據(jù)并行輸入,通過一個三選一的選擇器進行選擇,,選擇器的控制端接三進制的計數(shù)器,。如計數(shù)器為0時,輸出A相地址,,取出A相正弦值,;為1時,輸出B相地址,,取出B相正弦值;為2時,,輸出C相地址,,取出C相正弦值。因此只要使輸入的三相地址周期性變化,,就可實現(xiàn)并行輸入的三相地址數(shù)據(jù)在時間上的連續(xù),,也就實現(xiàn)了三相地址數(shù)據(jù)的合成。其存儲單元功能框圖如圖3,。這樣就可以利用一個正弦表來得到三相的正弦值,,達到減少正弦表占用FPGA資源的目的。?
?
?
??? 查表時每次只能輸出一相的數(shù)據(jù),,所以每次產(chǎn)生的數(shù)據(jù)需利用寄存器先暫存一下,。首先輸出A相,,通過暫存器l存入到A相存儲器;接著輸出B相,,利用暫存器2存入到B相存儲器,;最后輸出C相,利用暫存器3存入到C相存儲器中,。這樣,,三相正弦波數(shù)據(jù)都存儲在各自的存儲器中,這三個寄存器采用同步控制信號,,當(dāng)控制信號觸發(fā)時,,同時輸出三相的正弦波數(shù)據(jù)用于后面的比較。該部分用狀態(tài)機實現(xiàn),,其狀態(tài)轉(zhuǎn)換圖如圖4所示,。?
?
?
??? 其部分程序代碼如下:?
??? case(state1)?
A:???? //初始化狀態(tài)?
??? begin?
??? ? ADDRES1<=addr1;? //時分復(fù)用第一路地址?
??? ? READ_EN<=1′b1,;? //讀使能開?
??? ? NEXT<=1′b1,;???????? //開啟預(yù)讀模式?
??? ? if(addr1==18'd767)??????? //生成地址?
??????? addr1<=18'd0;?
??????? else if (!BUSY)???? //如不忙狀態(tài)開始讀?
??????? ?? begin?
??????? ?? addr1<=addr1+18′d1;//地址自增?
??????? ?? out0<=DATAOUT,;? //數(shù)據(jù)暫存?
??????? ?? state1<=B,;????????? //取第二路數(shù)據(jù)地址?
??????? ?? end?
??? ? end?
B:???? //取第二路數(shù)據(jù)?
??? begin?
??? ? ADDRES1<=addr2;????? //時分復(fù)用第二路地址?
??? ? READ_EN<=1′b1,;?
??? ? NEXT<=1′b1,;?
??? ? if(addr2==18′d767)?
??? ? addr2<=18′d0;?
??? ? else if (!BUSY)?
??? ? begin?
??????? addr2<=addr2+18′d1,;?
??????? out1<=DATAOUT,;?
??????? state1<=C;?
??????? end?
??? ? end?
C:???? //取第三路數(shù)據(jù)?
??? begin?
??? ? ADDRES1<=addr3,;????? //時分復(fù)用第三路地址?
??? ? READ_EN<=1′b1,;?
??? ? NEXT<=1′b1;?
??? ? if(addr3==18′d767)?
??? ? addr3<=18′d0,;?
??? ? else if (!BUSY)?
??????? begin?
??????? addr3<=addr3+18′d1,;?
??????? out2<=DATAOUT;?
??????? state1<=D,;?
??? ??? end?
??? ? end?
D:???? //空操作狀態(tài)?
??? begin?
??? ? state1<=E,;?
??? ? end?
E:???? //數(shù)據(jù)存儲,同時取出三路數(shù)據(jù)?
??? begin?
??? ? outdata0<=out0,;?
??? ? outdata1<=out1,;?
??? ? outdata2<=out2;?
??? ? state1<=A,;?
??? end?
??? endcase?
3.5 三角波與正弦波比較控制模塊?
??? 該模塊用于輸出三相六路SPWM脈沖序列,。用模塊1中輸出的三角波分別與模塊4輸出的三相正弦波相比較,,從而先得到三路SPWM脈沖序列。當(dāng)正弦波數(shù)據(jù)大于三角波數(shù)據(jù)時,,輸出高電平,;反之,輸出低電平,。每相輸出又分為互補的兩路輸出,,利用一個逆變器對輸入波形取反,就可以得到與SPWM脈沖序列互補的波形,。?
??? 其部分程序代碼如下:?
??? always@(outdata0 or outdata1 or outdata2 or out2)//比較器?
??????? begin?
??????? ?? if(outdata0>out2)?
?? ??????????????? outdata4=1,;?
??????? ?? else outdata4=0;?
??????? ?? if(outdata1>out2)?
????? ???????????? outdata5=1;?
??????? ?? else outdata5=0,;?
??????? ?? if(outdata2>out2)?
???????? ????????? outdata6=1,;?
??????? ?? else? ? outdata6=0;?
??????? end?
3.6 時延控制死區(qū)輸出模塊?
??? 對于SPWM三相橋式逆變器,,由于開關(guān)管固有開關(guān)時間Ts的影響,,開通時間Ton往往小于關(guān)斷時間Tof,因此容易發(fā)生同臂兩只開關(guān)管同時導(dǎo)通的短路故障,。為了避免這種故障的發(fā)生,,通常要設(shè)置開關(guān)死區(qū)ΔT,以保證同橋臂上的一只開關(guān)管可靠關(guān)斷后,,另一只開關(guān)管才能開通,。死區(qū)的設(shè)置方式有兩種:一種是提前關(guān)斷、延時開通的雙邊對稱設(shè)置,;另一種是按時關(guān)斷,、延滯Δt開通的單邊不對稱設(shè)置。根據(jù)FPGA的編程特點,,選擇了按時關(guān)斷,、延滯Δt開通的單邊不對稱設(shè)置,,并且時延死區(qū)的調(diào)節(jié)與控制與時延控制死區(qū)模塊的輸入時鐘clk有關(guān),。?
??? 根據(jù)延時模塊中延時信息:Δt=2×Tclk ?
??? clk是鎖相環(huán)輸出時鐘CLK 1 MHz(本文采用的是1 MHz)的2次分頻得到的時鐘,只要改變頂層模塊中對CLK 1 MHz的分頻系數(shù),,就可以精確控制延滯Δt的大小,,本文計算值Δt=4μs,。?
??? 另外,,死區(qū)調(diào)節(jié)單元還能消除由于FPGA器件本身時延造成的毛刺,。其部分死區(qū)控制程序代碼如下:?
??? always@(posedge clk or posedge rst)?
??? begin?
??? ?? if(rst)????????????? //異步復(fù)位?
??????????? begin?????? //初始化寄存器?
??????????? q<=0;?
??????????? q0<=0,;?
??????????? end?
?? else?
??? ?? begin??????????????? //延時輸出的D觸發(fā)器?
??????????? ?? if(d)?
??????????? ???? begin?
??????????? q0<=1′b1,;?
??????????? q<=q0,;?
??????????? ???? end?
??????????? ?? else?
??????????? ?? begin??????? //立即清零?
??????????? ?? q<=0;?
??????????? ?? q0<=0,;?
??????????? ?? end?
??????????? end?
??? end?
??? 有關(guān)clk生成與調(diào)節(jié)的程序代碼如下:?
??? always@(posedge CLK1M or posedge rst)?//分頻產(chǎn)生時延控制時鐘?
??? begin ?
??? ?? if(rst)????????? //異步復(fù)位?
??????? begin?
??????? clk<=0,;??????? //時鐘初始狀態(tài)清零?
??????? couter<=0; //計數(shù)初值設(shè)置零?
??????? end?
??? ?? else ?
??????????? begin?
??????????? if(couter==2′b01)?
??????????? begin?
??????????? ? clk<=~clk,;?
??????????? ? couter<=0,;?
??????????? end?
??????????? else?
??????????? couter<=couter+1′b1;? //計數(shù)器加1?
??????????? end?
??? end?
3.7 時鐘輸出控制模塊?
??? FushionAFS600器件的系統(tǒng)時鐘是48 MHz,,因本設(shè)計正弦波的掃描頻率和三角波的掃描頻率預(yù)設(shè)為1 MHz,,為減少時鐘輸出模塊的數(shù)量以及能方便更改系統(tǒng)輸出SPWM波形的占空比和頻率,本設(shè)計充分利用Fushion器件的時鐘調(diào)整電路,,用SmartGen生成一個靜態(tài)PLL宏模塊,,把系統(tǒng)時鐘分頻成1 MHz的時鐘分別是CLK 1 M和CLK 2 M,并連接到全局網(wǎng)絡(luò)上,。當(dāng)需要一定頻率和不同占空比的SPWM脈沖時,,只需計算出載波和調(diào)制波形的掃描頻率,而后直接在SmartGen宏模塊中修改靜態(tài)PLL輸出時鐘,,就可實現(xiàn)輸出SPWM波形密度的控制與調(diào)節(jié),,從而滿足各種工作頻率的需求。?
4 基于FPGA的SPWM實現(xiàn)及系統(tǒng)測試?
4.1 SPWM控制技術(shù)的FPGA實現(xiàn)?
??? 根據(jù)頂層功能圖(如圖1),,分別用Verilog HDL語言和SmartGen輸入描述了各個功能單元模塊,,并分別在Libero 8.1集成開發(fā)環(huán)境下通過編譯和仿真驗證。最后用Verilog HDL語言編寫一個頂層模塊實現(xiàn)各個功能模塊的有機組合,,以實現(xiàn)總體功能,,再在Libero 8.1集成開發(fā)環(huán)境下進行編譯、邏輯綜合,、布局布線后下載到目標器件Fushion AFS600器件FPGA上,,實現(xiàn)了三相六路可控SPWM全數(shù)字算法的片上系統(tǒng)。?
4.2 系統(tǒng)測試結(jié)果?
??? 圖5是從邏輯分析儀上對系統(tǒng)測試的結(jié)果,。從圖中可以看出所設(shè)計電路完全符合功能要求,,且觀測到的時延死區(qū)時間均為4 μs,與理論計算值一致,。下載后觀測與功能仿真,,布局布線后仿真圖形也都完全一樣,達到了設(shè)計的預(yù)期要求,。?
?
?
圖5? 邏輯分析儀測試時序結(jié)果
?
參考文獻?
[1] 周立功.Actel FPGA實驗教程[M].廣州:廣州致遠電子有限公司,,2007,10.?
[2] 周立功.Actel FPGA原理與應(yīng)用[M].廣州:廣州致遠電子有限公司,2007,,10.?
[3] 劉鳳君.正弦波逆變器[M].北京:科學(xué)出版社,,2002,2.?
[4] 夏宇聞.Verilog 數(shù)字系統(tǒng)設(shè)計教程[M].北京:北京航空航天大學(xué)出版社,,2007,,1.?
[5] 王偉.Verilog HDL程序設(shè)計與應(yīng)用[M].北京:人民郵電出版社,2005,,3.?
[6] 陳尚松,,雷加.電子測量與儀器[M].北京:電子工業(yè)出版社,2007,,2.?
[7] 王金明.Verilog HDL程序設(shè)計教程[M].北京:人民郵電出版社,,2004,1.?
[8] 譚浩強.C語言程序設(shè)計(第二版)[M].北京:清華大學(xué)出版社,,2006,,1.?
[9] 陳利杰,董煥芝.SPWM信號產(chǎn)生系統(tǒng)IP軟核設(shè)計及驗證[J].包頭鋼鐵學(xué)院學(xué)報,,2005,,24(4):364-368.?
[10] 楊旭東,張強.SPWM的FPGA實現(xiàn)方法.微計算機信息[J].(嵌入式與SOC),,2006,,12(2):145-147.