PWM: analóg csapok utánzása az Arduino táblával

PWM jelek

Az Arduino táblán használható digitális és analóg csapok segítségével elektromos jeleket fogadhat vagy küldhet az elektronikus projektek vezérléséhez vagy megszerzéséhez. Ezen kívül vannak még nagyon érdekes jelek is ebben a lemeztípusban, és ezek a PWM, amely képes analóg jelet emulálni anélkül, hogy valójában analóg lenne. Vagyis digitális csapok, amelyek hasonló módon (nem ugyanúgy) képesek működni, mint egy analóg jel.

Az ilyen típusú jelek nagyon praktikusak, ha nem csak digitális HIGH és LOW jeleket akar használni, azaz 1 vagy 0, ON és OFF, hanem tovább akar lépni és leírni valamivel összetettebb jelek. Például lehetséges az a sebességének modulálása DC motor, vagy egy fény fényintenzitása mágnesszelepnél stb.

Analóg vs digitális rendszer

Analóg vs digitális jel

Az elektronikus áramkörök két nagy családra vagy kategóriára oszthatók: digitális és analóg. A digitális elektronikáról beszélve diszkrét értékű mennyiségeket, vagyis egy bináris rendszert használunk, amelyet alacsony vagy magas feszültségű elektromos jelek képviselnek, hogy a kezelt bitek állapotát értelmezzük. Másrészt, amikor analóg áramkörről van szó, folyamatos értékű mennyiségeket használnak.

A digitális rendszereken belül viszont megtalálhatók kombinációs és szekvenciális típusúak. Vagyis az előbbiek azok, amelyekben a rendszer kimenete csak a bemenetek állapotától függ. Másrészt a szekvenciálisakban memóriaelemek szerepelnek, és a kimenet a bemenetek aktuális állapotától és az előző tárolt állapottól függ.

Az analógok esetében nincs ez a két nagy csoport vagy változat, mivel itt folyamatos jelekről van szó, amelyek mindig függnek a jel jelenlegi rendszer. Például egy hangszóróban a hozzá adott jel a reprodukálni kívánt hangtól függ. Ugyanez a helyzet egy mikrofonnal, amely a kapott hangtól függően analóg jelet generál. Bizonyára sok más érzékelővel is látta már, amelyeket leírtunk ebben a blogban, és amelyek analóg jelekkel működnek (ezért képletet kellett létrehozni, hogy később az Arduino IDE vázlatokban kiszámíthassák vagy kondicionálják az értékeket ) ...

Az egyik és a másik ezen jellemzői miatt egyesek megvannak előnyök és hátrányok, mint szinte mindenben szokás. Például a digitálisak olcsóbbak, gyorsabbak, könnyebben fejleszthetők, az információk könnyebben tárolhatók, nagyobb pontossággal rendelkeznek, programozhatók, nem annyira kiszolgáltatottak a zaj hatásainak stb. De az is igaz, hogy az analógokkal komplexebb jelekkel lehet működni.

Által ejemplo, digitális típusú Hall-effektus-érzékelő csak a közeli mágneses mező jelenlétét vagy hiányát képes felismerni. Ehelyett egy analóg Hall-effektus-érzékelő képes erre, és a kimenetén generált analóg jelnek köszönhetően meghatározhatja a mágneses tér sűrűségét is. Tudva, hogyan értelmezzük jól ezt a magasabb vagy alacsonyabb feszültségű jelet, könnyen megismerheti ezt a nagyságot. A természet számos nagyságrendjében vannak más példái, amelyeket kvantitatív módon mérhet egy analóg rendszerrel, például hőmérséklet, idő, nyomás, távolság, hang stb.

Analóg vs digitális jel

Ennek ellenére a analóg jel Ez egy feszültség vagy elektromos áram lesz, amely idővel és folyamatosan változik. Ha grafikusan ábrázolják, az analóg jel egyetlen frekvenciájú szinuszhullám lenne.

Mivel a digitális jelA feszültség az idő függvényében fokozatosan változik. Vagyis, ha egy grafikonon ábrázolják, akkor lépésjel lesz, amely nem változik folyamatosan, hanem lépésekben vagy diszkrét lépésekben változik.

Tudnia kell, hogy vannak áramkörök az analóg jeltől a digitálisig, vagy fordítva. Ezek átalakítók DAC (digitális-analóg átalakító) és ADC (analóg-digitális átalakító) néven ismertek. És nagyon gyakoriak sok olyan eszközben, amelyet manapság használunk, például tévében, számítógépekben stb. Ezekkel átalakíthatja a berendezés által használt digitális jeleket elektronikus szintre, hogy más perifériákkal vagy alkatrészekkel működjön, amelyek analóg módon működnek.

Által ejemplohangszóró vagy mikrofon analóg jelekkel, amely hangkártyával működik, vagy digitális grafikus kártyák, amelyek az analóg monitor portjaihoz a híres RAMDAC chipet használták ... Az Arduino-ban ezt a típusú átalakítókat több projektre is használják, amint látni fogjuk ...

Mi az a PWM?

grafikus munkaciklus

