60 nap alatt Arduino #13 - PWM - Tanfolyam - a pelda batch-ek ertelmezese

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Tiborx8
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2016. november 28. hétfő, 19:40

60 nap alatt Arduino #13 - PWM - Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: Tiborx8 » 2016. december 1. csütörtök, 12:57

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.

Avatar
csabeszq
Bitfaragó
Hozzászólások: 670
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: csabeszq » 2016. december 1. csütörtök, 14:37

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.

Tiborx8
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2016. november 28. hétfő, 19:40

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: Tiborx8 » 2016. december 1. csütörtök, 14:44

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?

Tiborx8
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2016. november 28. hétfő, 19:40

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: Tiborx8 » 2016. december 1. csütörtök, 14:46

pwm helyett akár cons-nak is nevezhetnenk, mivel konstans.

bagizoltan
Bitmanipulátor
Hozzászólások: 114
Csatlakozott: 2015. december 8. kedd, 19:52
Tartózkodási hely: Budapest

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: bagizoltan » 2016. december 1. csütörtök, 14:55

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?

Avatar
csegebiga
Chipgyilok
Hozzászólások: 284
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: csegebiga » 2016. december 1. csütörtök, 15:48

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

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
}

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)

Tiborx8
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2016. november 28. hétfő, 19:40

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: Tiborx8 » 2016. december 1. csütörtök, 15:52

Értem, köszi.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: kapu48 » 2016. december 1. csütörtök, 15:58

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!

Avatar
csegebiga
Chipgyilok
Hozzászólások: 284
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: csegebiga » 2016. december 1. csütörtök, 16:06

kapu48 írta:Ez a sor tök felesleges: if (pwm==255) {pwm=0;}
Az átfordulást a HW megoldja!

pont azért tettem bele, mert így érthetőbb a kód
é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.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: kapu48 » 2016. december 1. csütörtök, 16:30

És így sosincs 0-a?
if (pwm==255) {pwm=0;}
pwm++; 1-el kezded! ?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: kapu48 » 2016. december 1. csütörtök, 16:34

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!

Avatar
csabeszq
Bitfaragó
Hozzászólások: 670
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: csabeszq » 2016. december 1. csütörtök, 18:04

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.

Kód: Egész kijelölése

softpwm++; //softpwm=softpwm+1


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:

Kód: Egész kijelölése

softpwm++; // 255 után körbefordul 0-ra


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.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: kapu48 » 2016. december 1. csütörtök, 23:31

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!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: kapu48 » 2016. december 1. csütörtök, 23:44

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!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM - Tanfolyam - a pelda batch-ek ertelmezese

HozzászólásSzerző: Robert » 2016. december 2. péntek, 6:46

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.
http://www.tavir.hu - a gazda :)


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég