5 minute read
razvojna pločica za Arduino Uno (3)
U ovom ćemo nastavku naučiti kako programski možemo utjecati na brzinu vrtnje istosmjernog (DC) elektromotora. Programe ćemo napisati u programskim jezicima Bascom-AVR i Arduino IDE, a zatim pomoću razvojnog sustava Shield-B provjeriti radi li sve kako smo zamislili.
Elektromotor možemo usporiti ako mu napon napajanja ili radnu struju smanjimo ispod nominalnih vrijednosti. Postoji i treći način, koji smo ilustrirali crtežom na Slici 6.
Advertisement
Ovdje kroz elektromotor šaljemo strujne impulse stalne frekvencije i veće ili manje širine; što su ti impulsi širi, srednja struja kroz motor (prikazana je crvenim stupcem s lijeve strane svakog dijagrama) bit će veća pa će se i motor brže vrtjeti. Gornji i donji dijagram prikazuju granične vrijednosti u kojima nema impulsa pa će motor ili stajati (gore) ili se vrtjeti punom brzinom jer je stalno spojen na napon napajanja (dolje). Postupak se naziva pulsno-širinska modulacija (PWM), a motor će se kontinuirano i bez trzaja vrtjeti samo ako je frekvencija impulsa dovoljno visoka, a opet ne previsoka (kod malih elektromotora, optimalna frekvencija je 50-200 Hz).
Mikroupravljač na pločici Arduino Uno, ATmega328P, ima ugrađene sklopove koji mogu proizvoditi nizove impulsa poput onih sa Slike 6. Kako radi jedan od tih sklopova, Timer0, prikazano je na Slici 7. Timer0 broji impulse koje dovodimo na njegov ulaz; u ovom slučaju to će biti impulsi frekvencije 62,5 kHz. Ako ga konfiguriramo da radi u modu PWM, brojat će impulse od 0 do 255 i zatim unatrag, od 255 do 0. Trenutna vrijednost brojača uspoređuje se s brojem upisanim u registre OCR0A i OCR0B:
Kada se tijekom brojanja prema gore izjednači vrijednost brojača s brojem u nekom od usporednih registara, mikroupravljač će postaviti pridruženi pin u stanje “0”.
Kada se tijekom brojanja prema dolje izjednači vrijednost brojača s brojem u nekom od usporednih registara, mikroupravljač će postaviti pridruženi pin u stanje “1”.
Tako upisom odgovarajućeg broja u neki od usporednih registara određujemo širinu impulsa koje Timer0 generira na pridruženim pinovima OC0A (~6 na pločici Arduino Uno) i OC0B (~5 na pločici Arduino Uno). Širina impulsa bit će to veća, što je veća vrijednost upisana u usporedni registar, a frekvencija impulsa je određena ulaznom frekvencijom (u našem slučaju, 62,5 kHz) i procesom brojanja (256 prema gore + 256 prema dolje = 512): f = 62.500 : 512 ≈ 122 Hz
Napomena: Timer0 je vrlo moćan sklop i može raditi na više različitih načina; generiranje širinski moduliranih impulsa samo je jedan od njih. Način rada tajmera određujemo tijekom postupka konfiguracije, koja će u programu Bascom-AVR biti jasno vidljiva, dok je u Arduino IDE postupak “skriven” iza naredbe kojom “opisujemo” što želimo postići. Važno je uočiti da se, nakon što tajmer konfiguriramo, više njime ne trebamo baviti; on će proizvoditi zadani niz impulsa dokle god ne promijenimo vrijednost u nekom od usporednih registara, dok mu ne promijenimo način rada ili dok ga ne zaustavimo. Shema spoja za upravljanje brzinom vrtnje istosmjernog elektromotora prikazana je na Slici 8. Elektromotor E spojen je između priključaka M1 i -M, pa ga uključujemo spajanjem + izvoda napona napajanja na M1. Ovo odrađuju elektroničke sklopke unutar integriranog kruga L272M, upravljane impulsima koje generira mikroupravljač na svom pinu OC0B (~5). Koristit ćemo još i potenciometar RV1 s pločice Shield-B.
2. programski zadatak: Napisati program koji će upravljati brzinom elektromotora E u spoju prikazanom na Slici 8. Program treba očitavati napon na klizaču potenciometra RV1 i, proporcionalno tom naponu, generirati odgovarajući niz impulsa na OC0B (~5) pinu mikroupravljača u rasponu prikazanom na Slici 6. Rješenje Bascom-AVR-a (program Shield-B_2. bas)
Nakon uvodnih konfiguracijskih naredbi, koje se odnose na korišteni mikroupravljač i uvjete u kojima on radi, konfigurirat ćemo i analogno-digitalni pretvarač i pripremiti ga za očitanje napona na klizaču potenciometra RV1:
Config ADC = Single , Prescaler = Auto , Reference = Avcc
U naredbi za konfiguraciju uočite stavku Reference = Avcc, kojom smo odredili da se ulazni napon uspoređuje s naponom napajanja. To je primjereno ulaznom naponu, jer napon na klizaču potenciometra također poprima vrijednosti od 0 do 5 V. Ostale postavke određuju način rada A-D pretvarača i u većini slučajeva odgovarat će nam u obliku u kojem su navedene. Dimenzionirat ćemo i varijablu Rv1, u koju ćemo pospremati očitanja napona klizača potenciometra RV1:
Dim Rv1 As Word
Varijabla je tipa Word, kako bismo u nju mogli pohraniti 10-bitni rezultat A-D pretvorbe. Pin PC0, koji koristimo kao ulaz u A-D pretvarač, ne moramo posebno konfigurirati, kao ni PD5 ‒ čim konfiguriramo Timer0, pin PD5 će izgubiti svoju funkciju digitalnog ulaza ili izlaza i njega će “zaposjesti” PWM izlaz Timera0, OC0B:
Config Timer0 = Pwm , Prescale = 256 , Compare B Pwm = Clear Up , Compare A = Disconnect
Timer0 je postavljen u PWM način rada s faktorom dijeljenja 256, a Compare A i Compare B su nazivi Bascom-AVR-a za usporedne (OCR) registre. U ovom zadatku koristit ćemo samo registar OCR0B, pa smo OCR0A odspojili (disconnect) od njegovog izlaznog pina OC0A.
Sada ulazimo u glavnu programsku petlju, u kojoj najprije očitavamo napon klizača potenciometra:
Do
Rv1 = Getadc(0)
Dobiveni rezultat je broj u rasponu od 0 (klizač je u donjem položaju, ulazni napon je 0 V) do 1023 (klizač je u gornjem položaju, ulazni napon je 5 V). Prije nego li ga prenesemo u usporedni registar OCR0B, moramo ga “sabiti” u raspon 0-255 (OCR0B je 8-bitni registar pa u njega ne možemo upisati broj veći od 255):
Rv1 = Rv1 / 4
OCR0B = Rv1 Loop
I to je sve, sav preostali posao obavljaju sklopovi Timer0! Što je broj u registru OCR0B veći, impulsi će biti širi i motor će se brže vrtjeti; to je upravo ono što smo željeli postići!
Rješenje Arduina (program Shield-B_2.ino) int RV1 = 0;
U Arduino IDE postoji funkcija analogWrite() koja nam omogućuje jednostavno upravljanje pinovima PWM, odnosno OC izlazima tajmera. Funkcija prima dva argumenta: broj pina i vrijednost od 0 do 255 (označava širinu pulsa). Funkcija prepoznaje može li se pin povezati s OC izlazom tajmera i ako može, prepoznaje s kojim izlazom. Pin 5 ne moramo konfigurirati kao izlaz, jer ćemo koristiti izlaz PWM tajmera OC0B. Arduino IDE samostalno konfigurira tajmere u PWM načinu rada s faktorom dijeljenja 64, stoga to ne moramo mi napraviti.
Na početku programa definirat ćemo varijablu RV1 kao int i definirati vrijednost 0. U nju ćemo spremati očitanu vrijednost s potenciometra RV1.
S obzirom da funkcija analogWrite() direktno upravlja pinom 5, u funkciji setup() ne moramo posebno definirati način rada pina. Zbog toga će funkcija setup() biti bez naredbi: void setup() {
U funkciji loop() očitat ćemo napon klizača potenciometra RV1 i spremiti u varijablu RV1, vrijednost varijable RV1 podijeliti s 4 i pomoću naredbe analogWrite() pridodati tu vrijednost pripadajućem OC registru tajmera za pin 5. void loop() { RV1 = analogRead(A0); RV1 = RV1 /4; analogWrite(5, RV1); }
Samo za radoznale: Naredba analogWrite() prvo definira pin kao izlazni te provjerava je li vrijednost širine impulsa 0 ili 255. Ukoliko je širina impulsa 0, tada definira stanje pina LOW. Ako je širina impulsa 255 tada definira stanje pina HIGH. Za sve vrijednosti širine impulsa između 0 i 255 provjerava može li se pin spojiti na neki timer i ukoliko je to moguće, spaja pin s tajmerom te upisuje vrijednost u pripadajući OC registar. Ovim algoritmom omogućeno je korištenje naredbe analogWrite() i s pinovima koji se ne mogu spojiti na neki tajmer.
Impulsi koje proizvodi mikroupravljač na svome OC0B (~5) izlazu, osim što upravljaju elektroničkim sklopkama integriranog kruga L272M, a preko njih i brzinom vrtnje elektromotora, određuju i intenzitet svjetlosti koju emitira svjetleća dioda D2 na razvojnom sustavu Shield-B. Dioda će svijetliti to jače, što su impulsi širi, odnosno, što se motor brže vrti, pa nam to može biti pokazatelj ispravnog rada programa čak i ako na razvojni sustav ne spojimo elektromotor!
Možemo primijetiti kako se elektromotor neće pokrenuti kod vrlo uskih impulsa, kod kojih je LE-dioda već počela svijetliti. To je normalno, motor ima određenu tromost koju je potrebno savladati da bismo ga pokrenuli iz stanja mirovanja. Kolika je širina impulsa potrebna za njegovo pokretanje, ovisi o karakteristikama samog elektromotora i o frekvenciji impulsa kojima ga pokrećemo.
Priču o DC-elektromotoru završit ćemo u sljedećem nastavku, kada ćemo pokazati kako mu, osim brzine, programski možemo mijenjati i smjer vrtnje!
Napomena: Programe Shield-B_2.bas i Shield-B_2.ino možete besplatno dobiti od uredništva časopisa ABC tehnike!
Vladimir Mitrović, Robert Sedak