Съдържание:

Arduino Sinewave за инвертори: 4 стъпки
Arduino Sinewave за инвертори: 4 стъпки

Видео: Arduino Sinewave за инвертори: 4 стъпки

Видео: Arduino Sinewave за инвертори: 4 стъпки
Видео: Part3 - 500W Sine Wave Inverter Using Arduino - H Bridge 2024, Юли
Anonim
Arduino Sinewave за инвертори
Arduino Sinewave за инвертори

В този проект съм генерирал SPWM (синусоидално импулсно широково модулиран) сигнал от два arduino pwm цифрови изхода.

Тъй като за да направя такава програма, трябва да говоря за много други функции и свойства на arduino пълния проект, включително изображения на осцилоскоп и за различни честоти, моля, посетете моя уебсайт:

eprojectszone

Стъпка 1: Генериране на Pwm сигнал за 50Hz

За генериране на 50Hz сигнал на по -висока честота е необходимо да се направят някои изчисления. Честотите от arduino могат да бъдат на 8MHz, но ние искаме сигнал с променлив работен цикъл.

За да разберете видовете променливи работни цикли на arduino, можете да прочетете тези 3 части от същия пост 1, 2 и 3.

Да приемем, че нашата честота е 50Hz, което означава, че периодът от време е 20ms. Така че 10ms е период на половин цикъл. В тези 10 ms трябва да имаме много импулси с различни работни цикли, започващи с малки цикли на работа, в средата на сигнала имаме максимални работни цикли и завършваме също с малки цикли на работа. За да генерираме синусова вълна, ще използваме два пина един за положителен полуцикъл и един за отрицателен полуцикъл. В нашата публикация за това използваме щифтове 5 и 6, което означава Таймер 0.

За плавен сигнал избираме коректно фазово ШИМ при честота 31372 Hz-вижте предишния пост. Един от най-големите проблеми е, че ние изчисляваме необходимия работен цикъл за всеки импулс. Така че, тъй като нашата честота е f = 31372Hz, периодът за всеки импулс е T = 1/31372 = 31.8 us, така че броят на импулсите за половин цикъл е N = 10ms/31.8us = 314 импулса. Сега за изчисляване на работния цикъл за всеки импулс имаме y = sinx, но в това уравнение се нуждаем от градуси, така че половин цикъл има 180 градуса за 314 импулса. За всеки импулс имаме 180/314 = 0,57 градуса/импулс. Това означава, че за всеки импулс се движим напред с 0,57 градуса.

y е работният цикъл и x стойността на позицията в половин работен цикъл. първо x е 0, след което x = 0.57, x = 1.14 и така нататък, докато x = 180.

ако изчислим всички 314 стойности, получаваме масив от 314 елемента (тип "int", за да се изчисли по -лесно от arduino).

Такъв масив е:

int sinPWM = {1, 2, 5, 7, 10, 12, 15, 17, 19, 22, 24, 27, 30, 32, 34, 37, 39, 42, 44, 47, 49, 52, 54, 57, 59, 61, 64, 66, 69, 71, 73, 76, 78, 80, 83, 85, 88, 90, 92, 94, 97, 99, 101, 103, 106, 108, 110, 113, 115, 117, 119, 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 178, 180, 182, 184, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 248, 248, 249, 249, 249, 249, 249, 250, 250, 250, 250, 249, 249, 249, 249, 249, 248, 248, 248, 248, 247, 247, 247, 246, 246, 245, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 237, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 217, 21 6, 215, 213, 212, 211, 209, 208, 207, 205, 204, 202, 201, 199, 198, 196, 195, 193, 192, 190, 188, 187, 185, 184, 182, 180, 178, 177, 175, 173, 171, 169, 168, 166, 164, 162, 160, 158, 156, 154, 152, 150, 148, 146, 144, 142, 140, 138, 136, 134, 132, 130, 128, 126, 124, 121, 119, 117, 115, 113, 110, 108, 106, 103, 101, 99, 97, 94, 92, 90, 88, 85, 83, 80, 78, 76, 73, 71, 69, 66, 64, 61, 59, 57, 54, 52, 49, 47, 44, 42, 39, 37, 34, 32, 30, 27, 24, 22, 19, 17, 15, 12, 10, 7, 5, 2, 1};

Можете да видите, че като синусоида, работният цикъл е най -нисък в първия и последния елемент и най -висок в средата.

Стъпка 2: Програма Arduino за променлив работен цикъл

Програма Arduino за променлив работен цикъл
Програма Arduino за променлив работен цикъл

На изображението по -горе имаме сигнали с променлив работен цикъл със стойности от масива.

Но как да се направи такъв сигнал ??

частта от програмата по -долу използва прекъсвания за промяна на стойностите на работните цикли

sei (); // разрешаване на прекъсвания

}

ISR (TIMER1_COMPA_vect) {// прекъсване, когато таймер 1 съвпада с OCR1A стойност

if (i> 313 && OK == 0) {// крайна стойност от вектора за пин 6

i = 0; // отидете на първата стойност на вектора (масив)

OK = 1; // активирайте пин 5

}

x = sinPWM ; // x взема стойността от вектора, съответстваща на позиция i (i е индексирана с нула)-стойност на работния цикъл

i = i+1; // отидете на следващата позиция

}

Стъпка 3: Редуване при 50Hz Arduino щифтове

Редуващи се при 50Hz Arduino щифтове
Редуващи се при 50Hz Arduino щифтове

Тъй като всеки щифт генерира само половин работен цикъл, за да направим пълна синусова вълна, използваме два пина, които се редуват един след друг след точно 10 mseconds (за 50Hz). Тази смяна на щифтовете се извършва в края на масива- след като да кажем, че пин 5 е генерирал 314 импулса, този щифт се изключва и активира щифт 6, който прави същото, но за отрицателния работен цикъл.

Тъй като arduino може да генерира само положителни сигнали, отрицателният работен цикъл е направен в h bridge- можете да прочетете тук за това

Програмата за смяна на щифтове:

sei (); // разрешаване на прекъсвания

}

ISR (TIMER1_COMPA_vect) {// прекъсване, когато таймер 1 съвпада с OCR1A стойност

if (i> 313 && OK == 0) {// крайна стойност от вектора за пин 6

i = 0; // отидете на първата стойност на вектора

OK = 1; // активирайте пин 5

}

if (i> 313 && OK == 1) {// крайна стойност от вектора за щифт 5

i = 0; // отидете на първата стойност на вектора

OK = 0; // активирайте пин 6

}

x = sinPWM ; // x взема стойността от вектора, съответстваща на позиция i (i е индексирана с нула)

i = i+1; // отидете на следващата позиция

ако (OK == 0) {

OCR0B = 0; // направете щифт 5 0

OCR0A = x; // разрешаване на пин 6 към съответния работен цикъл

ако (OK == 1) {

OCR0A = 0; // направете щифт 6 0

OCR0B = x; // разрешаване на щифт 5 към съответния работен цикъл

}

}

Стъпка 4: Шофиране на H мост и филтриране на Pwm сигнала

Сигналите, получени от arduino, са контролната част за инверторните приложения, тъй като и двата са положителни. За да направим пълна синусова вълна и практичен инвертор, трябва да използваме h мост и да изчистим pwm нискочестотен филтър.

H-мостът е представен тук.

Нискочестотният филтър, тестван с малки AC двигатели-тук.

Препоръчано: