Prisijungę
We have 4 guests and no members online
Analoginiai signalai ir komanda analogWrite()
Jūs jau žinote kaip aprašomi skaitmeniniai signalai. Tai labai patogu jeigu norite reguliuoti LED‘ų mirksėjimą, kontroliuoti reles ar sukti variklius tam tikru pastoviu greičiu. Bet ką daryti, jeigu jums reikia kitokios įtampos nei 0V ar 5V? Deja, nieko nepakeisit, nebent turite konverterį verčiantį skaitmeninį signalą į analoginį (impulsinį).
Visgi jūs galite pasiekti gerą analoginio signalo generavimą naudodami PWM (pulse-width modulation) pin‘us. Šie pin‘ai naudoja analogWrite() komandą, kad generuoti PWM signalus, kurie emuliuos gryną analoginį signalą. Paprastai tai yra 3, 5, 6, 9, 10 ir 11 pin‘ai. Jeigu sumažinsite įtampą varžos pagalba, tai LED‘as švies silpniau, nes tekės silpnesnė srovė. analogWrite() komanda naudoja du argumentus: pin‘o kurį valdysite numerį ir skaitinę reikšmę.
PWM išėjimo skaitinė reikšmė yra 8 bitų. Kitaip tariant mes galima nurodyti dydžius nuo 0 iki 28-1 arba nuo 0 iki 255. Panagrinėkime žemiau parašytą kodą, kuriame panaudosime for ciklą.
Ką gi daro LED‘as kai veikia šis kodas? Mes matome, kad ledas palengva įsižiebia ir vėl palengva užgęsta. Kadangi daugiau veiksmų mes neparašėme, tai šis veiksmas bus kartojamas nuolat. Šiame kode naudojame veiksmų sutrumpinimus. i++ yra tas pats kas i = i + 1, o i-- yra tas pats kas i = i - 1. Pirmasis ciklas palengva įžiebia LED‘ą, o antrasis palengva užgesina.
PWM kontroliavimas gali būti panaudotas daugeliu atvejų, kad galėtume emuliuoti gryną analoginę kontrolę, bet tai negali visada būti panaudota kai mums reikia tikro analoginio signalo. Pavyzdžiui, PWM labai patogu naudoti tiesioginės srovės (direct current – DC) motorų greičiams reguliuoti, bet jis nepadės garsiakalbių valdyme, nebent jie bus maitinami išorinės grandinės. Kaip gi veikia PWM?
PWM moduliuoja kvadratinių bangų ciklą (tai signalas kuris įsijungia ir išsijungia). Šio ciklo darbas apibrėžia kiek laiko banga bus viršutinėje padėtyje ir kiek žemutinėje. Komanda analogWrite() nustato koks kvadratinių bangų ciklas privalo būti:
• Jeigu rašome 0 su analogWrite() komanda, tai dažnis nurodomas 0 reikia būsena visada LOW.
• Jeigu rašome 255, tai reiškia kad dažnis 100 procentų ir būsena visada HIGH.
• Parašius 127, gauname 50 procentų dažnį, reiškia pusę laiko bus HIGH, pusę LOW.
Grafikuose matote 25 procentų dažnio ciklą. Tai reiškia, kad 25 procentus jis bus HIGH, o likusius 75 procentus LOW. Šios bangos dažnis Arduino atveju yra apie 490 Hz. Kitaip tariant signalas keisis tarp HIGH (5V) ir LOW (0V) apie 490 kartų per sekundę.
Pasirodo mes įtampos nekeičiame, bet kodėl LED‘as palengva šviečia vis silpniau? Iš tikro tai akių apgaulė. Jeigu LED‘as kiekvieną milisekundę įsijungia ir išsijungia (kai ciklo darbas yra 50 procentų) mums atrodo, kad jis dirba apytiksliai puse ryškumo, nes mirksi tankiau nei mūsų akis spėja fiksuoti. Mūsų smegenys padaro vidurkį iš gautų signalų ir mums atrodo, kad jis dirba pusės ryškumu.
Papildomos užduotys:
1. Padarykite taip, kad vienas po kito palengva įsižiebtų ir užgestų 9,10 ir 11 LED‘ai. Veiksmas kartotųsi.
2. Padarykite taip, kad palengva įsižiebtų 9 LED‘as, tada pradėtų įsižiebti 10, o 9 tuo pačiu metu užgestų. Taip šviesti turi 9, 10 ir 11 LED'ai. Viskas turi veikti su analogWrite() komandomis.
3. Ką reiktų daryti, kad kaip pirmoje užduotyje veiktų visi 6 LED'ai? Padaryktie taip.
4. Sukurkite daugiau įvairesnių lėto įsižiebimo ciklų.