寄語
提示:若想實(shí)戰(zhàn)演練,請(qǐng)先熟悉文章操作流程哦,不然會(huì)有危險(xiǎn)??!
我建了一個(gè)群,分享我個(gè)人做項(xiàng)目的經(jīng)歷和資源,純個(gè)人愛好,一切免費(fèi),看自己空閑時(shí)間答疑,有想法的可以加QQ群280730348
大家好!鴿了兩個(gè)月的電路博主回歸啦,這段時(shí)間一直在忙研究生開學(xué)的事兒,也算是適應(yīng)了環(huán)境。加上最近到網(wǎng)上弄了一個(gè)boost電路的單子,正好趁這個(gè)機(jī)會(huì),給想要做Boost升壓電路的小伙伴們,一次實(shí)戰(zhàn)演練交流!
下面是注意事項(xiàng):
- Boost電路在開始測(cè)試時(shí)建議接一個(gè)大電阻的輸出負(fù)載,原因在于輸出帶有電容,電容一直在儲(chǔ)能,給電容電壓一個(gè)輸出。博主實(shí)測(cè)過,Buck電路空載測(cè)試沒問題,但是Boost電路不要空載測(cè)試,實(shí)際電感充電時(shí)間會(huì)很小,容易擊穿濾波電容。
- 板載一個(gè)啟動(dòng)按鍵,控制PID追蹤的啟動(dòng)和關(guān)閉,初始為關(guān)閉。按一下就能開啟,再按一下就會(huì)關(guān)閉。
- PWM1和PWM2的接線一定要對(duì)應(yīng)好,由于是高級(jí)定時(shí)器一互補(bǔ)輸出,所以軟件內(nèi)部只需要給一個(gè)PWM值就能控制兩路輸出。PWM1和2接反會(huì)導(dǎo)致占空比反過來控制,比如本來20%的占空比對(duì)應(yīng)輸出15V,但是PWM1和2接反就會(huì)導(dǎo)致80%的占空比,輸出電壓會(huì)飆上去。
- 先開控制器電源,再開主電路供電電壓,順序不能反。
什么是BOOST電路
如上圖所示,這是最為基礎(chǔ)的Boost升壓拓?fù)?,包含六個(gè)器件,從左至右分別是:
直流電源、儲(chǔ)能電感、開關(guān)管、肖特基二極管、儲(chǔ)能電容、負(fù)載
- 直流電源提供輸入電壓
- 儲(chǔ)能電感交換能量
- 開關(guān)管實(shí)現(xiàn)電路的開啟和斷開
- 肖特基二極管實(shí)現(xiàn)電路的被動(dòng)開關(guān)斷
- 儲(chǔ)能電容實(shí)現(xiàn)對(duì)電壓的儲(chǔ)能
- 負(fù)載,顧名思義,消耗能量
電路的核心在于儲(chǔ)能電感和開關(guān)管,在小功率場合下,博主喜歡用Mos管作為開關(guān)器件。Mos管的特性就在于是電壓控制器件,拿常見的IRF3205Mos管來說,總共有三個(gè)管腳,分別是G、D、S。想要控制開關(guān)管很簡單,只需在GS端加上一定的電壓,就可以控制DS導(dǎo)通或者斷開,我們其實(shí)可以把Mos管看作一種高速的機(jī)械開關(guān)。
那我們來說一下電路的原理,如何實(shí)現(xiàn)電能的變化呢?關(guān)鍵點(diǎn)就在高速開關(guān)狀態(tài)下的電感儲(chǔ)能。電路總共存在著兩個(gè)工作狀態(tài),一個(gè)是開關(guān)管導(dǎo)通的工作狀態(tài),一個(gè)是開關(guān)管截至的工作狀態(tài)。
首先我們看第一種工作狀態(tài),開關(guān)管處于導(dǎo)通狀態(tài)。導(dǎo)通狀態(tài)時(shí),電流是怎么流通的呢?首先電流肯定會(huì)從輸入電源流入進(jìn)來,經(jīng)過儲(chǔ)能電感,此處我們注意,電流的流經(jīng)方向是從左至右。當(dāng)電流流經(jīng)到Mos管和肖特基二極管的交點(diǎn)時(shí),是不是就要考慮往哪個(gè)方向走了?那么很簡單,記住這一點(diǎn),電流總會(huì)往更容易流的地方跑。Mos管的特性就是導(dǎo)通電阻很小,相較于二極管而言,它對(duì)電流非常友好,所以在都可以走的前提下,電流會(huì)非常高興的往Mos管那塊跑。所以根據(jù)這個(gè)特性,電流流到了Mos管后,接下來就不會(huì)往負(fù)載那邊流了,而是回到了電壓輸入負(fù)極,這樣就完成了第一種工作狀態(tài)。這個(gè)時(shí)候咱們的輸出電壓等于多少?其實(shí)就等于儲(chǔ)能電容的電壓大小,而儲(chǔ)能電容電壓大小其實(shí)就是輸入電壓減去二極管的壓降電壓,因此我們就可以得知這種狀態(tài)下的輸出電壓。
那么我們?cè)倏吹诙N工作狀態(tài),開關(guān)管處于截至狀態(tài)。開關(guān)管處于截至狀態(tài)時(shí),其實(shí)就相當(dāng)于開關(guān)斷開。這個(gè)時(shí)候電流沒路可走了呀,所以就只能往肖特基二極管的那個(gè)方向走了,那么電流的方向就是流經(jīng)電感再經(jīng)過肖特基二極管再流向負(fù)載再回到輸入電壓的負(fù)極了。這個(gè)時(shí)候,由于負(fù)載能夠消耗我們的電能了,所以咱們電路中的能量,就要全部往外提供了,怎么辦,就不能給電感充電了。這個(gè)時(shí)候,電感就生氣了,說不給我吃飯是吧,我給你對(duì)著干,于是在電感兩端,就產(chǎn)生了與電流方向相反的電動(dòng)勢(shì),也就是左負(fù)右正的反向電動(dòng)勢(shì)。為什么會(huì)產(chǎn)生反向電動(dòng)勢(shì)呢,其實(shí)跟電感本身的特性相關(guān),這個(gè)請(qǐng)自行查閱相關(guān)知識(shí)啦。我們知道,這個(gè)反向電動(dòng)勢(shì)其實(shí)跟第一種工作狀態(tài)下的充電時(shí)長有關(guān)系,充電的時(shí)間越長,反向電動(dòng)勢(shì)就越大。我們可以畫一畫電路圖,此時(shí)輸出的電壓等于啥子,就等于輸入電壓加上反向電動(dòng)勢(shì)再減去肖特基二極管的壓降。是不是就得到了比之前電壓更高的直流電壓了呢?
好了明白了這兩種工作狀態(tài),我們從宏觀的角度來看,輸出電壓變高主要由什么來決定呢?答案是電感的反電動(dòng)勢(shì)的大小,而電感的反電動(dòng)勢(shì)大小與充電時(shí)長有關(guān)系,也就是說我們電感充電越久,第一種工作狀態(tài)越久,那么充電時(shí)長就會(huì)越久,電感的反電動(dòng)勢(shì)自然會(huì)越高,自然從宏觀角度來看輸出電壓就會(huì)越高。當(dāng)然電感不可能一直充電,boost電路也不可能把小電壓無限升高,這個(gè)過程跟很多因素有關(guān)。按照經(jīng)驗(yàn)來說,一般boost電路充電時(shí)間不要長于一個(gè)周期的90%,當(dāng)然也跟你的儲(chǔ)能電容有關(guān)系,假設(shè)你儲(chǔ)能電容只能扛100V,你占空比拉到90%的話,輸出電壓加到了200V,這個(gè)時(shí)候你可能就會(huì)體驗(yàn)到電容開花的效果哦。
好了,那么簡單總結(jié)就是,我們單片機(jī)只需要輸出一個(gè)PWM,通過控制PWM的占空比,可以改變輸出電壓的大小。占空比越高,輸出電壓越高,占空比越低,輸出電壓越低。占空比與輸入電壓輸出電壓的關(guān)系是:D=(VO-VI)/VO,其中輸出電壓為VO,輸入電壓為VI,輸出電壓一般都會(huì)比輸入電壓要高,當(dāng)然肖特基二極管還是會(huì)有壓降的(為了嚴(yán)謹(jǐn)?。?/p>
BOOST同步升壓電路
我們來引入一個(gè)新的概念,叫做同步升壓。
萬事萬物都有其存在合理性,為什么要有這玩意兒的存在,原因無他,我們要把開關(guān)電源的優(yōu)勢(shì)體現(xiàn)出來。優(yōu)勢(shì)是啥,無非就是低損耗高效率唄。基本的boost拓?fù)浣Y(jié)構(gòu)顯而易見的缺點(diǎn)是什么?很明顯呀,那個(gè)肖特基二極管你看著他不礙眼么,反正我是瞅著他不咋順眼,二極管那是啥,被動(dòng)導(dǎo)通,抵抗能力杠杠強(qiáng),損耗也大。那我們換個(gè)思路,找個(gè)主動(dòng)的器件,不咋抵抗,不挺好么!
瞧,想主動(dòng),那我們可不可以把肖特基二極管,換成導(dǎo)通電阻超小的Mos管呢,答案是,當(dāng)然沒有問題。這樣下來,電路中就有兩個(gè)Mos管了,話不多說直接上圖:
為了電路安全著想,在同一瞬間,我們要保證兩個(gè)Mos管只有一個(gè)導(dǎo)通,他們兩個(gè)Mos管可以同時(shí)截至,但是不能同時(shí)導(dǎo)通,為什么呢?因?yàn)閮蓚€(gè)導(dǎo)通電阻都很小,電流去哪一路都沒問題,這個(gè)時(shí)候他們就會(huì)很糾結(jié),糾結(jié)的話就會(huì)拉幫結(jié)派,然后干架,這樣電流就會(huì)順利的引爆你的電路,給你干穿。
那其實(shí)只要讓他們工作狀態(tài)完全相反即可,我們可以利用芯片去實(shí)現(xiàn)。比如半橋驅(qū)動(dòng)芯片IR2104S,根據(jù)它的外圍電路,你只需要輸入一個(gè)PWM信號(hào),輸出就能得到LO和HO兩路輸出信號(hào),其中HO信號(hào)與輸入PWM信號(hào)相同,LO信號(hào)與輸入信號(hào)相反。
還有一種方式是直接通過軟件去實(shí)現(xiàn),拿STM32F103C8T6來講,其內(nèi)部的高級(jí)定時(shí)器存在著一個(gè)功能是互補(bǔ)輸出。比如TIM1的CH1為PA8,TIM1的CH1N為PB13,這兩個(gè)口只要設(shè)置好了,你只需要控制TIM1的CH1通道PWM輸出,就可以控制兩路相反的PWM輸出。我們今天的方案就拿第二種方式來弄!
設(shè)計(jì)要求
由于博主已經(jīng)脫離了電力電子實(shí)驗(yàn)室,非常無奈,手頭上連個(gè)滑動(dòng)變阻器都沒有,別問,問就是沒錢。就只能做這種小的,能夠承受的,當(dāng)然根據(jù)博主之前設(shè)計(jì)的經(jīng)驗(yàn),我的這種拓?fù)浣Y(jié)構(gòu),散熱弄好了100w輕輕松松?,F(xiàn)在就當(dāng)給大伙兒打個(gè)樣,入入門~
設(shè)計(jì)方案
設(shè)計(jì)方案如下:主電路選用boost同步升壓拓?fù)?/mark>,驅(qū)動(dòng)電路選擇光耦驅(qū)動(dòng)。選用STM32F103C8T6作為此次電路的MCU控制單元,其中驅(qū)動(dòng)電路的輸入兩路PWM為MCU的高級(jí)定時(shí)器一輸出互補(bǔ)的PWM波,電壓檢測(cè)單元通過運(yùn)放采集輸出電壓并縮放10倍左右,送入單片機(jī)內(nèi)部進(jìn)行檢測(cè),當(dāng)單片機(jī)檢測(cè)到了電壓后經(jīng)過運(yùn)算顯示到OLED屏幕上。內(nèi)部采用PID算法對(duì)輸出電壓進(jìn)行跟蹤,若輸出電壓大于目標(biāo)電壓值則降低boost電路的占空比,若輸出電壓小于目標(biāo)值則提高boost電路的占空比。
這里插一句專業(yè)的,開關(guān)電源內(nèi)部的損耗大致可以分為:開關(guān)損耗、導(dǎo)通損耗、附加損耗和電阻損耗,其中開關(guān)損耗和導(dǎo)通損耗是典型的開關(guān)電源內(nèi)部最主要的兩個(gè)損耗源,控制這兩個(gè)損耗的典型方法是使功率開關(guān)導(dǎo)通期間的電壓降最小。采用同步整流技術(shù),將效率提高1%~6%;選取導(dǎo)通電阻更低、滿足要求的開關(guān)管;確保開關(guān)管工作在飽和狀態(tài),具有足夠驅(qū)動(dòng)能力;電感選用鐵硅鋁磁芯,降低鐵損。
Mos管選型:其實(shí)主要就是看DS可承受電壓,導(dǎo)通電阻和電流,我這里選的是IRF3205,導(dǎo)通電阻6.5mΩ左右,很不錯(cuò)。DS電壓55V左右,具體的話去看手冊(cè)吧,記得根據(jù)你輸出最大電壓選型,不要超過了DS電壓,最好是留一點(diǎn)閾值。
儲(chǔ)能電感選型:打公式比較麻煩,我直接截圖
儲(chǔ)能電容選型:無它,手熟而,我的經(jīng)驗(yàn)選型330uf,50V左右即可。
驅(qū)動(dòng)電路
它還是值得單獨(dú)拿出來講講的,我還是對(duì)光耦驅(qū)動(dòng)情有獨(dú)鐘,為什么呢?光耦可隔離呀,燒光耦還是燒我的單片機(jī),這個(gè)我還是分得清楚的。之前的IR2104存在的一個(gè)弊病就是,他不隔離,如果你芯片燒了很有可能就波及到IR2104了,所以用光耦隔離一下,可以有效降低危險(xiǎn)。
驅(qū)動(dòng)電路的話通過光耦驅(qū)動(dòng)芯片TLP250H進(jìn)行驅(qū)動(dòng)。別用TLP250,因?yàn)楣怦钜卜指哳l和低頻,我受過罪
,整體驅(qū)動(dòng)電路采用自舉驅(qū)動(dòng)的原理。驅(qū)動(dòng)的PWM波通過單片機(jī)產(chǎn)生,單片機(jī)通過高級(jí)定時(shí)器一產(chǎn)生互補(bǔ)的PWM波,分別稱之為PWM1和PWM2。因?yàn)閱纹瑱C(jī)開關(guān)頻率有時(shí)候會(huì)受到外界的干擾,TLP250H這個(gè)光耦芯片也有一定的開關(guān)頻率限制,因此通過反相器74HC04產(chǎn)生反向的波形,以此來限制住開關(guān)的速度大小。輸出采取自舉驅(qū)動(dòng)原理,本質(zhì)上就是通過自舉二極管RS1M也可以用ss34和ss56,主要看可以承受的反向電壓,我是一勞永逸,RS1M可以承受反向電壓1KV,這個(gè)反向電壓跟你電路最大輸出有關(guān)系的
和自舉電容2.2UF來實(shí)現(xiàn)對(duì)HO1開關(guān)的充電放電,從而使得電路圖中的Q2開關(guān)斷。此處請(qǐng)自行搜索自舉電路的驅(qū)動(dòng)原理
整體存在著兩種工作狀態(tài)
第一種狀態(tài)是PWM1為高電平,PWM2為低電平。這種情況下通過反相器在U27的光電二極管的陰極得到了PWM1的反向信號(hào)低電平,在U26的光電二極管的陰極得到了PWM2的反向信號(hào)高電平。因此在這一瞬間,由于U26光電二極管沒有產(chǎn)生電壓差,U27產(chǎn)生了電壓差,故U26光電二極管未導(dǎo)通,不能產(chǎn)生光電信號(hào),U27可以產(chǎn)生光電信號(hào),LO1吸收能量產(chǎn)生高電平,HO1未吸收能量產(chǎn)生低電平。因此在輸出端口處HO1驅(qū)動(dòng)的mos管閉合,LO1驅(qū)動(dòng)的mos管開啟。
第二種狀態(tài)與第一種完全相反,即HO1驅(qū)動(dòng)的mos管開啟,LO1驅(qū)動(dòng)的mos管關(guān)閉。
電壓采樣電路
直流電壓采樣電路如下,通過運(yùn)放實(shí)現(xiàn)采集電壓的縮放。VOUT是我們檢測(cè)到的直流電壓,這個(gè)地方可以直接連接到主電路的輸出電壓口,假設(shè)輸出電壓是15V,通過R31和R32電阻分壓,在運(yùn)放的3號(hào)口能得到15V1/(10+1)的電壓也就是15/11v。根據(jù)運(yùn)放的虛短虛斷,2號(hào)口電壓也為15/11v。再通過R25和R23電阻分壓,在運(yùn)放的1號(hào)口得到15/1111/10=1.5v的電壓。再通過一個(gè)電壓跟隨器降低電壓阻抗,最終到輸出電壓口得到1,5V電壓。因此輸入15V電壓,可以輸出1.5V電壓。這個(gè)1.5V的電壓送入單片機(jī)內(nèi)部進(jìn)行檢測(cè),當(dāng)單片機(jī)檢測(cè)到1.5V以后,通過內(nèi)部乘以電壓系數(shù)就能夠得到正確的輸出電壓。此處電壓縮放比為10倍,通過改變R25和R24的大小,即可得到不同的縮放倍數(shù)。
總體電路
代碼
代碼部分的話,我就講幾個(gè)比較關(guān)鍵的點(diǎn)兒吧
主電路代碼
注釋的比較詳細(xì)了,while循環(huán)里面其實(shí)就是對(duì)啟動(dòng)按鍵進(jìn)行一個(gè)掃描已經(jīng)OLED顯示屏顯示輸出電壓和目標(biāo)電壓,這個(gè)加VOUT+0.11的意思是其實(shí)是一種矯正,因?yàn)橥ㄟ^軟件仿真我看到追蹤的電壓一直在14.89附近,實(shí)際測(cè)得電壓又是15.02V,所以就懶得改了。其實(shí)只要改個(gè)電壓系數(shù)就好了,我圖省事兒大家不要學(xué)我哈。
//主電路代碼
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "show.h"
#include "oled.h"
#include "adc.h"
#include "key.h"
#include "main.h"
#include "pid.h"
//接線定義
/*
OLED屏幕:SDA->PA5 SCL->PA6
電壓檢測(cè):電壓->PB0
啟動(dòng)關(guān)閉按鍵:PA11
boost輸出:PWM1->PA8,PWM2->PB13
*/
//定義參數(shù)
float V_OUT=0; //檢測(cè)到的顯示輸出電壓
float now_v=0.0f;//檢測(cè)到的當(dāng)前輸出電壓
float target_v=15.00f;//追蹤的目標(biāo)值
u16 pwm=0; //輸出的占空比
u8 work_mode=0; //為0的時(shí)候PID不工作,為1的時(shí)候PID工作
int main(void)
{
u8 key;
delay_init(); //延時(shí)函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口初始化為115200
Init_adc(); //初始化ADC
KEY_Init();
init_boost_PID(15.0);
TIM2_Int_Init(9999,71); //初始化定時(shí)器,每次執(zhí)行定時(shí)時(shí)間為10ms,執(zhí)行一次PID
TIM3_Int_Init(999,71); //初始化定時(shí)器,每次執(zhí)行定時(shí)時(shí)間為1ms,500ms執(zhí)行一次電壓平均
BOOST_PWM_Init(); //初始化boost電路輸出,開關(guān)頻率20KHz
OLED_Init(); //初始化OLED
OLED_Clear(); //清屏OLED
start_view();
while(1)
{
key=KEY_Scan(1);
if(key==KEY0_PRES)work_mode=!work_mode;
OLED_ShowNum(72,3,(u16)(V_OUT+0.11),2,16); //顯示輸出直流電壓整數(shù)位
OLED_ShowNum(96,3,(u16)((V_OUT+0.11)*100)%100,2,16); //顯示輸出直流電壓小數(shù)位
OLED_ShowNum(72,5,(u16)target_v,2,16); //顯示輸出直流電壓整數(shù)位
OLED_ShowNum(96,5,(u16)(target_v*100)%100,2,16); //顯示輸出直流電壓小數(shù)位
}
}
定時(shí)器代碼
定時(shí)器二的作用是執(zhí)行PID,每隔10ms執(zhí)行一次PID。work_mode這個(gè)參數(shù)是通過按鍵掃描來改變的,等于1就啟動(dòng)PID,=0就把占空比拉到一個(gè)定值,避免過壓。boost_pid是PID里面的一個(gè)函數(shù),就是進(jìn)行一個(gè)PID的運(yùn)算,這里為了看效果,PID的參數(shù)沒有調(diào)很大。
定時(shí)器三的作用是每隔1ms采集一次電壓數(shù)據(jù),累計(jì)500次以后取一個(gè)平均,這樣顯示的數(shù)據(jù)就會(huì)更加穩(wěn)定一點(diǎn)。V_xishu是電壓放大的倍數(shù),根據(jù)我們電路實(shí)際的縮放倍數(shù)來決定,我們?cè)谶@里由于縮放倍數(shù)是10,所以再main.h文件里面設(shè)定為10.0。
高級(jí)定時(shí)器一就是配置互補(bǔ)輸出PWM
#include "timer.h"
#include "usart.h"
#include "adc.h"
#include "main.h"
#include "pid.h"
/*boost同步整流電路配置*/
#define BOOST_TIMx TIM1
#define BOOST_Plus 5//初始化占空比為0.5%,高電平有效時(shí)的低電平占空比
#define BOOST_ARR 3599//重裝載值3600
#define BOOST_PSC 0//分頻系數(shù)1
extern __IO uint16_t ADC_ConvertedValue[2];
float ADC_ConvertedValueLocal;
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時(shí)鐘使能
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值 計(jì)數(shù)到5000為500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 10Khz的計(jì)數(shù)頻率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_Trigger,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級(jí)0級(jí)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //從優(yōu)先級(jí)3級(jí)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
TIM_Cmd(TIM2, ENABLE); //使能TIMx外設(shè)
}
void TIM2_IRQHandler(void) //TIM2中斷
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
{
if(work_mode==1)
{
now_v=(float)ADC_ConvertedValue[0]/4096*3.3;
pwm = boost_pid((now_v/3.3*4096),5,2600);
set_pwm(TIM1,1,pwm,2600);
}
else
{
pwm=500;
set_pwm(TIM1,1,pwm,1000);
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx的中斷待處理位:TIM 中斷源
}
}
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時(shí)鐘使能
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值 計(jì)數(shù)到5000為500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 10Khz的計(jì)數(shù)頻率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級(jí)0級(jí)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級(jí)3級(jí)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外設(shè)
}
void TIM3_IRQHandler(void) //TIM3中斷
{
static float V_zong=0.0f;
static u16 count=0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
{
count++;
ADC_ConvertedValueLocal=(float)ADC_ConvertedValue[0]/4096*3.3f;
V_zong+=ADC_ConvertedValueLocal;
if(count>=500) //500ms進(jìn)行一次計(jì)算
{
count=0;
V_OUT=V_zong/500*V_xishu;
V_zong=0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中斷待處理位:TIM 中斷源
}
}
/*boost電路同步整流PWM函數(shù)PA8、PB13*/
void BOOST_PWM_Init(void)//boost電路輸出互補(bǔ)PWM波形(PA8、PB13)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能PORTA,B時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
//初始化GPIO,PA8
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//端口復(fù)用
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //PA8
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_Init(GPIOB,&GPIO_InitStructure);//PB13
//初始化時(shí)具單元
TIM_DeInit(BOOST_TIMx);
TIM_TimeBaseInitStruct.TIM_ClockDivision=0;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=BOOST_ARR;
TIM_TimeBaseInitStruct.TIM_Prescaler=BOOST_PSC;
TIM_TimeBaseInit(BOOST_TIMx,&TIM_TimeBaseInitStruct);
//將輸出通道2初始化為PWM模式1
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_High;
TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
TIM_OCInitStruct.TIM_Pulse=BOOST_Plus;
TIM_OC1Init(BOOST_TIMx,&TIM_OCInitStruct);
//使能預(yù)裝載寄存器
TIM_OC1PreloadConfig(BOOST_TIMx,TIM_OCPreload_Enable);
//死區(qū)和剎車功能配置
TIM_BDTRInitStruct.TIM_OSSIState=TIM_OSSIState_Disable;
TIM_BDTRInitStruct.TIM_OSSRState=TIM_OSSRState_Disable;
TIM_BDTRInitStruct.TIM_LOCKLevel=TIM_LOCKLevel_1;
TIM_BDTRInitStruct.TIM_DeadTime=3; //40.92ns
TIM_BDTRInitStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
TIM_BDTRInitStruct.TIM_Break=TIM_Break_Disable;
TIM_BDTRInitStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(BOOST_TIMx,&TIM_BDTRInitStruct);
//使能自動(dòng)重裝載
TIM_ARRPreloadConfig(BOOST_TIMx,ENABLE);
//開啟定時(shí)器
TIM_Cmd(BOOST_TIMx,ENABLE);
//主輸出使能
TIM_CtrlPWMOutputs(BOOST_TIMx,ENABLE);
}
/*選擇通道函數(shù)*/
void set_pwm(TIM_TypeDef* TIMx,u8 chx,u16 prec,u16 up)
{
//判斷輸入?yún)?shù)是否正確
if(chx<1||chx>4)
return;
if(prec>up)
prec=up;
//根據(jù)輸入的通道設(shè)置PWM占空比
switch(chx)
{
case 1:TIM_SetCompare1(TIMx,prec);break;
case 2:TIM_SetCompare2(TIMx,prec);break;
case 3:TIM_SetCompare3(TIMx,prec);break;
case 4:TIM_SetCompare4(TIMx,prec);break;
}
}
PID代碼
帶有部分注釋,需要修改的其實(shí)就是init_boost_PID那個(gè)函數(shù),里面有一個(gè)pid1.sv,那個(gè)是我們要追蹤的目標(biāo)值,而boost_pid里面的Now,是我們采集到的輸出電壓值。
#include "pid.h"
#include "main.h"
PID_Struct pid1;
float boost_pid(float NOW,float SIGNLE_ADD_NUM_LIMIT,float SUM_OUTPUT_NUM_LIMIT)//SIGNLE_ADD_NUM_LIMIT是單次增加最大值 如100即為單次轉(zhuǎn)換輸出不能超過+-100
{
//SUM_OUTPUT_NUM_LIMIT 是總輸出限位 如100 即總輸出不能超出+-100的范圍 防止長時(shí)間低于或高于 對(duì)于突變反應(yīng)不及時(shí)
static float OUT=150;
if(work_mode==0)OUT=500;
pid1.Pv=NOW;
pid1.Ek=pid1.Sv-pid1.Pv;
pid1.Pout=pid1.Kp_P*(pid1.Ek-pid1.Ek_1);
pid1.Iout=pid1.Kp_I*pid1.Ek*pid1.T/pid1.Ti;
pid1.Dout=pid1.Kp_D*pid1.Td*(pid1.Ek-pid1.Ek_1-pid1.Ek_1+pid1.Ek_2)/pid1.T;
pid1.OUT_Single=pid1.Pout+pid1.Iout+pid1.Dout;
if(pid1.OUT_Single>SIGNLE_ADD_NUM_LIMIT)pid1.OUT_Single=SIGNLE_ADD_NUM_LIMIT;
else if(pid1.OUT_Single<-SIGNLE_ADD_NUM_LIMIT)pid1.OUT_Single=-SIGNLE_ADD_NUM_LIMIT;
OUT+=pid1.OUT_Single;
if(OUT>SUM_OUTPUT_NUM_LIMIT)OUT=SUM_OUTPUT_NUM_LIMIT;
//else if(OUT<-SUM_OUTPUT_NUM_LIMIT)OUT=-SUM_OUTPUT_NUM_LIMIT;
else if(OUT<0)OUT=0;
pid1.Ek_2=pid1.Ek_1;
pid1.Ek_1=pid1.Ek;
return OUT;
}
void init_boost_PID(float voltage_set)
{
pid1.Kp_P=0;
pid1.Kp_I=1;
pid1.Kp_D=0;
pid1.Sv=voltage_set*0.1/3.3*4096-14;
pid1.T=1;//Ms
pid1.Td=2.5;
pid1.Ti=150;
pid1.Pv=1000;
pid1.Ek_2=0;
pid1.Ek_1=0;
pid1.Ek=0;
}
實(shí)物圖
總結(jié)
測(cè)試結(jié)果
第一問完全滿足,第二問負(fù)載調(diào)整率接近為0,第三問變換器效率95%。稍后會(huì)把測(cè)試視頻上傳。
有任何疑問到評(píng)論區(qū)下方留言,我是很樂于回答問題的,記得點(diǎn)個(gè)關(guān)注點(diǎn)贊收藏,我這要求不過分吧哈哈哈哈。
所有資料如下:文章來源:http://www.zghlxwxcb.cn/news/detail-438845.html
鏈接:https://pan.baidu.com/s/1MNfkIqY_M__j8LUZjMNjTA
提取碼:yd15
–來自百度網(wǎng)盤超級(jí)會(huì)員V4的分享文章來源地址http://www.zghlxwxcb.cn/news/detail-438845.html
到了這里,關(guān)于Boost電路實(shí)戰(zhàn)詳解!(高效率同步整流,PID閉環(huán)追蹤)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!