PWM: mėgdžiokite analoginius kaiščius su savo „Arduino“ lenta

PWM signalai

Naudodami skaitmeninius ir analoginius kontaktus savo „Arduino“ plokštėje, galite siųsti ir gauti elektrinius signalus, kad valdytumėte arba gautumėte duomenis iš savo elektroninių projektų. Be to, šiose plokštėse yra ir kitų labai įdomių signalų, tokių kaip PWM signalai, kurie gali imituoti analoginį signalą, nors iš tikrųjų nėra analoginiai. Kitaip tariant, tai yra skaitmeniniai kontaktai, kurie gali elgtis panašiai (bet ne identiškai) kaip analoginis signalas.

Šio tipo signalai yra labai praktiški, kai norite naudoti ne tik skaitmeninius AUKŠTO ir ŽEMO signalus (1 arba 0, ĮJUNGTA ir IŠJUNGTA), bet ir aprašyti sudėtingesnius signalus. Pavyzdžiui, galite moduliuoti nuolatinės srovės variklio greitį , šviesos ryškumą arba valdyti solenoidą ir pan.

Analoginė ir skaitmeninė sistema

Analoginis ir skaitmeninis signalas

Elektronines grandines galima suskirstyti į dvi pagrindines šeimas arba kategorijas: skaitmenines ir analogines . Skaitmeninėje elektronikoje apdorojamų bitų būsenai interpretuoti naudojamos diskrečiosios vertės, t. y. dvejetainė sistema, pavaizduota žemos arba aukštos įtampos elektriniais signalais. Priešingai, analoginėse grandinėse naudojamos tolydžios vertės.

Skaitmeninėse sistemose galime rasti kombinacines ir nuosekliąsias sistemas . Kombinacinės sistemos yra tokios, kurių sistemos išvestis priklauso tik nuo įvesties būsenos. Kita vertus, nuosekliosios sistemos apima atminties elementus, o jų išvestis priklauso tiek nuo dabartinės įvesties būsenos, tiek nuo anksčiau išsaugotos būsenos.

Analoginių signalų atveju šios dvi pagrindinės grupės arba variantai neegzistuoja, nes tai yra nuolatiniai signalai, kurie visada priklauso nuo dabartinio sistemos signalo . Pavyzdžiui, garsiakalbyje jam tiekiamas signalas priklausys nuo atkuriamo garso. Tas pats pasakytina ir apie mikrofoną, kuris generuos analoginį signalą pagal gaunamą garsą. Tikriausiai tai matėte ir su daugeliu kitų šiame tinklaraštyje aprašytų jutiklių, kurie veikia su analoginiais signalais (todėl reikėjo sukurti formulę, kad vertes būtų galima apskaičiuoti arba koreguoti „Arduino IDE“ eskizuose)...

Šios kiekvieno tipo savybės suteikia jiems privalumų ir trūkumų , kaip dažniausiai būna beveik viskam. Pavyzdžiui, skaitmeninės sistemos paprastai yra pigesnės, greitesnės, lengviau kuriamos, leidžia lengviau saugoti informaciją, pasižymi didesniu tikslumu, yra programuojamos ir mažiau pažeidžiamos triukšmo poveikio ir pan. Tačiau taip pat tiesa, kad analoginės sistemos gali apdoroti sudėtingesnius signalus.

Pavyzdžiui , skaitmeninis Holo efekto jutiklis gali aptikti tik netoliese esančio magnetinio lauko buvimą arba nebuvimą. Tuo tarpu analoginis Holo efekto jutiklis gali tai padaryti ir nustatyti to magnetinio lauko tankį pagal analoginį signalą, kurį jis generuoja savo išėjime. Teisingai interpretuojant šį aukštesnės arba žemesnės įtampos signalą, galima lengvai nustatyti jo dydį. Kitų pavyzdžių galima rasti daugybėje natūralių dydžių, kuriuos galima kiekybiškai išmatuoti naudojant analoginę sistemą, pavyzdžiui, temperatūrą, laiką, slėgį, atstumą, garsą ir kt.

Analoginis ir skaitmeninis signalas

Kitaip tariant, analoginis signalas yra elektros įtampa arba srovė, kuri nuolat kinta laikui bėgant. Grafike analoginis signalas būtų vieno dažnio sinusinė banga.

Kalbant apie skaitmeninį signalą , tai yra įtampa, kuri kinta laipsniškai laiko atžvilgiu. Tai yra, jei ji pavaizduota grafike, tai bus laiptuotas signalas, kuris nesikeičia nuolat, o keičiasi žingsniškai arba diskrečiais padidėjimais.

Turėtumėte žinoti, kad yra grandinių, skirtų analoginiam signalui konvertuoti į skaitmeninį arba atvirkščiai. Šie keitikliai yra žinomi kaip DAC (skaitmeniniai-analoginiai keitikliai) ir ADC (analoginiai-skaitmeniniai keitikliai). Jie yra labai paplitę daugelyje šiandien naudojamų prietaisų, tokių kaip televizoriai, kompiuteriai ir kt. Jie leidžia šių įrenginių naudojamus skaitmeninius signalus konvertuoti elektroniniu būdu, kad jie galėtų veikti su kitais periferiniais įrenginiais ar komponentais, veikiančiais analoginiu režimu.

Pavyzdžiui , garsiakalbis arba mikrofonas su analoginiais signalais, veikiantis su garso plokšte, arba skaitmeninės grafikos plokštės su garsiąja RAMDAC mikroschema analoginiams monitorių prievadams... „Arduino“ taip pat naudoja tokio tipo keitiklius keliems projektams, kaip matysime...

Kas yra PWM?

grafinis darbo ciklas

Nors PWM (impulsų pločio moduliacija) yra skaitmeninio pagrindo, jos signalo forma primena šiek tiek „kvadratinį“ analoginį signalą. Kaip jau minėjau anksčiau, ji leidžia keisti signalą naudojant skaitmeninius impulsus, kad būtų imituojama analoginė sistema. Tiesą sakant, pats pavadinimas, per skaitmeninių impulsų plotį, suteikia užuominą apie tai, ką jis daro.

Tai naudinga „Arduino“ , nes daugelis automatizavimo įrenginių ar elektroninių komponentų, kuriuos galite pridėti prie savo projektų, negali teikti tikro analoginio signalo ; vietoj to, jie veikia naudodami PWM. Jie taip pat negali naudoti diskretizuoto analoginio signalo, t. y. tokio, kuris keičia įtampos lygius, kad primintų skaitmeninį signalą. Jie gali naudoti skaitmeninę išvestį – Vcc arba skaitmeninį Vcc – šiam unikaliam signalui generuoti.

Todėl PWM yra savotiškas „triukas“, leidžiantis „Arduino“ ir kitoms sistemoms sąveikauti su signalais, kurie nėra nei visiškai analoginiai, nei įprastai skaitmeniniai . Norėdami tai pasiekti, jos palaiko skaitmeninį išėjimą aktyvų tam tikrą laiką arba išjungtą, priklausomai nuo poreikio bet kuriuo momentu. Tai skiriasi nuo standartinio skaitmeninio laikrodžio signalo arba dvejetainio kodo, kurio impulsai yra vienodo pločio.

Savo „Arduino“ projektuose galite stebėti tokio tipo PWM signalą, kai laikui bėgant išlaikomas pastovus impulsų sužadinimo dažnis, tačiau impulsų plotis kinta . Iš tiesų, laikas, kurį signalas išlieka aukštas, palyginti su bendru ciklu, vadinamas darbo ciklu. Todėl darbo ciklas išreiškiamas procentais.

