60 nap alatt Arduino #13 - PWM, analogWrite

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00
Tartózkodási hely: Budapest

60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: SzLacus » 2012. július 29. vasárnap, 21:17

Sziasztok!
A #13 hf-nek már a minta példája sem működik nekem. A minta célja gondolom, hogy folyamatosan növekvő fényerő legyen a leden. Nyilván úgy csináljuk, hogy a kitöltést folyamatosan növeljük.
Azt látom, hogy a pwm változót létrehoztuk 1 kezdő értékkel, és hogy a softpwm-et addig növeljük, amíg el ne éri pwm értékét, akkor maceráljuk a ledet, de pwm-et senki nem növeli, így nem fog növekedni a kitöltés, hiszen az első lépésben már hamis a feltétel. Egy rövid villanás az eredmény. Ezért a végére odaírtam a pwm változó növelését.

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

byte pwm=1;                     // Milyen kitoltesu legyen a jel indulaskor (0..255)
byte softpwm=0;                 // belso szamlalo
 
void setup() {               
  pinMode(13, OUTPUT);          //A 13-as lab kimenet mert gyarilag ezen van LED
}
 
void loop() {
  softpwm++;                   //softpwm=softpwm+1
  if (softpwm < pwm) {
    digitalWrite(13, HIGH);     // LED on
  } else {             
    digitalWrite(13, LOW);      // LED off
  pwm++;
  }
  delay(3);                   // varakozas ket lepes kozt
}

Ekkor viszont még az az egy rövid felvillanás is elmarad.
Mondjuk Azt sem értem miért is villan fel, mert a loop első lépésében még az if előtt növeljük a softpwm értékét, ezért a legelső összehasonlításban már az "else" ágon találjuk magunkat. És innentől már növelhetem én a pwm értékét, azt mindíg követi a softpwm, és mindíg egyenlők leszne, vagyis minden kanyarban az else ág fog futni. De ha kiveszem a pwm növelését, vagyis az eredeti példához vissza térek, akkor meg ki kapcsolja be a ledet.
Na most jöhet a segítség,, mert valamit nagyon nem veszek észre. :-)
Ja, amikor a bájton átfordul, akkor egy alkalommal az "igaz" ágon lesz, ezért villan fel a led. De a segítség még kell, mert a működés elmarad a várttól, és még a leckébe bele sem kezdtem. :-)

Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00
Tartózkodási hely: Esztergom
Kapcsolat:

Re: PWM-et annak a lednek

HozzászólásSzerző: fodor99 » 2012. július 29. vasárnap, 22:18

SzLacus írta:Sziasztok!
A #13 hf-nek már a minta példája sem működik nekem. A minta célja gondolom, hogy folyamatosan növekvő fényerő legyen a leden. Nyilván úgy csináljuk, hogy a kitöltést folyamatosan növeljük.
Azt látom, hogy a pwm változót létrehoztuk 1 kezdő értékkel, és hogy a softpwm-et addig növeljük, amíg el ne éri pwm értékét, akkor maceráljuk a ledet, de pwm-et senki nem növeli, így nem fog növekedni a kitöltés, hiszen az első lépésben már hamis a feltétel. Egy rövid villanás az eredmény. Ezért a végére odaírtam a pwm változó növelését.

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

byte pwm=1;                     // Milyen kitoltesu legyen a jel indulaskor (0..255)
byte softpwm=0;                 // belso szamlalo
 
void setup() {               
  pinMode(13, OUTPUT);          //A 13-as lab kimenet mert gyarilag ezen van LED
}
 
void loop() {
  softpwm++;                   //softpwm=softpwm+1
  if (softpwm < pwm) {
    digitalWrite(13, HIGH);     // LED on
  } else {             
    digitalWrite(13, LOW);      // LED off
  pwm++;
  }
  delay(3);                   // varakozas ket lepes kozt
}

Ekkor viszont még az az egy rövid felvillanás is elmarad.
Mondjuk Azt sem értem miért is villan fel, mert a loop első lépésében még az if előtt növeljük a softpwm értékét, ezért a legelső összehasonlításban már az "else" ágon találjuk magunkat. És innentől már növelhetem én a pwm értékét, azt mindíg követi a softpwm, és mindíg egyenlők leszne, vagyis minden kanyarban az else ág fog futni. De ha kiveszem a pwm növelését, vagyis az eredeti példához vissza térek, akkor meg ki kapcsolja be a ledet.
Na most jöhet a segítség,, mert valamit nagyon nem veszek észre. :-)
Ja, amikor a bájton átfordul, akkor egy alkalommal az "igaz" ágon lesz, ezért villan fel a led. De a segítség még kell, mert a működés elmarad a várttól, és még a leckébe bele sem kezdtem. :-)


