Sisukord:
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
Selles projektis olen genereerinud kahest arduino pwm digitaalsest väljundist SPWM (siinuslaine impulsi lai moduleeritud) signaali.
Kuna sellise programmi tegemiseks pean rääkima paljudest teistest arduino funktsioonidest ja omadustest, külastage minu veebisaiti:
eprojectszone
Samm: Pwm -signaali genereerimine 50 Hz jaoks
50 Hz signaali genereerimiseks kõrgemal sagedusel on vaja teha mõned arvutused. Arduino sagedused võivad olla 8 MHz, kuid me tahame muutuva töötsükliga signaali.
Arduino muutuva töötsükli tüüpide mõistmiseks saate lugeda sama postituse 1, 2 ja 3 seda kolme osa.
Oletame, et meie sagedus on 50 Hz, mis tähendab, et ajavahemik on 20 ms. Seega 10 ms on pooltsükkel. Nende 10 ms jooksul peab meil olema palju erineva töötsükliga impulsse, alustades väikestest töötsüklitest, signaali keskel on meil maksimaalsed töötsüklid ja lõpetame ka väikeste töötsüklitega. Siinuslaine tekitamiseks kasutame kahte tihvti. positiivne pooltsükkel ja üks negatiivne pooltsükkel. Meie postituses kasutame selleks tihvte 5 ja 6, mis tähendab taimerit 0.
Sujuva signaali jaoks valime faasikorrektse pwm sagedusel 31372 Hz-vt eelmist postitust. Üks suurimaid probleeme on see, kuidas arvutame iga impulsi jaoks vajaliku töötsükli. Niisiis, kuna meie sagedus on f = 31372Hz, on iga impulsi periood T = 1/31372 = 31,8 us, seega on poole tsükli impulsside arv N = 10ms/31,8us = 314 impulssi. Nüüd, et arvutada iga impulsi töötsükkel, on meil y = sinx, kuid selles võrrandis vajame kraadi, nii et pooltsüklil on 180 kraadi 314 impulsi jaoks. Iga impulsi puhul on meil 180/314 = 0,57 kraadi/impulss. See tähendab, et iga impulsi puhul liigume edasi 0,57 kraadi võrra.
y on töötsükkel ja x positsiooni väärtus poole töötsükli jooksul. alguses x on 0, siis x = 0,57, x = 1,14 ja nii edasi, kuni x = 180.
kui arvutame kõik 314 väärtused, saame massiivi 314 elementi (tüüp "int", mida on arduino lihtsam arvutada).
Selline massiiv on:
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, 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};
Näete, et nagu siinuslaine, on töötsükkel madalaim esimeses ja viimases elemendis ning kõrgeim keskel.
Samm: Arduino programm muutuva töötsükli jaoks
Ülaltoodud pildil on muutuva töötsükli signaalid massiivi väärtustega.
Aga kuidas sellist signaali teha ??
Allpool olev programmi osa kasutab katkestusi töötsüklite väärtuste muutmiseks
sei (); // katkestuste lubamine
}
ISR (TIMER1_COMPA_vect) {// katkestada, kui taimer 1 sobib OCR1A väärtusega
if (i> 313 && OK == 0) {// lõplik väärtus vektorilt tihvti 6 jaoks
i = 0; // minge vektori (massiivi) esimese väärtuse juurde
OK = 1; // lubage tihvt 5
}
x = sinPWM ; // x võtab väärtuse vektorilt, mis vastab positsioonile i (i on indekseeritud null)-töötsükli väärtus
i = i+1; // mine järgmisele positsioonile
}
Samm: vaheldumisi 50 Hz Arduino tihvtidega
Kuna iga tihvt tekitab täieliku siinuslaine tegemiseks ainult poole töötsükli, kasutame kahte tihvti, mis vahelduvad üksteise järel täpselt 10 sekundi pärast (50 Hz). See tihvtide vahetus tehakse massiivi lõpus- kui oletame, et tihvt 5 on genereerinud 314 impulssi, lülitatakse see tihvt välja ja lubatakse tihvt 6, mis teeb sama, kuid negatiivse töötsükli jaoks.
Kuna arduino suudab genereerida ainult positiivseid signaale, tehakse silla juures negatiivne töötsükkel- selle kohta saate lugeda siit
Tihvtide vahetamise programm:
sei (); // katkestuste lubamine
}
ISR (TIMER1_COMPA_vect) {// katkestada, kui taimer 1 sobib OCR1A väärtusega
if (i> 313 && OK == 0) {// lõplik väärtus vektorilt tihvti 6 jaoks
i = 0; // minge vektori esimesele väärtusele
OK = 1; // lubage tihvt 5
}
if (i> 313 && OK == 1) {// lõplik väärtus vektorilt tihvti 5 jaoks
i = 0; // minge vektori esimesele väärtusele
OK = 0; // lubage tihvt 6
}
x = sinPWM ; // x võtab väärtuse vektorile, mis vastab positsioonile i (i on indekseeritud null)
i = i+1; // mine järgmisele positsioonile
kui (OK == 0) {
OCR0B = 0; // tehke tihvt 5 0
OCR0A = x; // lubage tihvt 6 vastavale töötsüklile
kui (OK == 1) {
OCR0A = 0; // tehke tihvt 6 0
OCR0B = x; // lubage tihvt 5 vastavale töötsüklile
}
}
4. samm: H -silla juhtimine ja Pwm -signaali filtreerimine
Arduino poolt saadud signaalid on muunduri rakenduste juhtosa, kuna mõlemad on positiivsed. Täieliku siinuslaine ja praktilise inverteri tegemiseks peame kasutama h -silda ja pwm puhastamiseks madalpääsfiltrit.
Siin on esitatud H-sild.
Madalpääsfilter on testitud väikeste vahelduvvoolumootoritega-siin.