Atminkite, kad PWM neveikia kaip analoginis signalas, t. y. svyruoja tarp kelių įtampos verčių. PWM atveju tai yra stačiakampė banga, panaši į skaitmeninį signalą, kurios maksimali vertė yra Vcc . Pavyzdžiui, jei dirbate su 3 V maitinimo šaltiniu, galite generuoti 3 V arba 0 V impulsus, bet ne 1 V ar bet kurios kitos tarpinės vertės impulsus, kaip tai darytumėte su tikru analoginiu signalu. Tokiu atveju skiriasi impulso plotis, kurį esant didelei Vcc vertei galite palaikyti 30 %, o esant didelei Vcc vertei – 60 %, kad padidintumėte galią, ir taip toliau.

Vis dėlto rekomenduojama būti atsargiems, nes viršijus įrenginio Vcc ribą naudojant PWM, galima sugadinti įrenginį. Todėl visada būtina laikytis gamintojo duomenų lapo specifikacijų. Be to, kai kuriuose įrenginiuose, tokiuose kaip nuolatinės srovės varikliai, relės , elektromagnetai ir kt., įtampos kritimas po darbo ciklo gali sukelti žalą dėl indukcinių apkrovų. Dėl šios priežasties reikia įdiegti tinkamas apsaugos priemones.

PWM „Arduino“

„Arduino I2C“ autobusas

Dabar, kai žinote, kaip tai veikia, pažiūrėkime konkretų PWM atvejį „Arduino“ pasaulyje ...

PWM: „Arduino“ prisegimas

„Arduino“ plokštėse yra keli kontaktai, kurie įgyvendina aparatinės įrangos PWM. Juos galite atpažinti pačioje spausdintinėje plokštėje pagal tildės (~) simbolį kartu su kontakto numeriu. Tai taip pat galima padaryti programiškai, naudojant „Arduino“ kodą, tačiau tai perkrautų mikrovaldiklį, o tai absurdiška, kai tai galima padaryti aparatinėje įrangoje.

  • Arduino UNO, „Mini“ ir „Nano“- 6, 8, 3, 5, 6 ir 9 kaiščiuose turite 10 11 bitų PWM išvestis, kurios bus ~ tiesiai prieš skaičių.
  • „Arduino Mega“- Šioje galingiausioje „Arduino“ plokštėje turite 15 8 bitų PWM išėjimų. Jie yra ant kaiščių nuo 2 iki 13 ir nuo 44 iki 46.
  • „Arduino Due“: šiuo atveju yra 13 8 bitų PWM išėjimų. Jie yra ant kaiščių nuo 2 iki 13, taip pat du kiti analoginiai išėjimai, kuriuos DAC išskyrė 12 bitų raiška.

Kai kalbame apie 8 bitų arba 12 bitų skiriamąją gebą ir pan., tokio tipo PWM išvestyje turime omenyje reguliavimo diapazoną. Su 8 bitais galite reguliuoti 256 lygius, o su 12 bitų – 4096 lygius.

Valdymas naudojant laikmačius

Aparatinės įrangos PWM valdymui „Arduino“ naudoja laikmačius . Kiekvienas laikmatis gali aptarnauti du arba tris PWM išėjimus. Kiekvieno išėjimo palyginimo registras užbaigia šią sistemą taip, kad, kai laikas pasiekia registre esančią reikšmę, išėjimo būsena arba reikšmė pakeičiama, kad būtų sustabdyti tie darbo ciklai. Net jei du išėjimus valdo tas pats laikmatis, jie gali turėti skirtingus darbo ciklus, nors ir naudoja tą patį dažnį.

Su kiekvienu PWM kaiščiu susietų laikmačių atveju tai skirsis priklausomai nuo jūsų turimos Arduino plokštės tipo :

  • Arduino UNO, „Mini“ ir „Nano“:
    • Laikmatis 0 - 5 ir 6
    • Laikmatis 1 - 9 ir 10
    • Laikmatis 2 - 3 ir 11
  • „Arduino Mega“:
    • Laikmatis 0 - 4 ir 13
    • Laikmatis 1 - 11 ir 12
    • Laikmatis 2 - 9 ir 10
    • 3 laikmatis - 2, 3 ir 5
    • 4 laikmatis - 6, 7 ir 8
    • 5 laikmatis - 44, 45 ir 46