delay-t probaltad novelni?

Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00
Tartózkodási hely: Budapest

"A megoldás kulcsa?"

HozzászólásSzerző: SzLacus » 2012. július 29. vasárnap, 22:30

Folytatva a küzdelmet, azt gondolom, hogy a megoldásban úgy kell a pwm értékét növelgetni, hogy előtte a softpwm megteszi a dolgát. Ez egy újab if-el megoldva nálam így néz ki.

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

byte pwm=1;                     // Milyen kitoltesu legyen a jel indulaskor (0..255)
byte softpwm=0;                 // belso szamlalo
 
void setup() {               
  pinMode(13, OUTPUT);          //A 13-as lab kimenet mert gyarilag ezen van LED
}
 
void loop() {
  softpwm++;                   //softpwm=softpwm+1
  if (softpwm < pwm) {
    digitalWrite(13, HIGH);     // LED on
  } else {             
    digitalWrite(13, LOW);      // LED off
  if (softpwm >= pwm) {
    pwm++;
    softpwm=0;
  }
  }
  delay(3);                   // varakozas ket lepes kozt
}

Vagyis azt szerettem volna, ha amikor egyenlővé válik a softpwm a pwm-el, (vagy fölé megy, mert "az ördög nem lefeküdt") akkor növeljük a pwm-et és újra kezdetjük a softpwm-el a játékot.
Ez sem működik, ez folyamatosan világít. Valamit nagyon nem veszek észre, úgy hogy most alszom rá egyet. :-)

Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00
Tartózkodási hely: Budapest

HozzászólásSzerző: SzLacus » 2012. július 29. vasárnap, 23:00

Szia Fodor99!
A delay macerálása az jó ötlet, de csak az újabb változaton, mert a szem számára látható tartományba hozza a történéseket, a 20 mses környékére toljuk a delayt. Akkor legalább látszik, hogy villog, süt egyre hosszabban világít, de a sötét rész nem változik arányosan. Mondjuk kitől is változna hiszen azt senki nem mondja meg neki, hogy az alapidő maradékában legyen kikapcsolva. Amúgy az tisztán látszik, hogy a Led így nem fogja fényerő változásként megjeleníteni a dolgot, egy kondival, meg egy ellenállással meg fog kelleni toldani, hogy valami ki integrálja a pwm jelet egyen feszkóvá. De ha már látom, hogy a jel szünet arány változik, miközben a kettő összege egy állandó időt ad, akkor megoldottnak tekintem a feladványt, és rámegyek az eredeti feladatra a nyomógombos kombinációra.

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

HozzászólásSzerző: Robert » 2012. július 30. hétfő, 5:21

Egyről felejtkezel el:
SoftPWM: Byte!
Azaz ha az értéke 255, akkor: 255+1 = 0! Itt a túlcsordulás...

Delay csökkentése esetén a szem fog átlagolni, mert a LED ki/bekapcsolása a usec ideje alatti...

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

HozzászólásSzerző: Robert » 2012. július 30. hétfő, 5:40

Az első hozzászólásban leírt felvetés nem jó. A program célja, hogy valamelyik fényerőn világítson a LED.
A folyamatos növelés/csökkentés nem volt cél.

Az elképzelésed nem jó a mintádban: A softPWM változót nem piszkáljuk. A PWM változóval mondod meg, hogy hol legyen a billenési küszöb.

A programoddal az elképzelés jó, a megvalósítás majdnem :)

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

byte pwm=1;                     // Milyen kitoltesu legyen a jel indulaskor (0..255)
byte softpwm=0;                 // belso szamlalo
byte ugrik ; //minden ugrik. kioltasnal nojon a PWM
 
void setup() {               
  pinMode(13, OUTPUT);          //A 13-as lab kimenet mert gyarilag ezen van LED
}
 