Bár PWM (impulzus-szélesség moduláció) vagy impulzus szélesség moduláció, digitális bázissal rendelkezik, jelének alakja kissé "négyzet alakú" analóg jelre hasonlít. Ez lehetővé teszi digitális impulzusok segítségével a jel változtatását, hogy analóg rendszert emuláljon, amint azt már említettem. Valójában, ha megnézzük a nevet, az már a digitális impulzusok szélességén keresztül ad nyomokat arra vonatkozóan, hogy mit csinál.

Ez előnyös Arduino mivel sok automatizmus vagy elektronikus alkatrész adható hozzá a projektjeihez és ehhez nem képesek valódi analóg jel előállítására, de ezt a PWM-et használják működésre. Nem használhatnak diszkretizált analóg jelet, vagyis feszültségugrásokra utalnak, hogy hasonlítsanak egy digitálisra. Amit megtehetnek, az a digitális kimenet - Vcc vagy Vcc típusú digitális - létrehozása e különös jel előállításához.

Ezért a PWM egyfajta "trükk", amellyel az Arduino és más rendszerek együttműködhetnek az ilyen típusú jelekkel, amelyek nem egészen analógak és nem is hagyományos digitálisak. Ennek lehetővé tétele érdekében a digitális kimenetet egy meghatározott ideig vagy kikapcsolt állapotban tartják aktívan, a mindenkori érdeklődés függvényében. Ez messze van attól, ami digitális óra vagy bináris kódjel lenne, amelynek impulzusai azonos szélességűek.

Az Arduino-val végzett projektjeiben ellenőrizheti az ilyen típusú PWM jeleket, amelyekben az impulzusindítók állandó gyakorisága megmarad az idő múlásával, de ezen impulzusok szélessége változó. Valójában Duty Cycle-nak hívják, amikor a jelet a ciklus teljes értékéhez képest magasan tartják. Ezért a Duty Cycle% -ban megadva.

Ne feledje, hogy egy PWM-ben nem úgy működik, mint egy analóg jelben, több feszültségérték között, és ezek között ingadozik. A PWM esetében ez egy négyzet alakú jel digitális stílusban és amelynek maximális értéke Vcc. Például, ha 3 V-os tápegységgel dolgozik, akkor 3 V vagy 0 V impulzusokat adhat meg, de nem 1 V-ot, vagy bármilyen más közbenső értéket, mint ami egy valós analógban előfordulna. Ami ebben az esetben változna, az az impulzusszélesség, amelyet 30% -on tarthatunk ezen a magas Vcc értéken, vagy 60% -ot, hogy nagyobb teljesítményt kapjunk stb.

De légy óvatos, mert ha egy eszköz támogatja a Vcc-korlátot, és azt túllépi a PWM, akkor megsérülhet. Ezért mindig szükséges lenne tiszteletben tartani a gyártók által megadott adatlapok értékeit. Néhány eszközben, például az egyenáramú motorokban, relék, elektromágnesek stb., a feszültség visszavonása a munkaciklus után azt jelentheti, hogy az induktív terhelések károsodást okozhatnak. Ezért a védelmek időszerű.

PWM az Arduinón

Arduino I2C busz

Most, hogy tudja, hogyan működik, nézzük meg a PWM konkrét esetét az Arduino világban ...

PWM: pinout az Arduino-n

Az Arduino táblákon több olyan csap található, amely hardveres PWM-et valósít meg. Azonosíthatja őket magában a NYÁK-ban, mert rendelkezik a szimbólum ~ (kis fej) a csapok számozásával együtt. Megteheti az Arduino kódban lévő szoftverrel is, de ez túlterhelné a mikrovezérlőt munkával, valami abszurdummal, amikor natív módon és hardveresen is meg lehet csinálni ...

  • Arduino UNO, Mini és Nano- 6 db 8 bites PWM kimenete van a 3, 5, 6, 9, 10 és 11 érintkezőkön, amelyeknek ez ~ a szám előtt lesz.
  • Mega Arduino- Ezen a legerősebb Arduino táblán 15 8 bites PWM kimenet található. A 2–13 és a 44–46 csapokon vannak.
  • Arduino Duett: ebben az esetben 13 8 bites PWM kimenet van. A 2–13 érintkezőkön vannak, plusz két másik analóg kimenet, amelyet a DAC 12 bites felbontással diszkrétál.

Amikor az ilyen típusú PWM kimeneteknél 8 vagy 12 bites felbontásról stb. Beszél, akkor a rendelkezésre álló mozgástérre hivatkozik. Val vel 8 bitnek 256 szintje van amelyek között variálhat, és a 12 bit 4096 szintre emelkedik.

Vezérlés az időzítőkkel

Hardveres PWM vezérléshez, Arduino használja az időzítőket érte. Minden jelen lévő időzítő 2 vagy 3 PWM kimenetet képes kiszolgálni. Az egyes kimenetek összehasonlító regisztere kiegészíti ezt a rendszert, így amikor az idő eléri a regiszter értékét, a kimenet állapota vagy értéke megváltozik, hogy leállítsák ezeket a munkaciklusokat. Noha két kimenetet ugyanaz az időzítő vezérel, mindkettőnek különböző a munkaciklusa, bár ugyanaz a frekvenciájuk.

