Základnou myšlienkou bolo spraviť si zdroj pre modelovú železnicu. Okrem použitia PWM som chcel využiť aj LED displej na zobrazenie výkonu ( % PWM ) a smeru ( polarita napätia v koľajniciach ). Celé zapojenie sa skladá z 4 integrovaných obvodov a displeja. Na prvom obrázku je vidno, ako to vyzeralo pri testoch a pri zapojení na kontaktných poliach.
Použité integrované obvody
Základom celého zapojenia je mikroprocesor ATmega8. Ten riadi integrovaný obvod L298N (čo je 2x výkonový H-mostík), ktorý slúži ako výkonový prvok. Pretože prepínanie smeru bolo pre mňa trochu zložitejšie, vyriešil som to multiplexorom 74157, cez ktorý mikroprocesor prepína smer jazdy. Posledný integrovaný obvod je ULN2004, čo je 7 darlingtonových tranzistorov v jednom puzdre. Tento slúži len ako zosilňovač, aby mikroprocesor nespínal priamo segmenty displeja. Okrem integrovaných obvodov a displeja je v zapojení pár drobných súčiastok.
Jednotlivé časti programu, generovanie PWM
Najhlavnejšou časťou je regulovanie výkonu. O to sa stará časovač TIMER2 mikroprocesora, ktorý funguje v režime FAST PWM, na frekvencii 488Hz. Strieda je regulovateľná v rozsahu 0 až 99.53% v 255 krokoch. Jeden krok je približne 0.39% Tento mód je popísaný na strane č. 112. datasheetu k ATmega8. Pozrite si obrázok:

Funguje to celkom jednoducho. TIMER2 v registri TCNT2 neustále počíta od 0 do 255 (zelené schodíky na obrázku). Po 255 sa resetne a počíta znova od 0 (červená čiara nasledujúca za schodíkmi). Pokiaľ je v móde FAST PWM, využíva aj register OCR2, v ktorom je číslo od 0 do 255. Napríklad 128. Časovač stále počíta od 0 do 255, ale navyše aj porovnáva registre OCR2 a TCNT2. Ak nastane zhoda, aktivuje príslušný výstupný PIN. Tento je aktivovaný, pokiaľ sa nedopočíta k 255 v registri TCNT2, kedy tento pin resetne. A takto dookola…
Zmena striedy u generovaného PWM
PWM je generované porovnávaním dvoch registrov. Aktivované je pri ich zhode, resetované pri pretečení registra TCNT2. Z toho vyplýva, čím neskôr aktivujem PWM (to znamená väčšie hodnoty OCR2), tým bude mať menšiu striedu, pretože bude skôr resetnuté. A čím skôr ho aktivujem (menšie hodnoty registra OCR2), tým neskôr dôjde k jeho resetu a strieda bude väčšia. Pozrite si obrázok:

Všimnite si, že so stúpajúcou hodnotou OCR2 klesá strieda a opačne.
TIMER0 a zmena striedy pomocou tlačidiel
Zmena striedy je zmenou výkonu. Ako som už napísal, je možných 255 stupňov výkonu. Pretože mikroprocesor je “veľmi rýchly”, nie je možné len tak pripojiť tlačidlo a meniť výkon. Stalo by sa to, že by nebolo možné výkon plynule meniť, skákal by len na nulu, alebo na maximum. Preto je na mieste úvaha. Chcem, aby výkon z nuly na 100% stúpol (alebo klesol) pri držaní tlačidla za 3 sekundy. Za 3 sekundy musí teda ubehnúť 255 krokov, čiže 3 / 255 mi udáva čas, ako často musím kontrolovať tlačidlo, aby bola splnená podmienka zmeny výkonu z 0 na 100% za 3s (Jednoduché delenie 3 / 255 = 0.012s). TIMER0 teda v pravidelných časoch kontroluje tlačidlá a podľa ich stavu mení výkon. Pozrite si vývojový diagram. Pretože register súvisiaci s výkonom môže mať hodnoty len od 0 do 255, musí byť ošetrená aj táto podmienka : -1 < OCR2 < 256.

V tomto kroku je ešte kontrolované tlačidlo zmeny smeru. To je ale nutné najprv rozpísať a vysvetliť, potom bude vývojový diagram.
Smer točenia motorov a jeho zmena
Z elektrického hľadiska je zmena točenia motorov len o tom, ktorou svorkou prúd vstupuje do motora a ktorou vychádza. Toto zabezpečuje integrovaný obvod L298N, ktorý je cez ďalší integrovaný obvod – 74157, vhodne riadený mikroprocesorom.

