在上一篇文章中,筆者以buck電路為例,講述了數(shù)字電源內(nèi)部的控制環(huán)路、采樣環(huán)節(jié)是如何數(shù)字化的,以及經(jīng)典的PID算法是如何讓電源穩(wěn)定的。在本文中,將介紹開發(fā)板另一部分的Boost升壓電路是如何配置外設(shè)寄存器的。
現(xiàn)在開始。
主電路如下,是最傳統(tǒng)的電路形式
在上一篇文章中的附件里有開發(fā)板完整的原理圖。先要說明一下,為了能使初學(xué)者更容易明白代碼的結(jié)構(gòu)體系和功能,筆者將上文中的buck電路的程序和本文中的boost電路的程序完全分開,即不能在以前buck程序的基礎(chǔ)上添加boost的程序代碼,否則boost電路工作不正常。代碼分開的好處就是讓初學(xué)者關(guān)注數(shù)字電源本身的功能實現(xiàn),至于兩套電路代碼融合的問題并不是本文關(guān)心的重點。
我們開始編寫boost升壓電路程序代碼。
同樣在MPLAB X IDE中新建一個工程文件。注意是“新建”,不能用上文中的Buck電路的代碼。然后打開MCC。
1)配置系統(tǒng)時鐘
系統(tǒng)時鐘為60MHz,PWM時鐘為240MHz。
2)數(shù)字PWM發(fā)生器
因為是用PWM2發(fā)生器控制Boost主開關(guān)管,所以要配置PWM2的寄存器,PWM1用缺省值。
使能PWM總開關(guān)“Enable PWM”,然后將PWM的開關(guān)周期定為10us(100KHz),最大占空比設(shè)為60%(這是數(shù)字PWM的一大特點,最大占空比是可以設(shè)置的,模擬芯片幾乎不可能實現(xiàn)這一功能)。其中“Primary Duty Cycle”寄存器設(shè)置最大占空比,“Primaty Phase Shift”寄存器確定開關(guān)周期。計算公式如下:
這里240,是在系統(tǒng)時鐘里設(shè)置的PWM工作時鐘240MHz,8是公式的常數(shù),10是需要的PWM開關(guān)周期10us的意思。19192的十六進制數(shù)就是0x4AF8。同理可以算出對應(yīng)60%占空比的“Primary Duty Cycle”寄存器值為0x2D00。但是計算公式稍有不同。
接下來
“1”與buck電路有所不同,boost只是用“PWM2L”控制主開關(guān)MOS管,所以把“PWM2H”關(guān)掉。“2”PWM的輸出形式選擇“冗余輸出”模式。“3”限流比較器是“CMP1”,“4”發(fā)生限流時,“PWM2L PWM2H”都處于關(guān)斷狀態(tài)。“5”表示每個PWM周期要觸發(fā)一次ADC的采樣,采樣頻率越快,控制環(huán)路的帶寬上限越寬。“6”是死區(qū)時間,不同于同步降壓BUCK電路,boost電路不存在兩mos管直通的問題。所以死區(qū)是0。數(shù)字PWM配置完成。
3)ADC配置
和同步buck電路中的ADC配置相似,但是我們將ADC的采樣時間更改為100ns,也可以使電路穩(wěn)定。至于有何種影響,會在后面文章中涉及。注意,boost輸出電壓的ADC采樣用的是AN3通道。并將中斷使能勾選,觸發(fā)源選“PWM2 Primary Trigger”。其它的中斷都應(yīng)該禁止。
4)限流比較器
上文buck電路用的是CMP2,boost要用CMP1,即內(nèi)部比較器1,查看電路圖可以確認。
比較器輸入源是“CMP1B”,完成比較器1的配置。
5)控制環(huán)路的算法
自動生成代碼后,還是在“adc1.c”文件中添加PID算法代碼。先聲明變量
輸出電壓:
將上面的代碼添加至
回調(diào)函數(shù)中。在AN3中斷的回調(diào)函數(shù)中,筆者還加入了“軟啟動”和“開關(guān)控制”的功能,這兩項功能很簡單,并不影響對PID算法的理解。
“軟啟動”讓電路在初次上電時,最大占空比緩慢的從0到設(shè)定值,防止過沖。
“開關(guān)控制”是當X3短路時,boost電路開機工作,有輸出電壓。X3斷開時,boost電路停止工作,輸出電壓為零。
同樣用PI補償器就能使boost控制環(huán)路達到穩(wěn)定。其中Kp=24.6,Ki=0.122
6)控制環(huán)路穩(wěn)定性驗證
用網(wǎng)絡(luò)分析儀測量環(huán)路參數(shù)。額定輸入電壓15V,輸出電壓19.8V
19.8V0.5A(穿越頻率2.2KHz,相位裕度73.5°)
輸出19.8V0.25A(穿越頻率356Hz,相位裕度108.4°)
輸出19.8V0A(穿越頻率120Hz,相位裕度114°)
輸出紋波(0.5A負載,基波95mv,峰峰值1.6V)
負載階躍響應(yīng)(0A至0.5A,向下過沖195mv,恢復(fù)時間1.41ms)
總結(jié):
通過調(diào)整boost控制環(huán)路的PI參數(shù),能使電路有較好的穩(wěn)定性,但是輕載狀態(tài)時的穿越頻率較低,動態(tài)響應(yīng)不夠快,有改進的空間。本例中用到的PID算法雖然有點簡陋和不完善,但也具備使控制環(huán)路穩(wěn)定的能力,實現(xiàn)了數(shù)字電源最基本的功能:穩(wěn)壓及負載變化的快速響應(yīng)。
下面根據(jù)前面內(nèi)容,筆者認為還有一些技術(shù)細節(jié)和讀者探討一下:
1)PID公式中的數(shù)據(jù)是不是用浮點數(shù)據(jù)結(jié)構(gòu)更直觀更簡捷。
其它牌子的dsp筆者還沒用過,但是單就本文中提到的dspic33系列的dsp,筆者曾嘗試將u_N、u_P等這些變量變成float(浮點型)后,單獨一個執(zhí)行PID算法的ADC中斷處理程序就要用去40us的時間,已經(jīng)遠遠超過了一個PWM周期的時間,嚴重影響ADC的觸發(fā)中斷。即使將PWM觸發(fā)ADC采樣的頻率調(diào)整為每5個PWM周期觸發(fā)一次ADC采樣(即控制環(huán)路的帶寬上限為20KHz),用浮點型數(shù)據(jù)也是不行的。因為在實際的數(shù)字電源中,dsp程序內(nèi)還會有其它功能代碼,也是會占用一定的時間的,PID差分方程占用過多的CPU時間,一定會導(dǎo)致其它功能工作不正常。
2)PID公式中的Kp和Ki如何得到
PID中的Kp和Ki可以用多種方式獲得,其實筆者以前的文章中也講述過一種方法,用simplis+matlab。但是得到的是s域的傳遞函數(shù),怎么變成差分方程?matlab中有“雙線性變換”函數(shù),自動完成s域的傳遞函數(shù)到z域中的差分方程的變換。至于是否準確,還要在實際調(diào)試中驗證,即使建模不準確,但也能得到一些基礎(chǔ)數(shù)據(jù),再做調(diào)整就事半功倍了。
在MPLAB X IDE中有一個插件,也可以方便計算出結(jié)果。
如果什么方法都不會,那就一個一個參數(shù)試吧,只要有耐心總是能試出來的。
3)官方開發(fā)板工作頻率為350KHz,為何筆者的開發(fā)板開關(guān)頻率降為100KHz
為了繞過用匯編語言編寫PID算法的代碼,只能將PID的代碼以C語言寫入到ADC中斷里,代價就是C語言的執(zhí)行速度比匯編代碼要慢的多,所以為了適應(yīng)較慢的PID計算速度,我們也只能將開關(guān)頻率降低。經(jīng)過驗證,100KHz的PWM開關(guān)頻率時,C語言代碼在dsp時鐘頻率為60MHz速度下,執(zhí)行PID計算的時間是滿足要求的。
4)電流采樣都沒有斜率補償
按照理論來說,峰值電流型反饋控制系統(tǒng)要求對電流斜坡進行斜率補償,但在buck和boost電路中,pwm驅(qū)動波形都沒有超過50%,所以也就沒有必要補償,而且還減少了一個干擾因素,使環(huán)路設(shè)計更簡單。其實斜坡補償也可以用代碼的方式實現(xiàn),甚至限流比較器都可以用代碼實現(xiàn),這樣才是真正意義上的數(shù)字電源。有時間筆者會在這方面探索一下。
5)官方開發(fā)板代碼內(nèi)容簡介
在這里說說筆者對官方代碼的理解,如有不對請多指出,謝謝。
這是所有代碼的結(jié)構(gòu)圖
“1”main主函數(shù),程序執(zhí)行的入口,里面包括一些出始化的操作和外設(shè)的配置。
“2”這是匯編代碼,包含在系統(tǒng)初始化代碼內(nèi),這段代碼只在程序初始化時執(zhí)行一次。主要的功能就是把要計算的差分方程的參數(shù)裝入CPU內(nèi)核的備用工作寄存器中,目地是在進入或離開ADC中斷時,盡量節(jié)省工作寄存器壓入堆棧和彈出堆棧的時間,從而減少整體ADC中斷處理程序的執(zhí)行時間,這在高頻的PWM應(yīng)用中是非常重要的。在代碼中有下面一條匯編指令:
就是告訴CPU當ADC1有中斷產(chǎn)生時,內(nèi)核要切換到該備用工作寄存器。怎么把ADC中斷與上圖黃色標示出的“CTXTSWP #0x01;”綁定起來?在mcc界面下,“Interrupt Module”選項中,比如,要把ADC1通道中的AN11中斷操作與1號備用工作寄存器綁定,就選擇“CTXT1”。從圖上可以發(fā)現(xiàn),該顆dsp內(nèi)核其中是有4套備用工作寄存器可供切換,意味著dsp內(nèi)核支持多種控制算法的切換,這是數(shù)字電源最大的優(yōu)點之一。
“3”是數(shù)字電源控制環(huán)路的算法,也是用匯編代碼寫的,核心功能很簡單,處理ADC產(chǎn)生的中斷,并調(diào)用庫中的算法函數(shù)。注意,如果是用mcc生成的代碼,一定要在C代碼中,去掉相應(yīng)的ADC中斷處理程序,否則與匯編代碼中的中斷程序產(chǎn)生沖突,不知該執(zhí)行哪個中斷處理程序。前面提到的庫函數(shù)就在“5”,將它包含進工程文件中并且要在“init.h”文件中包含該函數(shù)庫的頭文件。
然后就可以調(diào)用里面的算法了。該算法函數(shù)庫中包含2P2Z、3P3Z、4P4Z和PID等多種算法,方便程序員調(diào)用。具體函數(shù)名稱還是要查看幫助手冊。
“4” 其實是由MPLAB X IDE中的一個插件“Digital Compensator Design Tool”生成的控制環(huán)路的參數(shù),也比較方便易用,筆者用的不多。對此感興趣的讀者可以試試。
以上就是數(shù)字電源控制環(huán)路的主功能,官方軟件代碼中還包括LCD顯示、通訊、負載控制等功能,讀者可以自己探索。