Obsah:
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-13 06:57
V tomto projektu jsem vygeneroval signál SPWM (sinusový pulsně široce modulovaný) ze dvou digitálních výstupů arduino pwm.
Protože, abych vytvořil takový program, musím mluvit o mnoha dalších funkcích a vlastnostech arduina, celého projektu, včetně obrázků osciloskopu a pro různé frekvence, navštivte mé webové stránky:
eprojectszone
Krok 1: Generování signálu Pwm pro 50 Hz
Pro generování signálu 50 Hz na vyšší frekvenci je nutné provést nějaké výpočty. Frekvence z arduina mohou být na 8 MHz, ale my chceme signál s proměnným pracovním cyklem.
Chcete -li porozumět typům variabilních pracovních cyklů arduina, můžete si přečíst tyto 3 části stejného příspěvku 1, 2 a 3.
Předpokládejme, že naše frekvence je 50 Hz, což znamená, že časové období je 20 ms. 10ms je tedy polovina cyklu. V těchto 10 ms potřebujeme mít mnoho pulzů s různými pracovními cykly počínaje malými pracovními cykly, uprostřed signálu máme maximální pracovní cykly a skončíme také s malými pracovními cykly. Pro generování sinusové vlny použijeme dva piny jeden pro pozitivní poloviční cyklus a jeden pro negativní poloviční cyklus. V našem příspěvku k tomu používáme piny 5 a 6, což znamená časovač 0.
Pro plynulý signál volíme fázově správný pwm na frekvenci 31372 Hz-viz předchozí příspěvek. Jedním z největších problémů je, že vypočítáme potřebný pracovní cyklus pro každý puls. Protože naše frekvence je f = 31372 Hz, perioda pro každý impuls je T = 1/31372 = 31,8 us, takže počet pulzů pro poloviční cyklus je N = 10 ms/31,8 us = 314 pulzů. Nyní pro výpočet pracovního cyklu pro každý impuls máme y = sinx, ale v této rovnici potřebujeme stupně, takže poloviční cyklus má 180 stupňů pro 314 pulzů. Pro každý puls máme 180/314 = 0,57 stupňů/puls. To znamená, že pro každý puls se pohybujeme vpřed o 0,57 stupňů.
y je pracovní cyklus a x hodnota polohy v polovičním pracovním cyklu. nejprve x je 0, poté x = 0,57, x = 1,14 a tak dále, dokud x = 180.
vypočítáme -li všech 314 hodnot, získáme pole 314 prvků (typ „int“vypočítá snáze arduino).
Takové pole je:
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};
Vidíte, že jako sinusová vlna je pracovní cyklus nejnižší u prvního a posledního prvku a nejvyšší uprostřed.
Krok 2: Program Arduino pro variabilní pracovní cyklus
Na obrázku výše máme signály proměnných pracovních cyklů s hodnotami z pole.
Jak ale takový signál vytvořit ??
část níže uvedeného programu používá přerušení ke změně hodnot pracovních cyklů
sei (); // povolit přerušení
}
ISR (TIMER1_COMPA_vect) {// přerušení, když se časovač 1 shoduje s hodnotou OCR1A
if (i> 313 && OK == 0) {// konečná hodnota z vektoru pro pin 6
i = 0; // přejít na první hodnotu vektoru (pole)
OK = 1; // povolit pin 5
}
x = sinPWM ; // x vezme hodnotu z vektoru odpovídající poloze i (i je nula indexována)-hodnota pracovního cyklu
i = i+1; // přejděte na další pozici
}
Krok 3: Střídavě na 50Hz pinech Arduino
Protože každý pin generuje pouze poloviční pracovní cyklus k vytvoření plné sinusové vlny, používáme dva piny, které se střídají jeden po druhém po přesných 10 ms (pro 50 Hz). Tato změna pinů se provádí na konci pole- poté, co řekněme, že pin 5 vygeneroval 314 pulzů, tento pin se vypne a aktivuje pin 6, což dělá totéž, ale pro záporný pracovní cyklus.
Protože arduino může generovat pouze pozitivní signály, je v h můstku vytvořen negativní pracovní cyklus- zde si o tom můžete přečíst
Program pro změnu pinů:
sei (); // povolit přerušení
}
ISR (TIMER1_COMPA_vect) {// přerušení, když se časovač 1 shoduje s hodnotou OCR1A
if (i> 313 && OK == 0) {// konečná hodnota z vektoru pro pin 6
i = 0; // přejde na první hodnotu vektoru
OK = 1; // povolit pin 5
}
if (i> 313 && OK == 1) {// konečná hodnota z vektoru pro pin 5
i = 0; // přejde na první hodnotu vektoru
OK = 0; // povolit pin 6
}
x = sinPWM ; // x vezme hodnotu z vektoru odpovídající poloze i (i je nula indexována)
i = i+1; // přejděte na další pozici
pokud (OK == 0) {
OCR0B = 0; // vytvoření kolíku 5 0
OCR0A = x; // povolit pin 6 na odpovídající pracovní cyklus
pokud (OK == 1) {
OCR0A = 0; // vytvoření kolíku 6 0
OCR0B = x; // povolit pin 5 na odpovídající pracovní cyklus
}
}
Krok 4: Řízení mostu H a filtrování signálu Pwm
Signály získané z arduina jsou řídicí částí pro invertorové aplikace, protože oba jsou kladné. Abychom vytvořili plnou sinusovou vlnu a praktický invertor, musíme použít h můstek a vyčistit pwm dolní propust.
Zde je představen H-můstek.
Nízkopásmový filtr testován s malými střídavými motory-zde.