Arduino kezdőknek 8 - A/D átalakítók hagyományos és PWM digitális kimenetekkel
Szilágyi Sándor Zoltán Villamosmérnök, mérnök-informatikus
A cikket megírtam: 2022. 08. 01-én
A Rádiótechnikában megjelent: 2022. szeptember
Ez a blog oldal tehát az eredeti, saját tulajdonomban levő dokumentum, és nem a nyomtatásban megjelent másolata. A cikket én írtam, én küldtem be, és csak azután jelent meg nyomtatott formában is. A nyomtatásban megjelent cikkeimre szerződést nem kötöttek velem, és anyagi juttatást se kaptam soha érte. Mivel a magazin már nem kapható, ezért a megjelent 13 cikkemet itt folytatnám, mivel Magyarországon jelenleg nincs hobbielektronikával foglalkozó magazin.
8.1 A/D átalakító hagyományos digitális kimenettel
A 7-edik cikkben megismertük az analóg bemenetek alapjait. Most ezt bővítjük tovább néhány modellen.
20. Program: A/D átalakítás, LED ki-be kapcsolgatás potenciométerrel
A 19-ik feladatot bővítjük tovább. Az eddigi modellekhez hasonlóan, most is egy led lesz a kiviteli periféria.
A digitális I/O-k több részre (Arduino UNO) oszthatók. Az első cikkben írtam, hogy van 2 db interrupt és 6 db PWM kimenet is, melyek sima digitális kimenetként is használhatók. Ebben a példában egy általános digitális kimenetet használunk, legyen ez a 7-es (33. ábra). A led bekötése megegyezik a korábban ismertetettekkel, a kapcsolási rajzon a GND pontot közösítettem.
A 19-es példával megegyezik az analóg rész működése. Mivel ott mindent részletesen leírtam, azért itt azt nem részletezem.
33. ábra
A program a 34-edik ábrán látható.
Négy változót deklarálunk, az előző példából megismert A0-t, ami byte típusú lesz, azaz 8 biten tárolja a változó értékét. Itt még nem derül ki, hogy ez a pin digitális vagy analóg lesz-e. A ledet a 7-es digitális I/O-ra kötjük, azaz egy olyan digitális kimenetre, ami nem PWM jellegű. Az előző példához hasonlóan lesz még egy int és egy float típusú változónk is. A „value” mindenképpen int legyen, mert byte adattípus esetén nem fér bele a leolvasott érték, és nem fog működni a program.
A setup részben a ledet digitális kimenetként deklaráljuk. A soros monitort ellenőrzésképpen felvesszük.
A főprogramban beállítjuk a 0-ás pint analógra az analogRead() függvénnyel, így tehát meg van különböztetve az analóg bemenet és a digitális kimenet. Ezenkívül ez az eljárás betölti az A0 értékét az int típusú „value” változóba. Az előző feladathoz hasonlóan ezt az értéket megszorozza az 5,0/1023,0 hányadossal, majd betölti a float típusú „voltage” változóba. Ezután jön a soros monitor meghívása, mellyel a fenti változó aktuális értékét írja ki, valós időben. Az előző feladattal összehasonlítva, még két új sor következik. A map() függvény újra képez egy számot. A magas értéket magasra, az alacsony értéket alacsonyra, a köztest pedig köztesre. Egész számokat használ. A függvény alkalmas negatív számok kezelésére, számtartományok megfordítására is.
Szerkezete: map(value, fromLow, fromHigh, toLow, toHigh);, ami a 34-edik ábrán így néz ki: „value=map(value, 0, 1023, 0, 255);”. Öt paramétere van:
- value: ez a feltérképezendő szám.
- fromLow: a szám aktuális tartományának alsó határa.
- fromHigh: a szám aktuális tartományának felső határa.
- toLow: a céltartomány alsó határa.
- toHigh: a céltartomány felső határa.
A mi esetünkben az aktuális tartomány (fromLow) alsó határa 0, (fromHigh) felső határa 1023. Miért 0-1023? Az analogRead() ezen tartományon belüli értéket ad vissza. Teljesen letekert potméternél 0-t, míg teljesen feltekert potméternél 1023-at. A céltartomány (toLow) alsó határa 0, míg a (toHigh) felső határa 255. Azért 0-255, mert erre a cél értéktartományra képezi le. Végül az analogWrite()-al kiküldjük a „value” változó értékét a 7-es lábon levő led-re. Azt várnánk, hogy folyamatosan változzon valami, pl a fényereje, de nem ez fog történni. Mivel a 7-es egy sima digitális láb, ezért a potenciométer 0-tól fél fordulatig eső tartományában nem fog világítani a led, míg a fél fordulat után a maximális állásig teljes fényerővel fog világítani. A soros monitoron lekövetve az eseményeket azt tapasztaljuk, hogy 2.50 V-nál még nem világít, viszont 2.51 V-nál már világít.
34. ábra
8.2 A/D átalakító PWM digitális kimenettel
21. Program: A/D átalakítás, LED fényerő változtatása potenciométerrel
Az előző feladathoz képest hardveresen egy apró változtatás van (35. ábra). A led a 7-es sima digitális kimenet helyett a 11-es PWM jellegű digitális kimenetre lett kötve. A PWM jelentése: pulse-width modulation, azaz Impulzusszélesség moduláció. Ez egy olyan vezérlés, ahol állandó periódusidő mellett a jel bekapcsolási idejét, azaz az impulzus szélességét változtatjuk. Minél nagyobb az impulzusszélesség, annál nagyobb az amplitúdó változása. A board AD átalakítója az A0 bemenetről beolvasott értéket egy 0-1023 közötti számmá alakítja át, majd az előző cikkben említettek alapján feldolgozza, adott szélességű impulzusra alakítja. A potenciométer adott állásától függően tehát adott szélességű impulzus jelenik meg a 11-es kimeneten. Minél szélesebbek az impulzusok, annál fényesebben világít a led, illetve minél keskenyebbek, annál halványabban világít.
Két apró változtatás van a programban (36. ábra) is, egyik a led deklarációjánál (7-ről 11-re átírva), a másik egy késleltetés, ami a főprogram utolsó sorába lett írva: delay(1);. Ennek az értéke bármekkora lehet. Ha a zárójelek közé 1000-et írunk be, akkor 1 másodpercenként nagy lépcsőkben láthatjuk a led fényerejének megváltozását. 100-esetén tizedmásodpercenként láthatjuk a led aktuális értékét a potméter folyamatos forgatása közben, azaz elég látványosan. Így egy lépcsőgenerátor modellt is létrehoztunk. Ha a delay() zárójelébe pl. 1-10-ig írunk számokat, akkor a század- és ezredmásodperces lépcsőket a szem már nem képes lekövetni, folyamatosnak fogjuk látni a fényerő változtatását.
35. ábra
36. ábra
22. Program: A/D átalakítás, LED villogtatása (logaritmikus) potenciométerrel
A feladathoz szükséges kapcsolás megegyezik az előző feladatéval.
A program az előzőhöz hasonló: bekerült a már korábban megismert villogó (1-ledes astabil multivibrátor) program, illetve kikerült belőle a map() függvény. A felvillanások közti késleltetési érték a „value” nevű változó valós időben tárolt értéke, melyet az analogRead() függvénnyel töltöttünk előzőleg bele. A programot elindítva, és a soros monitort is bekapcsolva azt tapasztaljuk, hogy a 0.00V-hoz és a +5.00V-hoz tartozó villogás más, mint amire eredetileg számítottunk. A fényerő változtatásánál a 0V-nál nem világított a led, az 5V-os értéknél viszont teljes fényerővel, addig itt 0V-nál nem látható a fénye (sötétben nagyon gyengén látható), mivel annyira rövidek és gyorsak az impulzusok, 0.01V-nál kb majdnem folytonosan világít, 0.20V-tól a villogás érzékelhetővé válik. Feltekerve 5.00V-ra, kb 1 másodperces lesz a H és az L állapot. A led minden felvillanásának kezdetén (H állapot felfutó élénél) a panelen levő TX led is felvillan egy impulzusra. A program a 37-edik ábrán, a soros monitor egy részlete a 38-ik ábrán látható.
37. ábra
38. ábra
Felhasznált irodalom:
https://www.arduino.cc/reference/en/language/functions/math/map/ 2022. 07. 03-i állapot.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/AnalogInput 2022. 07. 03-i állapot.
A cikket megírtam: 2022. 08. 01-én
A Rádiótechnikában megjelent: 2022. szeptember