Išankstinio skalavimo registras laiką padalija iš sveikojo skaičiaus, o laikmatis tvarko likusią dalį, kad valdytų kiekvieną susijusį PWM išėjimą. Keičiant registro reikšmę, keičiamas dažnis. Dažniai taip pat skirsis priklausomai nuo laikmačio ir plokštės.

  • Arduino UNO, „Mini“ ir „Nano“:
    • „Timer0“: leidžia iš anksto skaluoti 1, 8, 64, 256 ir 1024. Dažnis yra 62.5 Khz.
    • Laikmatis1: su išankstiniais 1, 8, 64, 256 ir 1024 nustatymais. 31.25 Khz dažniu.
    • „Timer2“: lygus „Timer1“, tik be ankstesnių, jis prideda 32 ir 128 išankstinį skalę.
  • „Arduino Mega“:
    • Laikmatis0, 1, 2: tas pats, kas aukščiau.
    • 3, 4 ir 5 laikmatis: 31.25 Khz dažniu ir 1, 8, 64, 256 ir 1024 skalėmis.

Nesuderinamumai ir konfliktai

Su išėjimais susietas laikmatis skirtas ne tik tai funkcijai ; jį naudoja ir kitos. Todėl, jei jį naudoja kita funkcija, turėsite pasirinkti vieną arba kitą; negalite naudoti abiejų vienu metu. Pavyzdžiui, čia pateikiami keli nesuderinamumai, su kuriais galite susidurti savo projektuose:

  • Servo biblioteka: Kai naudojate servo variklius, laikmačiai naudojami intensyviai, o tai gali sukelti konfliktus. Konkrečiai naudokite „Timer1“, skirtą UNO, „Nano“ ir „Mini“, tai yra, jūs negalite naudoti 9 ir 10 kaiščių, kai naudojate eskizą su ta biblioteka. „Megoje“ tai priklausys nuo servo skaičiaus ...
  • SPI: Jei „Arduino“ plokštėje naudojamas SPI ryšys, MOSI funkcijai naudojamas 11 kaištis. Štai kodėl tas PWM kaištis negali būti naudojamas.
  • Tonikai: ši funkcija veikia „Timer2“. Taigi, jei jis naudojamas, 3 ir 11 (arba „Megai“ 9 ir 10) kaiščius darote nenaudingus.

Praktinis testas su „Arduino“

„Arduino PWM“ schema su LED

Jei norite savo akimis pamatyti, kaip PWM veikia „Arduino“ sistemoje, geriausia tai padaryti – prijungti voltmetro arba multimetro (nustatyto matuoti įtampą) zondus tarp pasirinkto PWM kontakto ir įžeminimo (GND) kontakto „Arduino“ plokštėje. Tokiu būdu galėsite matyti įtampos pokyčius matavimo įrenginio ekrane, o dėl šios PWM technikos išvestis bus skaitmeninė.

Galite pakeisti voltmetrą / multimetrą šviesos diodu, kad pamatytumėte, kaip skiriasi šviesos intensyvumas, su nuolatinės srovės varikliu ar kitu norimu elementu. Aš jį supaprastinau diagramoje su „Fritzing with LED“ be daugiau, bet žinau, kad jis taip pat gali atspindėti multimetro patarimus ...

Jei naudojate šviesos diodą, prisiminkite atsparumą katode ir GND.

į šaltinio kodas Norėdami valdyti „Arduino“ plokštės mikrovaldiklį, kad viskas veiktų, turėtumėte tai įterpti į „Arduino IDE“ (šiuo atveju aš naudojau PWM 6 kaištį 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  
   } 
} 
Aš patariu jums žaisti su vertybėmis ir pamatyti šviesos ar voltmetro rezultatai. Programa gali gauti reikšmes nuo 0 iki 9, todėl galite pamatyti, kaip viskas skiriasi. Norėdami gauti daugiau informacijos, patariu jums arduino kursas kurį turime nemokamai atsisiųsti ...

Pridėti kaip pageidaujamą šaltinį „Google“ sistemoje