Naudodami skaitmeninius ir analoginius kaiščius, kuriuos galite naudoti savo „Arduino“ plokštėje, galite gauti arba siųsti elektrinius signalus, kad valdytumėte ar gautumėte duomenis iš savo elektroninių projektų. Be to, šio tipo plokštėse yra kitų labai įdomių signalų, kurie yra PWM, kuris gali imituoti analoginį signalą iš tikrųjų nebūdamas analogas. Tai yra, jie yra skaitmeniniai kaiščiai, kurie gali veikti panašiai (ne vienodai) kaip analoginis signalas.
Šie signalų tipai yra labai praktiški, kai norite ne tik naudoti skaitmeninius HIGH ir LOW signalus, ty 1 arba 0, ON ir OFF, bet norite eiti toliau ir apibūdinti kiek sudėtingesni signalai. Pavyzdžiui, galima moduliuoti a greitį Nuolatinės srovės variklis, arba šviesos šviesos intensyvumas, elektromagnetui ir kt.
Analoginė ir skaitmeninė sistema
Elektronines grandines galima suskirstyti į dvi dideles šeimas arba kategorijas: skaitmeninis ir analoginis. Kalbėdami apie skaitmeninę elektroniką, mes naudojame dydžius su atskiromis reikšmėmis, tai yra, dvejetainę sistemą, vaizduojamą žemos arba aukštos įtampos elektriniais signalais, kad suprastume tvarkomų bitų būseną. Kita vertus, kalbant apie analoginę grandinę, naudojami nuolatinių reikšmių dydžiai.
Skaitmeninėse sistemose galima rasti paeiliui kombinuoto ir nuoseklaus tipo. Tai yra, pirmieji yra tie, kuriuose sistemos išvestis priklauso tik nuo įėjimų būsenos. Kita vertus, nuosekliuose elementuose yra atminties elementai, o išvestis priklausys nuo dabartinės įėjimų būsenos ir ankstesnės išsaugotos būsenos.
Analogų atveju nėra šių dviejų didelių grupių ar variantų, nes čia jie yra nuolatiniai signalai, nuo kurių visada priklausys signalą dabartinę sistemą. Pavyzdžiui, garsiakalbyje jūsų teikiamas signalas priklauso nuo garso, kurį norite atkurti. Tas pats ir su mikrofonu, kuris generuos analoginį signalą, priklausomai nuo gaunamo garso. Be abejo, jūs taip pat matėte su daugeliu kitų jutiklių, kuriuos aprašėme šiame tinklaraštyje ir kurie veikia analoginiais signalais (todėl reikėjo sukurti formulę, kad vėliau „Arduino IDE“ eskizuose būtų galima apskaičiuoti ar sąlygoti reikšmes. ) ...
Šios vienų ir kitų savybės kai kuriuos turi savų privalumai ir trūkumai, kaip įprasta beveik viskuo. Pavyzdžiui, skaitmeninės yra pigesnės, greitesnės, lengviau kuriamos, informaciją galima lengviau saugoti, jos turi didesnį tikslumą, gali būti programuojamos, nėra tokios pažeidžiamos triukšmo poveikio ir kt. Tačiau taip pat tiesa, kad naudodami analogus galite valdyti sudėtingesnius signalus.
Pagal ejemplo, skaitmeninio tipo Hall efekto jutiklis gali nustatyti tik šalia esančio magnetinio lauko buvimą ar nebuvimą. Vietoj to, analoginis Hall efekto jutiklis gali tai padaryti ir taip pat nustatyti minėto magnetinio lauko tankį dėl analoginio signalo, kurį jis generuoja savo išėjime. Žinodami, kaip gerai interpretuoti tą aukštesnės ar žemesnės įtampos signalą, galite lengvai sužinoti tą dydį. Turite kitų gamtos dydžių pavyzdžių, kuriuos galite kiekybiškai išmatuoti analogine sistema, pvz., Temperatūrą, laiką, slėgį, atstumą, garsą ir kt.
Analoginis ir skaitmeninis signalas
Tai sakant, a analoginis signalas Tai bus įtampa arba elektros srovė, kuri kinta priklausomai nuo laiko ir nuolat. Jei grafikas, analoginis signalas būtų vieno dažnio sinusinė banga.
Kaip skaitmeninis signalasyra įtampa, kuri kinta laipsniškai laiko atžvilgiu. Tai yra, jei jis pavaizduotas grafike, tai bus žingsnio signalas, kuris nesikeičia nuolat, bet keičiasi žingsniais arba diskretiškais žingsniais.
Turėtumėte žinoti, kad yra grandinių, kurios pereina nuo analoginio signalo prie skaitmeninio arba atvirkščiai. Šie keitikliai jie yra žinomi kaip DAC (Digital-to-Analog Converter) ir ADC (Analog-to-Digital Converter). Jie yra labai paplitę daugelyje šiandien naudojamų įrenginių, tokių kaip televizorius, kompiuteriai ir kt. Su jais galite konvertuoti šios įrangos naudojamus skaitmeninius signalus į elektroninį lygį, kad galėtumėte dirbti su kitais periferiniais įrenginiais arba analogiškai veikiančiomis dalimis.
Pagal ejemplo, garsiakalbis arba mikrofonas su analoginiais signalais, veikiantis su garso plokšte, arba skaitmeninės grafikos plokštės, turinčios garsiąją RAMDAC mikroschemą analoginių monitorių prievadams ... „Arduino“ tipo keitikliai taip pat naudojami keliems projektams, kaip matysime. ..
Kas yra PWM?
Nors PWM (impulso pločio moduliacija) arba impulso pločio moduliacija, turi skaitmeninę bazę, jos signalo forma primena šiek tiek „kvadratinį“ analoginį signalą. Skaitmeninių impulsų pagalba jis gali keisti signalą, kad imituotų analoginę sistemą, kaip aš jau komentavau anksčiau. Tiesą sakant, jei pažvelgsite į pavadinimą, tai jau suteikia skaitmeninių impulsų pločio užuominas apie tai, ką jis daro.
Tai naudinga Arduino nes yra daugybė automatizmų ar elektroninių komponentų, kuriuos galite pridėti prie savo projektų negali pateikti tikro analoginio signalo, bet jie naudoja šį PWM veikti. Jie taip pat negali naudoti diskretizuoto analoginio signalo, t. Y. Pereinančio prie įtampos šuolių, kad būtų panašūs į skaitmeninį. Tai, ką jie gali padaryti, yra naudoti skaitmeninį skaitmeninį išėjimą -Vcc arba Vcc, kad sukurtų šį savitą signalą
Todėl PWM yra tam tikras „triukas“, su kuriuo „Arduino“ ir kitos sistemos gali sąveikauti su tokio tipo signalais, kurie jie nėra visiškai analogiški ir nėra įprasti skaitmeniniai. Kad tai būtų įmanoma, jie išlaiko skaitmeninį išvestį tam tikrą laiką arba išjungtą, priklausomai nuo susidomėjimo. Tai toli gražu ne tas skaitmeninis laikrodis ar dvejetainis kodo signalas, kurio impulsai yra vienodo pločio.
Savo projektuose su „Arduino“ galite patikrinti tokio tipo PWM signalus, kuriuose laikui bėgant palaikomas pastovus pulso paleidiklių dažnis, tačiau šių impulsų plotis yra įvairus. Tiesą sakant, tai vadinama „Duty Cycle“, kai signalas yra aukštas, palyginti su viso ciklo skaičiumi. Todėl darbo ciklas nurodomas%.
Atminkite, kad PWM jūs dirbate ne kaip analoginis signalas, tarp kelių įtampos verčių ir jis svyruoja tarp jų. PWM atveju tai yra kvadratinis skaitmeninio stiliaus signalas ir kurio didžiausia vertė yra Vcc. Pvz., Jei dirbate su 3 V maitinimo šaltiniu, galite pateikti 3 V arba 0 V impulsus, bet ne 1 V ar bet kokią kitą tarpinę vertę, kaip tai būtų realiame analoge. Tokiu atveju skiriasi impulso plotis, kurį esant didelei Vcc vertei galime išlaikyti 30%, arba 60%, kad suteiktų daugiau galios ir t. T.
Tačiau būkite atsargūs, nes jei įrenginys palaiko Vcc ribą ir viršijamas naudojant PWM, jis gali būti sugadintas. Taigi visada reikėtų atsižvelgti į gamintojų pateiktų duomenų lapų vertes. Be to, kai kuriuose įrenginiuose, pavyzdžiui, nuolatinės srovės varikliuose, relės, elektromagnetai ir kt., įtampos ištraukimas po darbo ciklo gali reikšti, kad indukcinės apkrovos gali pakenkti. Štai kodėl apsaugos laiku.
PWM „Arduino“
Dabar, kai žinote, kaip tai veikia, pažiūrėkime konkretų PWM atvejį „Arduino“ pasaulyje ...
PWM: „Arduino“ prisegimas
„Arduino“ lentose galite rasti kelis kaiščius, kurie įdiegia aparatinę PWM. Galite juos identifikuoti pačioje PCB, nes jie turi simbolis ~ (maža galva) kartu su kaiščių numeravimu. Tai taip pat galėtų padaryti programinė įranga, esanti „Arduino“ kode, tačiau tai perkrautų mikrovaldiklį - kažkas absurdiško, kai tai galima padaryti natūraliai ir aparatine įranga ...
- 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 kalbate apie 8 bitų ar 12 bitų ir pan. Skiriamąją gebą, tokio tipo PWM išėjimuose turite omenyje turimą manevro erdvę. Su 8 bitai turi 256 lygius Tarp kurių galite skirtis, o 12 bitų pakyla iki 4096 lygių.
Valdymas naudojant laikmačius
Aparatinės įrangos PWM valdymui - „Arduino“ naudos laikmačius už jį. Kiekvienas dabartinis laikmatis gali aptarnauti 2 arba 3 PWM išėjimus. Kiekvienos išvesties palyginamasis registras papildo šią sistemą taip, kad kai laikas pasiekia registro vertę, produkcijos būsena arba vertė yra keičiama, kad sustabdytų tuos darbo ciklus. Nors yra du išėjimai, kuriuos valdo tas pats laikmatis, abu gali turėti skirtingus darbo ciklus, nors jie ir turi tą patį dažnį.
Laikmačių, susietų su kiekvienu PWM kaiščiu, atveju jis skirsis priklausomai nuo „Arduino“ lentos tipo kad turite:
- 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 skalės registras padalins laiką iš sveiko skaičiaus, o laikmatis atliks visa kita, kad valdytų kiekvieną iš susijusių PWM išėjimų. Pakeitus registro vertę, gali pasikeisti dažnis. The dažnius Jie taip pat bus skirtingi, atsižvelgiant į laikmatį ir plokštelę:
- 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
Laikmatis susieta su išvestimis, skirta ne tik tai funkcijai, taip pat naudoja kiti. Todėl, jei juos naudoja kita funkcija, turite pasirinkti vieną ar kitą, negalite naudoti abiejų tuo pačiu metu. Pavyzdžiui, tai yra keletas nesuderinamumų, kuriuos galite rasti 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.
- Tonas: ši funkcija veikia „Timer2“. Taigi, jei jis naudojamas, 3 ir 11 (arba „Megai“ 9 ir 10) kaiščius darote nenaudingus.
Praktinis testas su „Arduino“
Jei norite vietoje pamatyti, kaip PWM veikia „Arduino“, geriausia, ką galite padaryti, tai prijungti voltmetras arba multimetras (pagal įtampos matavimo funkciją) tarp pasirinkto naudoti PWM kaiščio ir „Arduino“ plokštės įžeminimo kaiščio arba GND. Tokiu būdu matavimo prietaiso ekrane galėsite pamatyti, kaip keičiasi įtampa naudojant išėjimą, kuris yra skaitmeninis šio PWM triuko dėka.
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 } }
Sveika diena. Pirmiausia noriu padėkoti už laiką, skirtą naujausiam paaiškinimui.
Norėčiau pateikti jums užklausą. Bandau paleisti kodą „proteus 8“ emuliatoriuje, skirtame „Arguino Mega“. Prijungiu voltmetrą prie 6 kaiščio, „Proteus“ yra prijungtas prie nuoseklaus prievado, bet nežinau, kaip ir ką keisti, kad būtų išvestos skirtingos įtampos. Turėjau šiek tiek pakoreguoti kodą, kad jis būtų kompiliuojamas. Labai ačiū už Jūsų pagalbą