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