60 nap alatt Arduino #13 - PWM, analogWrite

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

HW-PWM példa

Hozzászólás Szerző: normen »

Szaisztok!

Nem tudom, hogy másnak feltűnt-e (vagy csak én értek valamit nagyon félre), szerintem a HW-PWM-re írt 2. példaprogrammal több részben is gond lehet. Ha jól értem az lett volna a cél, hogy egy PWM képes láb segítségével vezéreljük egy led fényerejét.

1. A példa programban használt két digitális láb közül (10 és 13) csak a 10-es képes hardveres PWM-re. Azt viszont nem írja a példa, hogy kössünk ide egy ledet (pedig szerintem kéne).

2. A setup() eljárásban nincs inicializálva a 10-es láb OUTPUT-ként (alapértelmezésként minden digitális láb INPUT)

3. A setup() eljárásban a 10-es lábra küldünk eg 3-as kitöltöttségű PWM jelet. Ha led lenne odakötve (feltéve, hogy OUTPUT), akkor az egy nagyon halványan felvillanást eredményezne.

4. A loop() eljárásban csak a 13-as lábat (beépített ledet) kapcsolgatjuk ki/be. A HW-PWM képes 10-s lábhoz hozzá sem nyúlunk.

Tehát a példa (mivel 10-es port OUTPUT-ként sem lett definálva, illetve nem lett oda semmi kötve) csak a beéptett led-et villogtatja szerintem.

Szemléltetőbb pédla lenne például egy 10-es lábra kötött led fényeresjének folyamatos növelése, majd csökkentése, például:

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

#define LED 10                       //10-es lábra van kötve a led
#define FENYERO_MAX 255  //maximum fényerő 
#define FENYERO_MIN 0        //minimum fényerő

int atfedes= 5;   //Ilyen léptékben változtatjuk a fényerőt
int fenyero=0;    //aktuális fényerő (0-255)

void setup() {
  pinMode(LED, OUTPUT);   //10-es láb OUTPUT
}

void loop() {
   //Beállítjuk a fényerőt
  analogWrite(LED, fenyero);

  //Növeljük a fényerőt az átfedés értékével
  fenyero+=atfedes;
  
  //Ha elértük a max vagy min fényerőt,
  //akkor változtatjuk az átfedés irányát
  if (fenyero==FENYERO_MAX || fenyero==FENYERO_MIN) 
   atfedes*=-1;
  
  //várakozunk 50ms-ot, hogy lássuk az átfedést
  delay(50);
}
Elnézést és javítsatok ki, ha én tévedtem és valamit nagyon félreértettem. (Mentségemre szolgáljon, hogy én is csak nem rég kezdtem el AVR/Arduinoval ismerkedni)

Üdv.
NorMen
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Gyakorlat :).

Ha a HW PWM-et használod, akkor _automatikusan_ megtörténik a láb kimenetre állítása. Pontosan: nem DIGITÁLIS kimenet lesz (mint I/O láb), hanem a TIMERx belső HW kapocsolódik ekkor a lábra és ez kimenetként jelenik meg.


A 10-es lábra tényleg kell LED (valamin lássuk, hogy megy).

3-s kistöltés nem felvillanás. Halványan parázslik.
470 Hz-s 3/255 kitöltésű a rájutó jel.
Ha jó a szemed, akkor villogni látod:) (470 Hz-vel, és akkor légy vagy)


Az észrevétel a LED bekötésre jogos!
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

Hozzászólás Szerző: glezmen »

Robert írta: Ha a HW PWM-et használod, akkor _automatikusan_ megtörténik a láb kimenetre állítása. Pontosan: nem DIGITÁLIS kimenet lesz (mint I/O láb), hanem a TIMERx belső HW kapocsolódik ekkor a lábra és ez kimenetként jelenik meg.
ezt nem lenne haszontalan beletenni a tanfolyami e-mailbe (bar enelkul legfeljebb feleslegesen bekapcsolja az ember azt a labat outputra, szoval katasztrofa nem tortenik)

a masodik mondattol viszont felmerult bennem egy kerdes: ugye ettol meg minden PWM-es pin teljesen fuggetlen a tobbitol? tehat lehet mondjuk 5, teljesen kulonbozo kitoltesu HWPWM outputom egyszerre?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

IGEN. Mind 4 (Mega8), ill 6 (Mega168/328) független_kitöltésű_. A frekvencia viszont Arduino alatt kötött: ~480 Hz
Krytech
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2014. január 26. vasárnap, 15:15

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: Krytech »

Sziasztok!

Olyan parancs van Arduino-ra amivel a pwm kimeneti jeleket tudom állítani lineárisan de nem 0-255 ig hanem Hz -k ben pl. 15kH és 25kH között, vagy muszáj lesz átmatekoznom 0-255 ig a 31250Hz . Nekem ez is megfelelő lenne de ez így nem adna ki pontos értékeket.

Köszönöm: KRY
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: Robert »

Nincs.
A kimeneti pwmfrekvencia: kb. 480 Hz
tajtilaci
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2014. május 7. szerda, 17:20

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: tajtilaci »

Sziasztok!

En a kovetkezokeppen oldottam meg a feladatot:

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

byte pwm=127;    // Kezdeti jelkitoltes

byte softpwm=0; // belso szamlalo
 
void setup() {                
  pinMode(13, OUTPUT);  //A 13-as lab kimenet, LED
  pinMode(6, INPUT);  // A 6-os lab nyomogomb bemenet
}
 