void loop() {
  ugrik++;
  if (ugrik == 30) {  //minden 30. esetben lép a pwm
    pwm=pwm + 5;  //ez és a 30 állítható, így a változás még szemmel látható...
    ugrik=0;
  }


 softpwm++;                   //softpwm=softpwm+1
  if (softpwm < pwm) {
    digitalWrite(13, HIGH);     // LED on
  } else {             
    digitalWrite(13, LOW);      // LED off
  //softpwm++;
  }
  delay(3);                   // varakozas ket lepes kozt }

Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00
Tartózkodási hely: Budapest

HozzászólásSzerző: SzLacus » 2012. július 30. hétfő, 22:09

Róbert rávilágított a lényegre. Csak azt várjuk a program működésétől, amire szánták. :-) Akkor van esélye a helyes működésre.
Köszi a segítséget, a részletek azok fontosak ezt meg kell szoknom. Mondjuk az is, hogy a végén a delay az megjegyzés, és arra szolgált, hogy megjelölje azt a helyet ahová a gombnyomásos késleltetést be kell tenni, a hf során. No én a // azt már az első kiküldés előtt kiszedtem vagyis nekem mindig volt delay. Nem is látszott a fényerő szabályzás a pwm változtatása ellenére, ezért írtam, hogy nekem nem működik.
A célom az volt, hogy a led pulzálva növelje majd csökkentse a fényét. ennek első lépésében tegnap a felfelé növekvő irányt próbáltam megalkotni elég kevés sikerrel. Most viszont a kapott segítségekkel megmutatom nekem hogyan sikerült a lüktető ledet megalkotni.

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

byte pwm=1;                     // Milyen kitoltesu legyen a jel indulaskor (0..255)
byte softpwm=0;                 // belso szamlalo
boolean upDown=1;                  // 1 ha növeljük, 0 ha csökkentjük a fényt
 
void setup() {               
  pinMode(13, OUTPUT);          //A 13-as lab kimenet mert gyarilag ezen van LED
}
 
void loop() {
  if (pwm == 0) {
    upDown=1;
  }
  if (pwm == 255) {
    upDown=0;
  }
  softpwm++;                   //softpwm=softpwm+1
  if (softpwm < pwm) {
    digitalWrite(13, HIGH);     // LED on
  } else {             
    digitalWrite(13, LOW);      // LED off
  if (softpwm == 255) {
  if (upDown !=0) {
    pwm++;
    softpwm=0;
  } else {
    pwm--;
    softpwm=0;
  }
  } 
  }
//  delay(1);                   // varakozas ket lepes kozt
}

A delay maradjon megjegyzés, mert villogássá válik tőle a folyamatos változás.
De még nem teljes az örömöm, mert a lecke HardPWM mintaprogramja az nálam nem dolgozik, de most előbb kérdezek, és csak utána bombázom szét a mintát, amit itt közzéteszek, legyen miről beszélnünk.

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

/*
  HardPWM
  hardver alapú impulzusszelesseg-modulacio
  60 nap alatt arduino tanfolyam
  (c) TavIR http://avr.tavir.hu
 */
 
byte pwm=3;                     // Milyen
kitoltesu legyen a jel indulaskor (0..255)
 
void setup() {               
  pinMode(13, OUTPUT);        //A 13-as lab
kimenet mert gyarilag ezen van LED
  analogWrite(10, pwm);       //10-es labon 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
}

Mit is várunk ettől a programtól. Én elsőre egy fél másodperces villogást fele-fele kitöltéssel. Látom a 10-es láb definiálását a setupban, de azzal a loopban nem történik semmi. Lemaradt valami? Nem jött meg a levelem teljes egészében? Vagy le kellett volna töltenem valamit amit a szokásos figyelmetlenségemben nem vettem észre? Hogyan kell használni ezt a hardPWM-et?

Avatar
Fizikus
DrótVégénSzéndarab
Hozzászólások: 21
Csatlakozott: 2010. július 16. péntek, 6:00
Tartózkodási hely: Perth, Ausztrália

HozzászólásSzerző: Fizikus » 2012. július 31. kedd, 1:17

SzLacus írta:Hogyan kell használni ezt a hardveres PWM-et?


analogWrite(láb, érték); - ha egy lábat kimenetnek állítottunk be, és a láb képes PWM-re, akkor ezzel az utasítással adhatunk rá PWM jelet. A függvénynek paraméterként egy 0 - 255 közötti értéket kell megadni a kitöltési tényező beállításához.
A Fizikus nem szakma, ELMEÁLLAPOT!

Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00
Tartózkodási hely: Budapest