Az egyes PWM tűkhöz társított időzítők esetében ez változni fog az Arduino tábla típusától függően az ami neked van:

  • Arduino UNO, Mini és Nano:
    • Időzítő 0 - 5 és 6
    • Időzítő 1 - 9 és 10
    • Időzítő 2 - 3 és 11
  • Mega Arduino:
    • Időzítő 0 - 4 és 13
    • Időzítő 1 - 11 és 12
    • Időzítő 2 - 9 és 10
    • Időzítő3 - 2, 3 és 5
    • Időzítő4 - 6, 7 és 8
    • Időzítő5 - 44, 45 és 46

Az előre skálázott regiszter elosztja az időt egy egész számmal, az Időzítő pedig a többit a társított PWM kimenetek vezérléséhez. A nyilvántartási érték módosítása megváltoztathatja a gyakoriságot. A frekvencia Az időzítőtől és a táblától függően különböznek is:

  • Arduino UNO, Mini és Nano:
    • Timer0: lehetővé teszi 1, 8, 64, 256 és 1024 előskálázását. A frekvencia 62.5 Khz.
    • 1. időzítő: 1, 8, 64, 256 és 1024 előre beállított értékekkel. 31.25 Khz frekvenciával.
    • 2. időzítő: megegyezik az 1. időzítővel, csak annyi, hogy a korábbiak mellett 32 és 128 előskálázást is ad hozzá.
  • Mega Arduino:
    • Időzítő0, 1, 2: ugyanaz, mint a fentiekben.
    • 3., 4. és 5. időzítő: 31.25 Khz frekvenciával és 1, 8, 64, 256 és 1024 előskálával.

Inkompatibilitások és konfliktusok

Az időzítő a kimenetekhez társítva nemcsak arra a funkcióra vonatkozik, mások is használják. Ezért, ha egy másik funkció használja őket, akkor választania kell az egyik vagy a másik között, nem használhatja mindkettőt egyszerre. Például ezek a kompatibilitások, amelyek megtalálhatók a projektjeiben:

  • Szervo könyvtár: Szervómotorok használatakor az időzítők intenzíven vannak használatban, ami konfliktusokhoz vezethet. A Timer1-et kifejezetten használja az UNO, a Nano és a Mini számára, vagyis nem használhatja a 9. és 10. csapokat, miközben vázlatot használ az adott könyvtárral. A Megában ez a szervók számától függ ...
  • SPI: Ha az Arduino kártyán SPI kommunikációt használnak, akkor a 11. tűt használják a MOSI funkcióhoz. Ezért nem használható az a PWM tű.
  • tónus: ez a funkció a Timer2 funkciót használja. Tehát, ha használják, akkor használhatatlanná teszi a 3-as és 11-es (vagy a Mega esetében 9 és 10) csapokat.

Praktikus teszt Arduinóval

Arduino PWM vázlat LED-del

Ha szeretné megnézni, hogy a PWM hogyan működik az Arduino-n, akkor a legjobb, ha megteheti, hogy csatlakoztatja a voltmérő vagy multiméter (a feszültség mérésére szolgáló funkcióban) az Ön által választott PWM csap és az Arduino kártya földelt csapja vagy GND között. Ily módon a mérőeszköz képernyőjén láthatja, hogyan változik a feszültség egy digitális kimenettel ennek a PWM-trükknek köszönhetően.

Lecserélheti a voltmérőt / multimétert egy LED-re, hogy lássa, hogyan változik a fény intenzitása, egyenáramú motorral vagy bármely más kívánt elemmel. A diagramon leegyszerűsítettem a Fritzing with a LED-et több nélkül, de tudod, hogy ez egy multiméter tippjeit is képviselheti ...

Ha LED-et használ, ne feledje a katód és a GND ellenállását.

hogy a forráskódot Az Arduino tábla mikrovezérlő vezérléséhez, hogy minden működjön, be kell illesztenie ezt az Arduino IDE-be (ebben az esetben a PWM Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Azt tanácsolom, hogy játsszon az értékekkel, és lássa az eredmények a fény- vagy voltmérőn. A program 0 és 9 közötti értékeket képes fogadni, így láthatja, hogy minden változik. További információért tanácsot adok Önnek az arduino tanfolyam amit ingyenesen letölthetünk ...

Hozzászólás, hagyd a tiedet

Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: Miguel Ángel Gatón
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.

  1.   Jose dijo

    Szia, jó napot. Először is szeretnék köszönetet mondani a legfrissebb magyarázatnak szánt időért.
    Szeretnék neked lekérdezni. Az Arguino Mega proteus 8 emulátorán próbálom futtatni a kódot. Voltmérőt csatlakoztatok a 6-os tűhöz, a Proteus soros portra van csatlakoztatva, de nem tudom, hogyan és mit változtassak úgy, hogy különböző feszültségeket adjanak ki. Kisebb módosításokat kellett végrehajtanom a kódban, hogy összeállíthassam. Nagyon szépen köszönöm a segítséget