60 nap alatt Arduino #13 - PWM - Tanfolyam - a pelda batch-ek ertelmezese
60 nap alatt Arduino #13 - PWM - Tanfolyam - a pelda batch-ek ertelmezese
Sziasztok,
a segítségeteket szeretném kérni a következő két rövid batch megértéséhez - mindkettő a tanfolyam legutóbbi reszeben szerepelt és nem látom hogyan kapcsolódik az elmondott frekvencia-modulációhoz. Amit nem értek az a pwm változó mindkét programbanÉ ezek a program elejen kapnak egy kezdőértéket, de a loop-ban egyáltalán nem változik az értékük így a teljes programfutás alatt a pwm érték konstans. Jól gondolom?
Az elso, ami az értelmezés szerint egy változó frekvenciájú villogó, de szerintem egy hosszú HIGH - rövid LOW - hosszú HIGH villogás, hiszen a pwm konstans:
byte pwm=1; // Kezdeti jelkitoltes
byte softpwm=0; // belso szamlalo
void setup() {
pinMode(13, OUTPUT); //A 13-as lab kimenet, LED
}
void loop() {
softpwm++; //softpwm=softpwm+1
if (softpwm < pwm) {
digitalWrite(13, HIGH); // LED be
}
else {
digitalWrite(13, LOW); // LED ki
}
//delay(3); // varakozas ket lepes kozt
}
A másik program egy fenyőfa világítás lenne változó színskálával (megfeleló led esetén), de ahogy nézem valójában ez is egy villogó, plusz egy analog kimenet amonek az erőssége folyamatosan pwm=3
byte pwm=3; // indulasi alap
void setup() {
pinMode(13, OUTPUT); // LED
analogWrite(10, pwm); //D10 analog kimenet 3, 5, 6, 9, 10, 11 lehet
}
void loop() {
digitalWrite(13, HIGH); // LED on
delay(250);
digitalWrite(13, LOW); // LED off
delay(250); // varakozas
}
Üdv.
a segítségeteket szeretném kérni a következő két rövid batch megértéséhez - mindkettő a tanfolyam legutóbbi reszeben szerepelt és nem látom hogyan kapcsolódik az elmondott frekvencia-modulációhoz. Amit nem értek az a pwm változó mindkét programbanÉ ezek a program elejen kapnak egy kezdőértéket, de a loop-ban egyáltalán nem változik az értékük így a teljes programfutás alatt a pwm érték konstans. Jól gondolom?
Az elso, ami az értelmezés szerint egy változó frekvenciájú villogó, de szerintem egy hosszú HIGH - rövid LOW - hosszú HIGH villogás, hiszen a pwm konstans:
byte pwm=1; // Kezdeti jelkitoltes
byte softpwm=0; // belso szamlalo
void setup() {
pinMode(13, OUTPUT); //A 13-as lab kimenet, LED
}
void loop() {
softpwm++; //softpwm=softpwm+1
if (softpwm < pwm) {
digitalWrite(13, HIGH); // LED be
}
else {
digitalWrite(13, LOW); // LED ki
}
//delay(3); // varakozas ket lepes kozt
}
A másik program egy fenyőfa világítás lenne változó színskálával (megfeleló led esetén), de ahogy nézem valójában ez is egy villogó, plusz egy analog kimenet amonek az erőssége folyamatosan pwm=3
byte pwm=3; // indulasi alap
void setup() {
pinMode(13, OUTPUT); // LED
analogWrite(10, pwm); //D10 analog kimenet 3, 5, 6, 9, 10, 11 lehet
}
void loop() {
digitalWrite(13, HIGH); // LED on
delay(250);
digitalWrite(13, LOW); // LED off
delay(250); // varakozas
}
Üdv.
Re: Tanfolyam - a pelda batch-ek ertelmezese
Az egyik szoftveres PWM, a másik hardveres.
Ami miatt az első kódot nehéz megérteni, hogy túlpörgeti a 256 byte-os softpwm számlálót.
Ezt úgy kellene elképzelni, hogy beállítod, hogy ha PWM 10, akkor
0-9 között be van kapcsolva
10-255 között ki van kapcsolva
Ezt hívják szoftveres PWM-nek. 16 éve vagyok programozó, ilyen megoldást csak egyetem alatt csináltam. Nem illik túlpörgetni egy számlálót, mert gátolja a megértését a kódnak.
Ami miatt az első kódot nehéz megérteni, hogy túlpörgeti a 256 byte-os softpwm számlálót.
Ezt úgy kellene elképzelni, hogy beállítod, hogy ha PWM 10, akkor
0-9 között be van kapcsolva
10-255 között ki van kapcsolva
Ezt hívják szoftveres PWM-nek. 16 éve vagyok programozó, ilyen megoldást csak egyetem alatt csináltam. Nem illik túlpörgetni egy számlálót, mert gátolja a megértését a kódnak.
Re: Tanfolyam - a pelda batch-ek ertelmezese
Koszi. azt ertem hogz tulporgeti a szamlalot - de ennek csak az if funkcional van jelentosege, ami csak egy kaopcsolokent mukodik: bekapcsol es egy villogas vegigfut azonos impulzussal minden esetben ha a softpwm nagyobb mint 1 . Jol ertem?
Re: Tanfolyam - a pelda batch-ek ertelmezese
pwm helyett akár cons-nak is nevezhetnenk, mivel konstans.
-
- Bitmanipulátor
- Hozzászólások: 128
- Csatlakozott: 2015. december 8. kedd, 19:52
Re: Tanfolyam - a pelda batch-ek ertelmezese
Szia!
Az első program valóban egy egyszerű szoftveres pwm. Ha pl a pwm változónak adsz egy értelmes kezdő értéket pl. 128, akkor a program megvalósítja a fél fényerőt. Ezt úgy csinálja, hogy a loop ciklusban megnézi softpwm aktuális értékét, és ha az kisebb mint az előre beállított pwm értéke, akkor bekapcsolja a ledet, míg amikor nagyobb lesz kikapcsolja. Minden ciklusban növeli 1-el a softpwm értékét, de ez nem nő a végtelenbe, hiszen a byte típusú és 255 után a 0 jön. Maradva a példánál: amíg softpwm kisebb mint 128, addig minden ciklusban felkapcsolja a 13-as kimenetet. Persze ha már egyszer felkapcsolta, akkor már nem fogja újra felkapcsolni, de ez nem baj, csak furcsa. Amint elérte értéke a 128-at az if else ága fut le, ami 0V-ra kapcsolja a 13-as kivezetésen a feszültséget, így a led elalszik. Ezt követően softpwm értéke 255-ig nő, a led természetesen ezen idő alatt nem világít.
Ha kiveszed a kommentet a delay elől, akkor egy ciklus végrehajtási ideje 3milisec. Plusz van végrehajtási ideje a ciklusban lévő utasításoknak is, de ezt hanyagoljuk el. Mivel 256 lépés kell a led felvillanásának ismétléséhez, kb. 256x3=768milisec egy teljes ismétlési ciklus. Ezt a szem már jól érzékeli, ezért ez nem igazán pwm. Viszont ha kikommentezed a sort, akkor érzésem szerint ez valóban pwm szabályozást fog eredményezni. Már csak a pwm változó értékét kell változtatnod valamilyen algoritmus szerint. Vayg beállítod egy-egy értékre0-255 között és lefordítva a programot, megfigyeled, hogy tényelg változik a fényerő.
Szerintem ez nem frekvencia moduláció, mert a led felvillanások közötti idő (a 13-as kivezetés felfutó élei közötti eltelt idö) nem változik a pwm értékétől. A delay mögé írt érték befolyásolja a led felvillanások frekvenciáját!
Remélem nem beszéltem zöldséget, elég erősen kezdő vagyok!
Erre gondoltál a kérdésedben?
Az első program valóban egy egyszerű szoftveres pwm. Ha pl a pwm változónak adsz egy értelmes kezdő értéket pl. 128, akkor a program megvalósítja a fél fényerőt. Ezt úgy csinálja, hogy a loop ciklusban megnézi softpwm aktuális értékét, és ha az kisebb mint az előre beállított pwm értéke, akkor bekapcsolja a ledet, míg amikor nagyobb lesz kikapcsolja. Minden ciklusban növeli 1-el a softpwm értékét, de ez nem nő a végtelenbe, hiszen a byte típusú és 255 után a 0 jön. Maradva a példánál: amíg softpwm kisebb mint 128, addig minden ciklusban felkapcsolja a 13-as kimenetet. Persze ha már egyszer felkapcsolta, akkor már nem fogja újra felkapcsolni, de ez nem baj, csak furcsa. Amint elérte értéke a 128-at az if else ága fut le, ami 0V-ra kapcsolja a 13-as kivezetésen a feszültséget, így a led elalszik. Ezt követően softpwm értéke 255-ig nő, a led természetesen ezen idő alatt nem világít.
Ha kiveszed a kommentet a delay elől, akkor egy ciklus végrehajtási ideje 3milisec. Plusz van végrehajtási ideje a ciklusban lévő utasításoknak is, de ezt hanyagoljuk el. Mivel 256 lépés kell a led felvillanásának ismétléséhez, kb. 256x3=768milisec egy teljes ismétlési ciklus. Ezt a szem már jól érzékeli, ezért ez nem igazán pwm. Viszont ha kikommentezed a sort, akkor érzésem szerint ez valóban pwm szabályozást fog eredményezni. Már csak a pwm változó értékét kell változtatnod valamilyen algoritmus szerint. Vayg beállítod egy-egy értékre0-255 között és lefordítva a programot, megfigyeled, hogy tényelg változik a fényerő.
Szerintem ez nem frekvencia moduláció, mert a led felvillanások közötti idő (a 13-as kivezetés felfutó élei közötti eltelt idö) nem változik a pwm értékétől. A delay mögé írt érték befolyásolja a led felvillanások frekvenciáját!
Remélem nem beszéltem zöldséget, elég erősen kezdő vagyok!
Erre gondoltál a kérdésedben?
Re: Tanfolyam - a pelda batch-ek ertelmezese
a PWM nem frekvencia moduláció, ne keverd őket!
a pwm az impulzus szélesség moduláció, jelen esetben az állandó frekvenciájú négyszögjel impulzusszélességét változtatja meg.
így csinál quasi-analóg kimenetet, mert az így kialakított jel egy integrátor tag után (ez egy villogó led esetén a szemed is lehet) változó "analóg" jel jelenik meg. http://www.hobbielektronika.hu/cikkek/l ... .html?pg=8
az általad hozott két programban a pwm értéke konstans. sajnos így nem tudja megmutatni a változó pwm értékhez tartozó "analóg" jel változását.
ha a pwm jelet algoritmussal változtatod, akkor a program látványosan szemlélteti a pwm működését
tégy a 10-es lába egy ledet egy 1k5- ellenállással sorbakötve, és nézd a fényerejét!
ha van oszcilloszkópod. nézd meg a jelalakot! (felfutó élre triggerelve)
a pwm az impulzus szélesség moduláció, jelen esetben az állandó frekvenciájú négyszögjel impulzusszélességét változtatja meg.
így csinál quasi-analóg kimenetet, mert az így kialakított jel egy integrátor tag után (ez egy villogó led esetén a szemed is lehet) változó "analóg" jel jelenik meg. http://www.hobbielektronika.hu/cikkek/l ... .html?pg=8
az általad hozott két programban a pwm értéke konstans. sajnos így nem tudja megmutatni a változó pwm értékhez tartozó "analóg" jel változását.
ha a pwm jelet algoritmussal változtatod, akkor a program látványosan szemlélteti a pwm működését
Kód: Egész kijelölése
void setup() {
byte pwm=3; // indulasi alap
pinMode(13, OUTPUT); // LED
}
void loop() {
if (pwm==255) {pwm=0;}
pwm++;
analogWrite(10, pwm); //D10 analog kimenet 3, 5, 6, 9, 10, 11 lehet
//a 13 led villogását használjuk időzítőként, 30ms-onként lép a pwm értéke
digitalWrite(13, HIGH); // LED on
delay(15);
digitalWrite(13, LOW); // LED off
delay(15); // varakozas
}
ha van oszcilloszkópod. nézd meg a jelalakot! (felfutó élre triggerelve)
Re: Tanfolyam - a pelda batch-ek ertelmezese
Értem, köszi.
Re: Tanfolyam - a pelda batch-ek ertelmezese
Ez a sor tök felesleges: if (pwm==255) {pwm=0;}
Az átfordulást a HW megoldja!
Mert itt számítanak az időzítések is! Azt pedig így elrontod!
Az átfordulást a HW megoldja!
Mert itt számítanak az időzítések is! Azt pedig így elrontod!
Re: Tanfolyam - a pelda batch-ek ertelmezese
pont azért tettem bele, mert így érthetőbb a kódkapu48 írta:Ez a sor tök felesleges: if (pwm==255) {pwm=0;}
Az átfordulást a HW megoldja!
én tudom, te tudod, de inkább írjuk ki, minthogy a tanulás rovására menjen a dolog
csabeszq írta: Nem illik túlpörgetni egy számlálót, mert gátolja a megértését a kódnak.
Re: Tanfolyam - a pelda batch-ek ertelmezese
És így sosincs 0-a?
if (pwm==255) {pwm=0;}
pwm++; 1-el kezded! ?
if (pwm==255) {pwm=0;}
pwm++; 1-el kezded! ?
Re: Tanfolyam - a pelda batch-ek ertelmezese
Az adott Hardwer programozását is meg kel tanulni!
Most nem 64bites 2GHz-en futó 2 magos Intel procit programozunk!
És az egyetemen tanított módszerek sem kőbe vésettek!
Most nem 64bites 2GHz-en futó 2 magos Intel procit programozunk!
És az egyetemen tanított módszerek sem kőbe vésettek!
Re: Tanfolyam - a pelda batch-ek ertelmezese
Nem erről van szó. Az ember csinál néha necces dolgokat, de egy ilyen kódot helyből visszautasítanék egy review-n.
Tekintsünk most el attól a koncepcionális problémától, hogy a kódban az interrupt hívás befolyásolhatja a LED fényerejét. Úgysem fogod észrevenni.
A fenti sor egyrészt tartalmaz egy kommentet, aminek semmi értelme nincs. Fölösleges C nyelvet oktatni, hogy softpwm++ => softpwm = softpwm + 1.
Viszont körbeforgatni egy számlálót már igencsak necces dolog. Meg kell nézni, hogy hány bites, előjeles-e, vagy nem előjeles,... A fenti kód kizárólag byte típussal megy rendesen, ezt pedig jelezni kellene.
Tehát:
Ebben az esetben nem a körbeforgatással van a fő baj, hanem az, hogy a softpwm++ még csak véletlenül sem utal arra, hogy ez megtörténhet, ráadásul ki is van használva. Nem is érti kezdetben aki elolvassa, hogy mit csinál a rutin.
Tekintsünk most el attól a koncepcionális problémától, hogy a kódban az interrupt hívás befolyásolhatja a LED fényerejét. Úgysem fogod észrevenni.
Kód: Egész kijelölése
softpwm++; //softpwm=softpwm+1
Viszont körbeforgatni egy számlálót már igencsak necces dolog. Meg kell nézni, hogy hány bites, előjeles-e, vagy nem előjeles,... A fenti kód kizárólag byte típussal megy rendesen, ezt pedig jelezni kellene.
Tehát:
Kód: Egész kijelölése
softpwm++; // 255 után körbefordul 0-ra
Re: Tanfolyam - a pelda batch-ek ertelmezese
Ha nem érti, akkor elkel neki magyarázni!
Nem pedig megkeverni a levest a fejében!
Amitt it csinált a 0-tól - 255-ig terjedő értéknek levágta a 2 végét:
if (pwm==255) {pwm=0;} // törölte a 255-öt
pwm++; // növelte a 0-át 1-re
analogWrite(10, pwm); //D10 analog kimenet 3, 5, 6, 9, 10, 11 lehet
Inkább elmagyaráztátok volna neki, hogy a: byte pwm-be 0-255 érték fér bel
Mert amit te akarsz az nem fér bel a byte méretbe!
Nem működik, hogy: if (pwm > 255) {pwm=0;}
Még 1*! Ez a sor elrot mindent!:
if (pwm==255) {pwm=0;} // törölte a 255-öt
Az egyetemi babla meg nem itt érvényes!
Nem pedig megkeverni a levest a fejében!
Amitt it csinált a 0-tól - 255-ig terjedő értéknek levágta a 2 végét:
if (pwm==255) {pwm=0;} // törölte a 255-öt
pwm++; // növelte a 0-át 1-re
analogWrite(10, pwm); //D10 analog kimenet 3, 5, 6, 9, 10, 11 lehet
Inkább elmagyaráztátok volna neki, hogy a: byte pwm-be 0-255 érték fér bel
Mert amit te akarsz az nem fér bel a byte méretbe!
Nem működik, hogy: if (pwm > 255) {pwm=0;}
Még 1*! Ez a sor elrot mindent!:
if (pwm==255) {pwm=0;} // törölte a 255-öt
Az egyetemi babla meg nem itt érvényes!
Re: Tanfolyam - a pelda batch-ek ertelmezese
Igaz, hogy Windowson nevelkedet, programozók nem ismerik a 8 bites gépet!
És gondtalanul elhasználnak 2 Bytet 1 Byte helyett!
És még ostobán tanítják is!???
De aki odafigyel, a programja optimális viselkedésére az nem utánozza őket!
És gondtalanul elhasználnak 2 Bytet 1 Byte helyett!
És még ostobán tanítják is!???
De aki odafigyel, a programja optimális viselkedésére az nem utánozza őket!
Re: 60 nap alatt Arduino #13 - PWM - Tanfolyam - a pelda batch-ek ertelmezese
A téma itt is körüljárásra került már: viewtopic.php?f=34&t=1058
Admin: Duplikált téma miatt lezártam.
Admin: Duplikált téma miatt lezártam.
http://www.tavir.hu - a gazda