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