- SPWM (Sinusoidal Pulse Width Modulation)이란 무엇입니까?
- SPWM 인버터 작동 원리
- SPWM 인버터를 구축하는 데 필요한 구성 요소
- SPWM 인버터 회로 구성
- SPWM 인버터 용 Arduino 프로그램
- TL494 PWM 인버터 회로 테스트
인버터 회로는 그리드에서 AC 전원을 공급받을 수없는 경우 종종 필요합니다. 인버터 회로는 DC 전원을 AC 전원 으로 변환하는 데 사용되며 Pure Sine Wave Inverters 또는 Modified Square Wave Inverter의 두 가지 유형으로 나눌 수 있습니다 . 이 순수 사인파 인버터는 수정 된 구형파 인버터가 저렴한 곳에서 매우 비쌉니다. 여기에서 다양한 유형의 인버터에 대해 자세히 알아보십시오.
이전 기사에서는 이와 관련된 문제를 해결하여 수정 된 구형파 인버터를 만들지 않는 방법 을 보여 주었습니다. 그래서이 기사에서는 Arduino를 사용하여 간단한 순수 사인파 인버터를 만들고 회로의 작동 원리를 설명합니다.
이 회로를 만드는 경우이 회로는 피드백, 과전류 보호, 단락 보호 및 온도 보호 기능이 없다는 점에 유의하십시오. 따라서이 회로는 교육 목적으로 만 제작 및 시연되며, 상업용 기기에 이러한 유형의 회로를 만들고 사용하는 것은 절대 권장하지 않습니다. 그러나 필요한 경우 회로에 추가 할 수 있습니다. 일반적으로 사용되는 보호 회로는
과전압 보호, 과전류 보호, 역 극성 보호, 단락 보호, 핫 스왑 컨트롤러 등은 이미 논의되었습니다.
주의: 이러한 유형의 회로를 만드는 경우 입력에 대한 스위칭 신호에 의해 생성되는 고전압 및 전압 스파이크에 특히주의하십시오.
SPWM (Sinusoidal Pulse Width Modulation)이란 무엇입니까?
이름이 암시 하듯이, SPWM은 약자 S inusoidal P ulse W IDþ M의 odulation. 이미 알고 계시 겠지만 PWM 신호 는 듀티 사이클 이라고도하는 on-time 및 off-time뿐만 아니라 펄스의 주파수를 변경할 수있는 신호입니다. PWM에 대한 자세한 내용은 여기에서 읽을 수 있습니다. 따라서 듀티 사이클을 변경하여 펄스의 평균 전압을 변경합니다. 아래 이미지는
듀티 사이클이 100 % 인 0-5V 사이에서 스위칭되는 PWM 신호 를 고려 하면 평균 출력 전압 5V를 얻을 수 있으며 , 듀티 사이클이 50 % 인 동일한 신호를 다시 고려 하면 2.5V 의 출력 전압을 얻고 25 %의 듀티 사이클에 대해서는 그 절반입니다. 이는 PWM 신호의 기본 원리를 요약 한 것이며 SPWM 신호 의 기본 원리를 이해하는 것으로 넘어갈 수 있습니다.
정현파 전압을 주로하는 달라져 그 비유 전압, 시간이 지남에 따라 크기를, 우리는에 의해 정현파의 동작을 재현 할 수있는 연속적으로 PWM 파형의 듀티 사이클을 변경하는 화상 보여주는 아래 것을.
아래 회로도 를 보면 변압기 의 출력 에 연결된 커패시터 가 있음을 알 수 있습니다. 이 커패시터는 반송파 주파수 에서 AC 신호 를 평활화하는 역할을 합니다.
활용 된 입력 신호는 입력 신호 및 부하 에 따라 커패시터를 충전 및 방전합니다 . 매우 고주파수 SPWM 신호를 사용 했으므로 1 %와 같은 매우 작은 듀티 사이클을 갖게됩니다.이 1 % 듀티 사이클은 커패시터를 약간 충전하고 다음 듀티 사이클은 5 %입니다. 이것은 다시 충전됩니다. 캐패시터를 조금 더, 다음 펄스는 10 %의 듀티 사이클을 가지며 캐패시터는 조금 더 충전됩니다. 100 %의 듀티 사이클에 도달 할 때까지 신호를 적용하고 거기에서 다시 내려갑니다. 1 %. 이것은 출력에서 사인파와 같은 매우 부드러운 곡선 을 만듭니다.. 따라서 입력에서 적절한 듀티 사이클 값을 제공하면 출력에서 매우 정현파가 생깁니다.
SPWM 인버터 작동 원리
위의 이미지는 SPWM 인버터 의 주요 구동 섹션을 보여줍니다. 보시 다시피 하프 브리지 구성 에서 두 개의 N 채널 MOSFET 을 사용하여이 회로의 변압기를 구동하고 원하지 않는 스위칭 노이즈 를 줄이고 MOSFET을 보호했습니다. 우리는 MOSFET과 병렬로 1N5819 다이오드를 사용 했습니다. 게이트 섹션에서 생성되는 유해한 스파이크를 줄이기 위해 1N4148 다이오드와 병렬로 4.7 옴 저항을 사용했습니다. 마지막으로 BD139 및 BD 140 트랜지스터는 푸시 풀 구성으로 구성됩니다. 이 MOSFET은 게이트 커패시턴스가 매우 높고 제대로 켜지려면베이스에서 최소 10V가 필요하기 때문에 MOSFET의 게이트를 구동합니다. 여기에서 Push-Pull 증폭기의 작동에 대해 자세히 알아보십시오.
회로의 작동 원리를 더 잘 이해하기 위해 MOSFET의이 섹션이 켜져있는 지점으로 줄였습니다. MOSFET이 전류에있을 때 먼저 변압기를 통해 흐르고 MOSFET에 의해 접지되므로 전류가 흐르는 방향으로 자속 이 유도 되고 변압기의 코어가 자속을 통과합니다. 2 차 권선에서 출력에서 정현파 신호의 양의 반주기를 얻습니다.
다음 사이클에서 회로의 하단 부분이 회로의 상단 부분에 있습니다. 그래서 상단 부분을 제거한 이유입니다. 이제 전류는 반대 방향으로 흐르고 그 방향으로 자속을 생성 하여 역전됩니다. 코어의 자속 방향. 여기에서 MOSFET 작동에 대해 자세히 알아보십시오.
이제 우리는 변압기가 자속 변화에 의해 작동한다는 것을 알고 있습니다. 따라서 MOSFET을 모두 켜고 끄고, 하나를 다른 것으로 반전 하고 1 초에 50 회 수행 하면 변압기 코어 내부에 좋은 진동 자속이 생성되고 변화하는 자속은 2 차 코일에 다음과 같은 전압을 유도합니다. 우리는 패러데이의 법칙을 알고 있습니다. 이것이 기본 인버터가 작동하는 방식입니다.
이 프로젝트에 사용 된 전체 SPWM 인버터 회로 는 다음과 같습니다.
SPWM 인버터를 구축하는 데 필요한 구성 요소
Sl. 아니요 |
부속 |
유형 |
수량 |
1 |
Atmega328P |
IC |
1 |
2 |
IRFZ44N |
Mosfet |
2 |
삼 |
BD139 |
트랜지스터 |
2 |
4 |
BD140 |
트랜지스터 |
2 |
5 |
22pF |
콘덴서 |
2 |
6 |
10,000,1 % |
저항기 |
1 |
7 |
16MHz |
결정 |
1 |
8 |
0.1uF |
콘덴서 |
삼 |
9 |
4.7R |
저항기 |
2 |
10 |
1N4148 |
다이오드 |
2 |
11 |
LM7805 |
전압 조정기 |
1 |
12 |
200uF, 16V |
콘덴서 |
1 |
13 |
47uF, 16V |
콘덴서 |
1 |
14 |
2.2uF, 400V |
콘덴서 |
1 |
SPWM 인버터 회로 구성
이 데모를 위해 회로는 회로도 의 도움 으로 Veroboard에 구성됩니다. 변압기의 출력에서 엄청난 양의 전류가 연결을 통해 흐르기 때문에 연결 점퍼가 가능한 한 두꺼워 야합니다.
SPWM 인버터 용 Arduino 프로그램
계속해서 코드를 이해하기 전에 기본 사항을 정리해 보겠습니다. 위의 작동 원리에서 PWM 신호가 출력에서 어떻게 보이는지 배웠습니다 . 이제 Arduino의 출력 핀에서 이러한 다양한 파동을 만들 수있는 방법에 대한 질문이 남아 있습니다.
변화하는 PWM 신호를 만들기 위해, 우리는 사용하려고 16 비트 타이머 1을 가진 하나의 프리스케일러 설정 우리에게 줄 것이다, 각 카운트 16,000,000분의 1,600 = 0.1ms입니다 시간을 우리는 사인파의 단일 반주기를 고려하는 경우, 그것은 파도의 1/2주기 내에 정확히 100 배에 맞습니다. 간단히 말해, 사인파를 200 번 샘플링 할 수 있습니다.
다음으로, 사인파를 200 개로 나누고 진폭 의 상관 관계로 값을 계산해야합니다. 다음으로, 우리는 그 값에 카운터 제한을 곱하여 타이머 카운터 값 으로 변환해야합니다. 마지막 으로이 값을 룩업 테이블 에 넣어 카운터에 입력해야 사인파를 얻을 수 있습니다.
좀 더 간단하게하기 위해 저는 Kurt Hutten이 만든 GitHub의 아주 잘 작성된 SPWM 코드를 사용하고 있습니다.
코드는 매우 간단합니다. 필요한 헤더 파일을 추가하여 프로그램을 시작합니다.
# 포함 # 포함
다음으로, 타이머 카운터 값을 가져올 두 개의 조회 테이블이 있습니다.
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, 250, 201, 151, 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, 250,201, 151, 100, 50, 0};
다음으로 설정 섹션에서 타이머 카운터 제어 레지스터를 초기화하여 각각에 대해 지 웁니다. 자세한 내용은 atmega328 IC의 데이터 시트를 참조하십시오.
TCCR1A = 0b10100010; / * 10 매치시 클리어, compA의 경우 BOTTOM으로 설정. 경기에서 10 클리어, compB의 경우 BOTTOM으로 설정. 00 10 WGM1 1: 0 (파형 15). * / TCCR1B = 0b00011001; / * 000 11 WGM1 3: 2 (파형 15). 001 카운터에 프리 스케일이 없습니다. * / TIMSK1 = 0b00000001; / * 0000000 1 TOV1 플래그 인터럽트 활성화. * /
그 후 정확히 200 개의 샘플을 생성하는 데 도움이되므로 미리 정의 된 16000 값으로 입력 캡처 레지스터를 초기화합니다.
ICR1 = 1600; // 50Hz 사인파주기 당 200 개의 세분화에 대해 100KHz의 스위칭 주파수에 대한 16MHz 크리스탈주기.
다음으로 함수를 호출하여 전역 인터럽트를 활성화합니다.
sei ();
마지막으로 Arduino 핀 9 및 10을 출력으로 설정합니다.
DDRB = 0b00000110; // PB1 및 PB2를 출력으로 설정합니다.
그것은 설정 기능의 끝을 표시합니다.
코드의 루프 섹션은 타이머 카운터 인터럽트 구동 프로그램이므로 비어 있습니다.
무효 루프 () {; /*아무것도하지 마세요…. 영원히!*/}
다음으로 timer1 오버플로 벡터를 정의했습니다.이 인터럽트 함수는 timer1이 오버플로되면 호출을 받고 인터럽트를 생성합니다.
ISR (TIMER1_OVF_vect) {
다음으로, 일부 지역 변수를 정적 변수로 선언하고 값을 캡처 및 비교 저항에 공급하기 시작했습니다.
static int num; 정적 char trig; // 매 기간마다 듀티 사이클을 변경합니다. OCR1A = lookUp1; OCR1B = lookUp2;
마지막으로 카운터를 미리 증가시켜 캡처에 다음 값을 공급하고 저항을 비교하여이 코드의 끝을 표시합니다.
if (++ num> = 200) {// 사전 증분 num이 200 미만인지 확인합니다. num = 0; // 번호 재설정. trig = trig ^ 0b00000001; digitalWrite (13, trig); }
TL494 PWM 인버터 회로 테스트
회로를 테스트하기 위해 다음 설정이 사용됩니다.
- 12V 납축 배터리.
- 6-0-6 탭과 12-0-12 탭이있는 변압기
- 부하로 100W 백열 전구
- Meco 108B + TRMS 멀티 미터
- Meco 450B + TRMS 멀티 미터
Arduino의 출력 신호:
일단 코드를 업로드했습니다. 아래 이미지와 같은 Arduino 의 두 핀에서 출력 SPWM 신호를 측정했습니다.
조금 확대하면 PWM 파동의 끊임없이 변화하는 듀티 사이클을 볼 수 있습니다.
다음으로 아래 이미지는 트랜스포머의 출력 신호를 보여줍니다.
이상적인 상태의 SPWM 인버터 회로:
위의 이미지에서 볼 수 있듯이이 회로는 이상적으로 작동하는 동안 약 13W를 소비합니다.
부하없는 출력 전압:
인버터 회로의 출력 전압은 위에 표시되어 있습니다. 이것은 부하가 연결되지 않은 상태에서 출력에서 나오는 전압입니다.
입력 전력 소비:
위의 이미지는 40W 부하가 연결될 때 ic가 소비하는 입력 전력을 보여줍니다.
출력 전력 소비:
위 이미지는이 회로에서 소비되는 출력 전력을 보여줍니다 (부하는 40W 백열 전구 임).
이것으로 회로의 테스트 부분을 마칩니다. 아래 비디오에서 데모를 확인할 수 있습니다. 이 기사를 좋아하고 SPWM과 그 구현 기술에 대해 조금 배웠기를 바랍니다. 계속 읽고, 배우고, 계속 건축하면 다음 프로젝트에서 뵙겠습니다.