在無法從電網(wǎng)獲得交流電源的情況下,通常需要逆變器電路。逆變器電路用于將直流電轉(zhuǎn)換為交流電,可分為純正弦波逆變器和改進(jìn)方波逆變器兩種類型。這些純正弦波逆變器非常昂貴,而改進(jìn)的方波逆變器價(jià)格低廉。在此處了解有關(guān) 不同類型逆變器的更多信息 。在這篇文章中,我將使用Arduino制作一個(gè)簡(jiǎn)單的純正弦波逆變器,并解釋電路的工作原理。
什么是 SPWM(正弦脈沖寬度調(diào)制)?
顧名思義,SPWM代表S正弦脈沖寬度調(diào)制。_ 您可能已經(jīng)知道,PWM 信號(hào)是一種信號(hào),我們可以在其中改變脈沖的頻率以及開啟時(shí)間和關(guān)閉時(shí)間,也稱為占空比。如果您想了解有關(guān) PWM的更多信息,可以在此處閱讀。因此,通過改變占空比,我們改變了脈沖的平均電壓。下圖顯示——
如果我們考慮一個(gè)在 0-5V 之間切換且占空比為 100%的PWM 信號(hào),我們將獲得 5V 的平均輸出電壓,同樣如果我們考慮占空比為 50% 的相同信號(hào),我們將得到2.5V 的輸出電壓,對(duì)于 25% 的占空比,它是那個(gè)的一半??偨Y(jié)了PWM信號(hào)的基本原理,接下來我們就可以了解SPWM信號(hào)的基本原理了。
正弦電壓主要是一種模擬電壓,它會(huì)隨著時(shí)間的推移改變其幅度,我們可以通過不斷改變 PWM 波的占空比來重現(xiàn)正弦波的這種行為,下圖顯示了這一點(diǎn)。
如果您查看下面的示意圖,它將看到在變壓器的輸出端連接了一個(gè)電容器。該電容器負(fù)責(zé)從載波頻率中平滑交流信號(hào)。
利用的輸入信號(hào)將根據(jù)輸入信號(hào) 和負(fù)載對(duì)電容器進(jìn)行充電和放電。由于我們使用了一個(gè)非常高頻的SPWM信號(hào),它會(huì)有一個(gè)非常小的占空比,大概是1%,這個(gè)1%的占空比會(huì)給電容充電一點(diǎn),下一個(gè)占空比是5%,這會(huì)再次充電電容器再多一點(diǎn),接下來的脈沖將有 10% 的占空比,電容器將再充電一點(diǎn),我們將施加信號(hào),直到我們達(dá)到100% 的占空比,然后從那里返回到 1%。這將在輸出端創(chuàng)建一個(gè)非常平滑的曲線,如正弦波。 因此,通過在輸入端提供適當(dāng)?shù)恼伎毡戎?,我們將在輸出端獲得非常正弦的波形。
SPWM 逆變器的工作原理
上圖顯示了 SPWM 逆變器的主要驅(qū)動(dòng)部分,如您所見,我們使用了兩個(gè)半橋配置的N 溝道 MOSFET來驅(qū)動(dòng)該電路的變壓器,以減少不必要的開關(guān)噪聲并保護(hù) MOSFET ,我們使用了與 MOSFET 并聯(lián)的 1N5819 二極管。為了減少柵極部分產(chǎn)生的任何有害尖峰,我們使用了與 1N4148 二極管并聯(lián)的 4.7 歐姆電阻。最后,BD139 和 BD 140 晶體管配置為推挽式配置 驅(qū)動(dòng) MOSFET 的柵極,因?yàn)樵?MOSFET 具有非常高的柵極電容,并且基極需要至少 10V 才能正常開啟。在此處了解有關(guān)推挽式放大器工作原理的更多信息。
為了更好地理解電路的工作原理,我們將其縮小到 MOSFET 的這一部分為 ON 的程度。當(dāng)MOSFET導(dǎo)通電流時(shí),先流過變壓器,然后被MOSFET接地,這樣在電流流動(dòng)的方向上也會(huì)感應(yīng)出磁通量,變壓器的鐵芯會(huì)通過磁通量在次級(jí)繞組中,我們將在輸出端獲得正弦信號(hào)的正半周期。
在下一個(gè)循環(huán)中,電路的底部在電路的頂部,這就是我移除頂部的原因,現(xiàn)在電流以相反的方向流動(dòng)并在該方向產(chǎn)生磁通量,從而反轉(zhuǎn)磁芯中磁通量的方向。在此處了解有關(guān)MOSFET工作原理的更多信息。
現(xiàn)在,我們都知道變壓器是靠磁通量變化來工作的。因此,打開和關(guān)閉 MOSFET,一個(gè)倒置到另一個(gè)并在一秒鐘內(nèi)執(zhí)行 50 次,將在變壓器鐵芯內(nèi)產(chǎn)生良好的振蕩磁通量,而變化的磁通量將在次級(jí)線圈中感應(yīng)出電壓,如我們知道法拉第定律。這就是基本逆變器的工作原理。
該項(xiàng)目中使用的完整SPWM 逆變器電路如下所示。
構(gòu)建 SPWM 逆變器所需的組件
SPWM逆變器電路結(jié)構(gòu)
對(duì)于這個(gè)演示,電路是在 Veroboard 上構(gòu)建的,借助原理圖,在變壓器的輸出端,會(huì)有大量的電流流過連接,因此連接跳線需要盡可能厚。
SPWM逆變器的Arduino程序
在我們開始理解代碼之前,讓我們先弄清楚基礎(chǔ)知識(shí)。通過以上工作原理,您已經(jīng)了解了PWM 信號(hào)在輸出端的樣子,現(xiàn)在的問題是我們?nèi)绾卧?Arduino 的輸出引腳上產(chǎn)生如此變化的波形。
為了產(chǎn)生變化的 PWM 信號(hào),我們將使用16 位定時(shí)器 1 ,預(yù)分頻器設(shè)置為 1,如果我們考慮正弦波的單個(gè)半周期,這將為每個(gè)計(jì)數(shù)提供 1600/16000000 = 0.1ms 時(shí)間,在波的半個(gè)周期內(nèi)恰好適合 100 次。簡(jiǎn)單來說,我們將能夠?qū)φ也ㄟM(jìn)行 200 次采樣。
接下來,我們必須將我們的正弦波分成 200 段,并根據(jù)幅度的相關(guān)性計(jì)算它們的值。接下來,我們必須將這些值與計(jì)數(shù)器限制相乘,將其轉(zhuǎn)換為定時(shí)器計(jì)數(shù)器值。最后,我們必須將這些值放入查找表中以將其提供給計(jì)數(shù)器,我們將獲得正弦波。
為了讓事情更簡(jiǎn)單一點(diǎn),我使用了一個(gè)來自GitHub的非常好的 SPWM 代碼,它是由Kurt Hutten編寫的。
代碼很簡(jiǎn)單,我們通過添加所需的頭文件開始我們的程序
?
#include#include
?
接下來,我們有兩個(gè)查找表,我們將從中獲取計(jì)時(shí)器計(jì)數(shù)器值。
?
int lookUp1[] = {50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 , 100 ,50 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0}; int lookUp2[] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 ,100 ,50 ,0};
?
接下來,在設(shè)置部分,我們初始化定時(shí)器計(jì)數(shù)器控制寄存器以清除每個(gè)寄存器。如需更多信息,您需要查看 atmega328 IC 的數(shù)據(jù)表。
?
TCCR1A = 0b10100010; /*10 匹配時(shí)清除,為 compA 設(shè)置為 BOTTOM。 10 在比賽中清除,在底部設(shè)置為 compB。 00 10 WGM1 1:0 用于波形 15。 */ TCCR1B = 0b00011001; /*000 11 WGM1 3:2 用于波形 15。 001 計(jì)數(shù)器上沒有預(yù)分頻器。 */ TIMSK1 = 0b00000001; /*0000000 1 TOV1 標(biāo)志中斷使能。 */
?
之后,我們使用預(yù)定義的值 16000 初始化輸入捕獲寄存器,因?yàn)檫@將幫助我們準(zhǔn)確生成 200 個(gè)樣本。
?
ICR1 = 1600;// 16MHz 晶體的周期,對(duì)于每 50Hz 正弦波周期 200 次細(xì)分的 100KHz 開關(guān)頻率。
?
接下來,我們通過調(diào)用函數(shù)來啟用全局中斷,
?
sei();
?
最后,我們將 Arduino 引腳 9 和 10 設(shè)置為輸出
?
DDRB = 0b00000110;// 將 PB1 和 PB2 設(shè)置為輸出。
?
這標(biāo)志著 setup 函數(shù)的結(jié)束。
代碼的循環(huán)部分保持空白,因?yàn)樗且粋€(gè)定時(shí)器計(jì)數(shù)器中斷驅(qū)動(dòng)程序。
?
無效循環(huán)(){;/*沒做什么 。. . . 永遠(yuǎn)!*/}
?
接下來,我們定義了 timer1 溢出向量,一旦 timer1 溢出并產(chǎn)生中斷,這個(gè)中斷函數(shù)就會(huì)被調(diào)用。
?
ISR(TIMER1_OVF_vect){
?
接下來,我們將一些局部變量聲明為靜態(tài)變量,并開始將這些值提供給捕獲和比較電阻器。
?
靜態(tài)整數(shù); 靜態(tài)字符觸發(fā); // 每個(gè)周期改變占空比。 OCR1A = 查找1[編號(hào)]; OCR1B = 查找2[編號(hào)];
?
最后,我們預(yù)先增加計(jì)數(shù)器以將下一個(gè)值提供給捕獲和比較電阻器,這標(biāo)志著這段代碼的結(jié)束。
?
if(++num >= 200){ // 預(yù)先增加 num 然后檢查它是否低于 200。 數(shù) = 0; // 重置號(hào)碼 觸發(fā)=觸發(fā)^0b00000001; 數(shù)字寫入(13,觸發(fā)); }
?
測(cè)試 TL494 PWM 逆變器電路
為了測(cè)試電路,使用以下設(shè)置。
12V鉛酸電池。
具有 6-0-6 抽頭和 12-0-12 抽頭的變壓器
100W白熾燈泡作為負(fù)載
Meco 108B+TRMS 萬用表
Meco 450B+TRMS 萬用表
來自 Arduino 的輸出信號(hào):
一旦我上傳了代碼。我測(cè)量了Arduino兩個(gè)引腳的輸出 SPWM 信號(hào),如下圖所示,
如果我們稍微放大一點(diǎn),我們可以看到 PWM 波不斷變化的占空比。
接下來,下圖顯示了變壓器的輸出信號(hào)。
理想狀態(tài)下的 SPWM 逆變器電路:
從上圖中可以看出,該電路在理想運(yùn)行時(shí)消耗約 13W
無負(fù)載輸出電壓:
逆變器電路的輸出電壓如上圖所示,這是在沒有任何負(fù)載的情況下輸出的電壓。
輸入功耗:
上圖顯示了連接 40W 負(fù)載時(shí) ic 消耗的輸入功率。
輸出功耗:
上圖顯示了該電路消耗的輸出功率,(負(fù)載為 40W 白熾燈泡)
?
/*
* sPWMv2.c
*
* 創(chuàng)建時(shí)間:2014 年 12 月 31 日下午 3:44:43
* 作者:庫爾特·赫頓
arduino Uno 的 atMega328 上的 SPWM,可能與其他 atmel 芯片/arduino 板兼容。
比較輸出 A 和 B 輸出到 PORTB 引腳 1 和 2,它們分別是 Uno 上的引腳 9 和 10。
了解 Uno 上的 LED 也很有用,它是 PORTB 上的引腳 5。
*/
#include
#include
// 查找每個(gè)有 200 個(gè)條目的表,標(biāo)準(zhǔn)化為最大值 1600,這是加載到寄存器 ICR1 的 PWM 周期。
int lookUp1[] = {50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 , 100 ,50 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
int lookUp2[] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 ,100 ,50 ,0};
無效設(shè)置(){
// 寄存器初始化,更多細(xì)節(jié)參見數(shù)據(jù)表。
TCCR1A = 0b10100010;
/*10 匹配時(shí)清除,為 compA 設(shè)置為 BOTTOM。
10 在比賽中清除,在底部設(shè)置為 compB。
00
10 WGM1 1:0 用于波形 15。
*/
TCCR1B = 0b00011001;
/*000
11 WGM1 3:2 用于波形 15。
001 計(jì)數(shù)器上沒有預(yù)分頻器。
*/
TIMSK1 = 0b00000001;
/*0000000
1 TOV1 標(biāo)志中斷使能。
*/
ICR1 = 1600;// 16MHz 晶體的周期,對(duì)于每 50Hz 正弦波周期 200 次細(xì)分的 100KHz 開關(guān)頻率。
sei(); // 啟用全局中斷。
DDRB = 0b00000110;// 將 PB1 和 PB2 設(shè)置為輸出。
pinMode(13,輸出);
}
無效循環(huán)(){;/*沒做什么 。. . . 永遠(yuǎn)!*/}
ISR(TIMER1_OVF_vect){
靜態(tài)整數(shù);
靜態(tài)字符觸發(fā);
// 每個(gè)周期改變占空比。
OCR1A = 查找1[編號(hào)];
OCR1B = 查找2[編號(hào)];
if(++num >= 200){ // 預(yù)先增加 num 然后檢查它是否低于 200。
數(shù) = 0; // 重置號(hào)碼
觸發(fā)=觸發(fā)^0b00000001;
數(shù)字寫入(13,觸發(fā));
}
}
?
評(píng)論
查看更多