HozzászólásSzerző: SzLacus » 2012. július 31. kedd, 11:56

Köszi ez érthető.
De a 13-ason levő led ettől még nem fog "fényrőszabályozódni". Márpedig a pwm-et a led fényrejének változtatásán keresztül próbáljuk most megérteni, rámutatva a swpwm használhatatlanságára. Ahhoz hogy a hwpwm előnyét és működését lássuk, a ledet a 10-esre kéne nyomatni, vagy a 10-es lábat folyamatosan kopizni a 13-ra. Szóvak nekem valami lemaradt, vagy a példa nem arra példa amit én várnék tőle, és ez nem az első tévedésem. :-)

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

HozzászólásSzerző: Robert » 2012. július 31. kedd, 12:11

HWPWM összesen 6 lábon lehet. A D13 nincs közte...
A 6 lábon kívülieket csak SoftPWM-l lehet szabályozni,...

Avatar
BraskoS
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2011. április 12. kedd, 6:00
Tartózkodási hely: Miskolc
Kapcsolat:

HozzászólásSzerző: BraskoS » 2012. augusztus 8. szerda, 20:39

Sziasztok!

A hwpwm milyen frekvencián működik? (ATMEGA168)
Találtam egy oldalt:
http://sim.okawa-denshi.jp/en/PWMtool.php

Itt jól szimulálható az eredménye a kapcsolásba épített ellenállás és kondenzátor értékek változtatásának.
Ha viszont bármilyen értékű (100n-1000n) elkot berakok az áramkörömbe, akkor nem világít a Led. :-(

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

HozzászólásSzerző: Robert » 2012. augusztus 8. szerda, 20:59

~700 Hz.

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

HozzászólásSzerző: kapu48 » 2012. augusztus 8. szerda, 21:01

Nem tudom angolul jöhet?
PWM IN AVR: http://robotika.yweb.sk/skola/AVR/visio ... 20v1.0.pdf

Vagy:
Az impulzus-szélesség moduláció (PWM) alapjai
http://www.hobbielektronika.hu/cikkek/l ... .html?pg=8
8)

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

HozzászólásSzerző: Robert » 2012. augusztus 8. szerda, 21:08

Más mikrovezérlőt ne keverjünk ide....


http://arduino.cc/en/Reference/analogWrite
E szerint 490 Hz...

Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00
Tartózkodási hely: Budapest

HozzászólásSzerző: SzLacus » 2012. augusztus 10. péntek, 11:34

A pwm meg az rc tagon mérhető feszkót akadémiai mélységig :-) kielemeztük, de miért is nem világít a led az rc tag mögött. Meglátásom szerint ha kellően magas kitöltéssel toljuk akkor világítani fog, bár a fényerő szabályzás jelensége mérsékelten fog látszani rajta, és ez így van jól. A lednek van egy rá jellemző nyitó feszültsége. Amíg ezt el nem érjük, addig nem látunk semmit, nem világít. A nyitó feszültség (leegyszerűsítve) színfüggő, de nem járunk messze a valóságtól ha a 2 volt körüli, akár feletti, (ide majd biztosan jönnek az adatlap linkek a többiektől) tartományra gondolunk. Vagyis amíg az töltött kondin ezt el nem érjük a led sötét lesz, és csak innen felfelé fog fényt kiadni magából. Azt is érdemes tudni, hogy a leden átfolyó árammal nem lehet túl hatékonyan szabályozni a fényerejét, vagyis mondjuk ha 10 vagy 20 mA-t folyatunk raja, attól a fényereje nem fele duplája arányú lesz. Viszont, ha teljes kitöltés mellett sem világít, akkor az R tag túl nagy a ledhez, és kondi nélkül sem világítana a led. (próbáld ki) Vagyis az én rc tagos felvetésem az led esetén erős korlátokkal bír, de egy multiméterrel klasszul lehet látni az egyen feszültséget a kondin. Led esetén a kondi nélküli változat azért működik fényerő szabályzásként, mert a led az előtét ellenállás által korlátozott áram adta teljes fényerővel világít, de csak rövid ideig. A fényerő átlagolását ilyenkor a szem végzi, és elég jól. Ha az átlagolást az RC tagra bízzuk, akkor a led nem tud rövid időre felvillanni, hanem állandó áram folyik rajta a kondiból, de csak majd ha ki tud nyitni.


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