L298N má dva vstupy cez ktoré sa riadi smer prechádzajúceho prúdu. Na jednom je vždy úroveň log. 0 a do druhého ide PWM. To, kde sa ktorý signál dostane určuje integrovaný obvod 74157. Je to multiplexor, ináč povedané prepínač. Raz cez neho signály prechádzajú priamo, druhý raz na kríž.
Softvér a zmena smeru
Narozdiel od zmeny výkonu je zmena smeru trochu zložitejšia. Smer môžem meniť, len keď vlak stojí (výkon je rovný 0, register OCR2 je rovný 255). Ako už bolo vyššie spomenuté, o tlačidlá sa stará časovač TIMER0. Ale tento obsluhuje tlačidlá asi 100x za sekundu. Ak by priamo obsluhoval aj zmenu smeru, prepínanie by bolo na náhodu. Kto by stíhal odsledovať 100 prepnutí za sekundu? Preto je tam malá vsuvka v obsluhe tlačidla zmeny smeru, ktorá spôsobí, že tlačidlo bude obsluhované len 2 krát za sekundu.

O obsluhu sa stará premenná smer. Tá spôsobí, že smer sa nebude dať zmeniť pri každom zatlačení tlačidla, ale až po 32 overeniach, že bolo tlačidlo zatlačené. Táto zmena je z mikroprocesora prenesená cez integrovaný obvod 74157 na výkonový prvok L298N.
Riadenie a obsluha displeja
O tom, ako riadiť štvormiestny LED displej som napísal článok. Je dobré si ho prejsť, sú tam základy.
Keď to zhrniem, mikroprocesor sa musí postarať o displej sám. Musí si rozhodnúť, čo, kedy a kde vykresliť. Základom je register OCR2. kde je uložený aktuálny výkon. Pretože výkon súvisí s OCR2 nepriamo (so stúpajúcim OCR2 výkon klesá), musím na displeji zobrazovať hodnotu 255-OCR2. Túto rozdelím na jednotky, desiatky a stovky, ktoré zobrazím na príslušných segmentoch displeja. Prvý segment je určený na zobrazenie smeru jazdy.

Najjednoduchšie by bolo použiť mikroprocesor vyššej rady a 4 porty (4×8 = 24 vývodov) použiť len na vykresľovanie znakov na displeji. Ale keďže toľko portov nie je k dispozícii (BCD kódom by sa to dalo znížiť na 16), musím každý segment vykresliť zvlášť (Síce by sa kombináciou BCD kódov dal počet portov znížiť na 6, ale to by pribudli ďalšie integrované obvody).
Funguje to teda tak, že mikroprocesor má zhasnutý celý displej. Nastaví si, čo sa má rozsvietiť na prvom segmente a potom ho rozsvieti. Počká chvíľku, zhasne ho. Nastaví ďalší a rozsvieti ho. Takto dookola. Rýchlosť tohoto preblikávania je určovaná od časovača TIMER2, ktorý beží na frekvencii 488Hz. Keďže segmenty displeja sú 4, 488/4 = 122. Každú segment sa rozsvieti 122x za sekundu, čo ľudské oko určite nepostrehne.
Modulo a rozsekanie čísla na segmenty
Ako už bolo spomínané, register OCR2 obsahuje aktuálny výkon. Pre zobrazenie ho musím ale spracovať ako 255 – OCR2. Musí ho správne rozdeliť na jednotky, desiatky a stovky. Pozrite si príklady (Použité písmo je CRYSTAL):

O toto rozdelenie sa stará kúsok programu, ktorý využíva modulo. Modulo je zvyšok po celočíselnom delení a zapisuje sa znakom %. Pozrite si niekoľko príkladov:
- 23 % 5 = 3 (23 / 5 = 4, zvyšok je 3)
- 221 % 16 = 13 (221 / 16 = 13, zvyšok je 13)
Ja využijem pre rozklad modulo číslom 10. Pozrite si celý výpočet na obrázku:

Tento výpočet sa opakuje 488 krát za sekundu. Postup je v smere od jednotiek k stovkám. Najprv cez %10 zistím, aké číslo je na mieste jednotiek. Potom ho odpočítam a delením 10 odstránim jednotky. Znova cez %10, ale tentokrát zisťujem desiatky. Potom ich odpočítam, vydelím znova 10 a dostávam číslo na mieste stoviek.
Záverom…
Článok je všeobecným úvodom k mikroprocesorovému PWM riadeniu vláčikov s displejom. Sú tu popísané základné myšlienky a postupy, ktoré som využil pri výrobe regulátora. Niektoré veci sa od konečného zariadenia môžu líšiť, ale je to (aspoň dúfam) spôsobené rôznymi zmenami k vylepšeniu zariadenia.
Ahoj,
programujem autičko čo sa bude samo riadiť podľa čiary. Mám problém s rozbehaním obyčajného motorčkeka pomocou pwm signálu….
potreboval by som radu ako mám nastaviť registre na predeličku…(akú predeličku zvoliť)…ako nastaviť register TCCR…a podobne …
vopred ďakujem veľmi pekne za radu…