void loop() {
  softpwm++; //softpwm=softpwm+1
  if (softpwm < pwm) {
    digitalWrite(13, HIGH); // LED be
    
  } else {              
    digitalWrite(13, LOW); // LED ki
    
  }
  if (digitalRead(6) == HIGH) { // nyomogomb nyomva
    delay(100);  // kesleltetes 100 ms
                // delay(3);
               // varakozas ket lepes kozt
}
}

A nyomogomb a 100 ms kesleltetesevel, igen rendesen belassitja a folyamatot. Erdemes oszcilloszkopon is megnezni.

Udv,

T.L.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: Robert »

SoftPWM-nek ez a nagyon nagy hátránya....
Erőforrást foglal és semmi má időigényes sem végezhető.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: csabeszq »

SoftPWM-nek ez a nagyon nagy hátránya....
Erőforrást foglal és semmi má időigényes sem végezhető.
Egy 50Hz-es PWM jel kiadása nem olyan eszméletlen erőforrásigényes, ha megszakítással oldod meg.

Maradjunk annyiban, hogy implementációfüggő. Ha talál az ember olyan arduino softpwm lib-et, ami megszakításokat használ és a frekvencia 5kHz alatt van, akkor még nem vészes az egész.
Jazzkedvelo
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2014. december 8. hétfő, 20:03

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: Jazzkedvelo »

Robert írta:Nincs.
A kimeneti pwmfrekvencia: kb. 480 Hz

Kedves Róbert,

Amennyiben ismereteim nem csalnak - bár még csak ismerkedem az Arduinoval - a PWM frekvencia állítható, csak éppen regiszterszintű művelet szükséges hozzá. Tulajdonképpen a timer-ek frekiosztójával lehet játszani, és mivel minden lábhoz más timer kapcsolódik, ezért nem is feltétlenül ugyanaz az érték minden lábon.

Itt van róla jó leírás:
http://playground.arduino.cc/Main/TimerPWMCheatsheet

http://playground.arduino.cc/Code/PwmFrequency

(Természetesen ez nem a 14- lecke szintjéhez illeszkedő elméleti hátterű anyag, mindenesetre lehet állítani a frekit)
cree
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2016. február 14. vasárnap, 19:17

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: cree »

sziasztok!
Kérnék egy kis segitséget:
soft start efektusra van szükségem és müködik de csak felfutási álapotban az az 0....255 felfut és vége!

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

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by


void setup() {
 
  pinMode(led, OUTPUT);
}


void loop() {
  
  analogWrite(led, brightness);

  
  brightness = brightness + fadeAmount;

 
  if (brightness > 255)
  {
    brightness = 255;
   
  }
  
  delay(30);
}
visszafelé tulcsordulás van 255...0 és ujra fut mindig de milyen okbol?

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

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by


void setup() {
 
  pinMode(led, OUTPUT);
}


void loop() {
  
  analogWrite(led, brightness);

  
  brightness = brightness - fadeAmount;

 
  if (brightness > 255)
  {
    brightness = 255;
   
  }
  
  delay(30);
}
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: kapu48 »

Gondolkoz keveset!

int: https://www.arduino.cc/en/Reference/Int

int brightness = 0;
int fadeAmount = 5;

brightness = brightness - fadeAmount;
levezetve:

0 = 0 - 5; (-32,768 - 5 = -32,763)
-32,763 = -32,763 -5;
...
cree
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2016. február 14. vasárnap, 19:17

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: cree »

kapu48 írta:Gondolkoz keveset!

int: https://www.arduino.cc/en/Reference/Int

int brightness = 0;
int fadeAmount = 5;

brightness = brightness - fadeAmount;
levezetve:

0 = 0 - 5; (-32,768 - 5 = -32,763)
-32,763 = -32,763 -5;
...
Tulcsordulást nem értem akor sem!
Mit lehetne teni javaslatot kérhetnék?

A kod fade mintapéldábol már átirtam nehezen de mindent én sem tudhatok pláne ekora matekal....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: Robert »

Byte alapon vagy.
A 60 napos tanfolyam _számok_ részén van egy kulcsszó: Túlcsordulás.
Ez lehet alul vagy felülcsordulás.
Egyszerűség kedvéért byte alapon túlcsordulás:

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

   1111.1111
  +0000.0001
  ----------
 1.0000.0000
8 biten ábrázolsz: 0000.0000 = 0

Az alulcsordulás ugyanez csak lefele számolva:

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

    0000.0000
   -0000.0001
   ----------
    1111.1111
Azaz 255.

A programkódodban lefele számolsz.
int led = 9; // the PWM pin the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by


void setup() {

pinMode(led, OUTPUT);
}


void loop() {

analogWrite(led, brightness);


brightness = brightness - fadeAmount;


if (brightness > 255) //Ez a rész a hibás!
{
brightness = 255;

}//kb. eddig :)

delay(30);
}
Kérdés 2: Ha a PWM-ed 0...255-ig terjed (BYTE vagy CHAR), minek foglalsz le 1 byte helyett 2 byte-nyi INTEGER-t?
cree
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2016. február 14. vasárnap, 19:17

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

Hozzászólás Szerző: cree »

más megközelitésben ez igy müködik....

felfelé.........

if(brightness < 255) {brightness = brightness+15;}
Serial.println(brightness);
analogWrite(diodePin, brightness);
delay(30);
break;

lefelé........

if(brightness > 0) {brightness = brightness-15;}
Serial.println(brightness);
analogWrite(diodePin, brightness);
delay(30);
break;
Válasz küldése