在之前的兩篇文章中,我介紹了Boost和Buck電路數(shù)字控制環(huán)路的實現(xiàn)。初步實現(xiàn)了數(shù)字電源的基本PWM調(diào)節(jié)功能,但是也存在一些問題,有以下幾點:
1)不能實現(xiàn)BUCK和BOOST電路的同時工作,本文將以兩電路同時工作為目標(biāo),對軟件進行改進。
2)在輕載或空載時,無法穩(wěn)壓,導(dǎo)致輸出電壓無法穩(wěn)定。這需要在電流采樣電路中加入一個上拉電阻,確保輕載或空載時,PWM脈寬能降為0。
3)將BOOST輸出電壓的采樣通道由AN5移到AN1,因為AN1是獨立的ADC內(nèi)核,而AN5是共享ADC內(nèi)核,所以AN1采樣速度比AN5要快一些。
4)寫入程序后,不能更改兩電路的輸出電壓。在程序中增加串口通訊的功能,通過串口改變輸出電壓。
原理圖和軟件,會在文中附件中提供下載。
1.如何讓兩電路同時工作?
在前面的文中提到,控制環(huán)路的算法是在ADC采樣中斷中進行運算的,如果兩電路同時工作,ADC采樣中斷就有可能發(fā)生沖突(也許沖突導(dǎo)致其中一個中斷產(chǎn)生的延時并不會使環(huán)路不穩(wěn),但是筆者還沒測試過)。為了解決ADC采樣中斷沖突的問題,可以把采樣頻率降低,即不在是每個PWM周期都采樣,而是每兩個PWM周期采樣一次,同時錯開兩個電路的采樣時間(在PWM的配置中可以設(shè)),就能實現(xiàn)同時工作且ADC采樣不會產(chǎn)生沖突。具體設(shè)置如下:
在MCC中,點擊PWM設(shè)置。
因為兩個電路是PWM要同時工作,PWM時基就設(shè)為“主時基”,占空比設(shè)為“主占空比”
“Master Duty Cycle”為“主占空比”,“Period”為“主時基”。這里是將buck和boost的PWM頻率都設(shè)為100KHz,占空比最大為50%。
設(shè)置PWM1
這里將“Duty Cycle Mode”和“Independent Time Base Mode”都選擇“Master”。
請注意,在“Trigger Control”中,如下設(shè)置:
“Output Divider”中選擇“2”,表示每兩個PWM周期觸發(fā)一次ADC采樣,“Postscale Start Enable”中的“0”,表示從dsp上電后的第一個PWM開始計算ADC采樣周期。
PWM2設(shè)置:
這里“Postscaler Start Enable”選擇“1”,表示從dsp上電后第二個PWM周期開始計算ADC采樣時間,這樣PWM1和PWM2的ADC采樣時間就錯開了一個PWM周期,不會產(chǎn)生沖突。
然后進行ADC設(shè)置:(觸發(fā)源應(yīng)為PWM1 Primary和PWM2 Primary)
配置內(nèi)部比較器1、2
當(dāng)完成mcc設(shè)置后,將PI控制環(huán)路的差分方程寫入程序中。
編繹后,燒錄代碼,兩個電路能正常穩(wěn)定工作。輸入電壓為15V,輸出電壓buck電路為4.26V,boost電路為19.95V。至于ADC采樣頻率降低后,對整體控制環(huán)路有什么影響?有時間會在以后的文章中講述。
2.在上一版電路中,存在一個bug,電路空載時,兩電路輸出電壓都會不受抑制的增高,這非常危險。導(dǎo)致這個現(xiàn)象發(fā)生的主要原因是:內(nèi)部比較器在采樣電流信號為零時,并不會使PWM輸出0占空比,即使DAC的輸出為0!這就導(dǎo)致PWM永遠達不到0占空比!解決的方法很簡單,用電阻上拉電流的采樣,使DAC輸出為0時,PWM能達到0占空比。
3.AN5通道的ADC采樣,改到了AN3通道了。
4.增加了串口通訊功能
為了能通過通訊的方式調(diào)整輸出電壓,并且了解電源內(nèi)部的工作狀態(tài),有必要增加串口通訊功能。串口通訊要求按照收到的電壓值輸出電壓,并定時發(fā)送某些狀態(tài)位。需要兩個外設(shè):UART和Timer。用32位Timer2,回調(diào)函數(shù)的執(zhí)行周期為1秒。
Timer定時器中斷和UART中斷全部打開。設(shè)置完成后,生成代碼。
定時器的代碼相對簡單,只需要在定時器2的回調(diào)函數(shù)中寫入發(fā)送函數(shù)(UART1_Write())或接收函數(shù)(UART1_Read())即可。
如果要讀取接收的數(shù)據(jù),就用UART1_Read()函數(shù)。請注意,由mcc自動生成的UART代碼,內(nèi)部定義了一個緩沖區(qū),緩沖區(qū)的大小可以自定義,比如緩沖區(qū)定義了8個字節(jié)。如果上位機一次發(fā)送了8個字節(jié),那么就要用UART1_Read()函數(shù)一次性接收這8個字節(jié)(for循環(huán)8次UART1_Read()函數(shù)),再處理接收的數(shù)據(jù)。當(dāng)dsp接收了8個字節(jié)后,緩沖區(qū)會滿,不及時讀出數(shù)據(jù),將會丟失后面接收到的數(shù)據(jù)。這就要求讀緩沖區(qū)數(shù)據(jù)的頻率要高于UART接收并寫滿緩沖區(qū)的頻率。如果發(fā)了8個字節(jié),只用UART1_Read()函數(shù)接收了7個字節(jié),則下一次再用UART1_Read()函數(shù)則會繼續(xù)接收緩沖區(qū)的第8個字節(jié)。
UART的代碼相對復(fù)雜,但是對于使用者來說只需要用UART1_Read()函數(shù)和UART1_Write()函數(shù)即可。不必關(guān)心內(nèi)部的緩沖機制。
總結(jié):
1)一顆芯片可以控制兩個不同的電路的控制環(huán)路,增大了使用的靈活性。
2)增加了通訊功能,在此基礎(chǔ)上,還可以把dsp內(nèi)部狀態(tài)通過通訊發(fā)送出來。