František Pospíšil

Na svých stránkách popisuji cesty, kterými jsem došel k zamýšleným cílům. Cíle se občas během cesty změnily.

ElektronikaProgramování

Otáčkoměr s ATmega8535 pro auto Škoda Favorit

V roce 2008 jsem pročítal návody na automatické zapínání světel v osobních automobilech a uvažoval o tom, že si postavím něco podobného. Normálně by stačilo pár diskrétních součástek, ale já chtěl ještě měřit otáčky, napětí, teploty… Proto jsem začal vyvíjet zařízení, kterému je věnován následující článek.

Požadavky na zařízení:

1. automatické zapínání světel po nastartování automobilu – je ovládáno podle otáček motoru a napájecího napětí (musí být min.12,5V – funguje dobíjení)

2. pozvolné rozsvěcení osvětlení kabiny – řízeno PWM kanálem procesoru

3. měření otáček motoru – indikace bargrafem, který měl být původně z LED diod, nakonec je zobrazován na posledním řádku displeje

4. měření napětí na palubě automobilu

5. měření teplot – vnitřní, venkovní a teplota motoru

6. hodiny – kvůli umístění displeje byly zrušeny původní, analogové

7. programovatelný časovač stěračů

Obvodové řešení:

Kromě displeje, rotačního kodéru a teploměrů, je obvod sestaven na oboustranné desce plošných spojů. Ta je umístěna za autorádiem. Jednotlivé kabely (napájení, ovládání světel, stěračů…) jsou svedeny do dvojice svorkovnic, tak aby deska mohla být jednoduše vyjmuta z automobilu k dalšímu vývoji programu.

Jednotlivé funkce obvodu jsou naprogramovány do paměti procesoru ATmega8535, jehož napájení je zajištěno stabilizátorem 7805. Vstupní piny procesoru, které zjišťují stav obvodů automobilu jsou ošetřeny ochrannými diodami a RC články omezujících rušení produkované provozem spalovacího motoru. Na výstupech je připojeno pět relé ze šuplíkových zásob, každé pro jiný proud. Některá spínají relé na pojistkovém panelu, proto stačí malé proudy, jiná jsou dimenzována pro 8 – 10A. Tady jsou cesty pl. spoje zesíleny cínováním.

Rezistory, diody a keramické kondenzátory jsou v provedení SMD kvůli úspoře místa na plošném spoji, jednoduššímu návrhu a menšímu počtu děr.

Deska je vybavena konektory pro připojení displeje, teploměrů, rotačního kodéru a reproduktoru. Další konektor slouží k připojení programátoru Dragon a poslední je zatím nevyužitý. Je na něj přiveden sériový kanál procesoru s tím, že by zařízení mohlo být v budoucnu dál rozšířeno.

Favorit_schema

Popis jednotlivých částí obvodu a příslušného programu

Napájení:

V klidu je obvod odpojen od baterie a neodebírá žádný proud. K palubní síti automobilu je obvod připojen prostřednictvím dveřního spínače, který připojuje cívku relé K6. Relé má dva přepínače, jedním připojí 12V pro napájení obvodu a druhým přepne svoji cívku na tranzistor T6, který je otevřený přes rezistor R1. Cívka relé je tedy napájena po celou dobu činnosti obvodu. Procesor má možnost obvod vypnout, když vývod PD6 nastaví na úroveň L a uzemní tak bázi tranzistoru T6. Procesor při vypínání přejde do režimu spánku, aby při pádu napájení nedocházelo k nepředvídaným činnostem programu.

Procesor i ostatní digitální obvody jsou napájeny z monolitického stabilizátoru 7805. Podsvětlení displeje je připojeno přes odpor 47W/5W na 12V, aby nebyl zbytečně zatěžován stabilizátor.

Ovládání rotačním kodérem:

Pro nastavení hodin a dalších naprogramovaných funkcí při provozu zařízení slouží rotační kodér s tlačítkem. Umístil jsem jej do prostoru nepoužívaného spínače na levé straně přístrojové desky.

Rotační kodér je tvořen dvojicí spínačů, každý z nich dá 30 impulsů na otáčku, fáze impulsů je posunuta o 90°. Jeden spínač spouští program přerušení INT1 sestupnou hranou a druhý je připojen na PC1. Program přerušení vyhodnotí stav druhého spínače a podle toho inkrementuje, nebo dekrementuje proměnnou ROTcoder:

ISR(INT1_vect) // podprogram preruseni INT1 - rotacni koder
{
    if (PINC&0x01) // neni stisknut koder
    {
        if ((~PINC&0x02) && (ROTcoder<ROTmax)) ROTcoder++;
        if (( PINC&0x02) && (ROTcoder>0)) ROTcoder--;
    }
}

Spínače rotačního kodéru využívají pullup rezistory integrované v procesoru, pro správný tvar impulsů které spouští přerušení je důležitý kondenzátor C8.

Stiskem tlačítka rotačního kodéru je zpřístupněno menu, ve kterém je možno nastavit aktuální čas pro hodiny, jas displeje a také několik prodlev, používaných při provozu. Nastavené hodnoty prodlev jsou v sekundách a program je ukládá do paměti RAM obvodu DS1302. V dalším textu zmiňované adresy jsou z tohoto paměťového prostoru.

Osvětlení kabiny:

Žárovka v kabině je spínána tranzistorem Q2 (BD244) přes PWM kanál OC1A procesoru. Pozvolna se rozsvítí při každém otevření dveří. Po odpojení dveřního spínače, (vývod PC2 procesoru) zhasíná až uplyne nastavený čas (adresa 0xE1 obvodu DS1302), nebo čas podle adresy 0xE3, pokud je zapnutý motor.

Ovládání světel:

V dvacet let starém autě je šetrnější připojit světla, až když začne fungovat dobíjení: Program v intervalu 0,1sekund sleduje hodnotu na pinu PA6. Pokud je v úrovni H, odpočítá nastavený čas (adresa 0xE5 obvodu DS1302) a před vlastním zapnutím obrysových světel (pin PC5) zkontroluje napětí na AD převodníku (musí být minimálně 12,5V) a otáčky motoru. Když není naměřeno dostatečně vysoké napětí, nebo otáčky, program počká 2sekundy a znovu měří napětí i otáčky. Dále je odpočítán čas pro zapnutí tlumených světel (adresa 0xE7 obvodu DS1302) a zapnuto relé K5. Spínače relé jsou v automobilu připojeny paralelně ke stávajícím spínačům světel na přístrojové desce, tak aby všechny funkce vozu zůstaly zachovány i při odpojení obvodu.

Displej:

Je použit podsvícený alfanumerický displej řízený obvodem HD44780, který má 4 řádky po dvaceti znacích. Při jeho výběru je nutno dbát na provozní teplotu uvedenou v katalogovém listě, mě se podařilo získat displej s rozsahem -25°C až +70°C, což je pro provoz v automobilu dostačující.

Displej je zabudován místo analogových hodin do přístrojové desky. S mikroprocesorem je propojen šestnácti žilovým kabelem délky 1m. Program nevyhodnocuje stav displeje, vzhledem k tomu, že vývod R/W je připojen na GND to ani není možné. Z důvodu úspory pinů procesoru je použita čtyřbitová komunikace s tím, že mezi jednotlivými změnami stavu na pinech displeje je prodleva 20us. Abych měl jistotu, že komunikace bude fungovat i v zarušeném prostředí automobilu, byl kabel původně 2metry dlouhý a zobrazování bylo pořád ještě bez chyb.

Podsvícení displeje je spínáno tranzistorem Q3 (BD135), jehož kolektorový proud je 1,5A. BC546 nestačí, protože použitý displej potřebuje pro plné rozsvícení 300mA. Tranzistor je ovládán PWM kanálem OC1B procesoru, požadovaný jas v rozsahu 0-100% je uložen na adrese 0xFF hodinového obvodu.

Hodiny s obvodem DS1302:

Obvod DS1302 komunikuje s procesorem po sběrnici I2C a ke své činnosti potřebuje krystal 32,768kHz. Pro zálohování chodu hodin při odpojení napájení je připojen akumulátor 3,6V. Obvod jej sám nabíjí. Aktuální stav hodin je zobrazován v levé části prvního řádku displeje.

Voltmetr:

Procesor ATmega8535 je vybaven 10-ti bitovým AD převodníkem, což v dané aplikaci přímo vybízí k měření napětí v automobilu. Pro činnost převodníku je potřeba připojit blokovací kondenzátory a odrušovací cívku k jeho napájení. Je využit vnitřní referenční zdroj, takže základní rozsah převodníku je 0 – 5V, s odporovým děličem R7+P2 je 0 – 20,48V. Při rozlišení 10 bitů je velikost jednoho dílku 0,02V. Aktuální napětí je zobrazováno v pravé části prvního řádku displeje.

Teploměry DS18B20:

Program periodicky čte a vypisuje na druhý řádek displeje teploty naměřené trojicí 1-wire čidel DS18B20. Ke komunikaci s čidly je použit pin PA0, popis komunikace je např. zde. V paměti procesoru jsou zaznamenány 64bitové adresy použitých čidel, program postupně oslovuje jednotlivá čidla prostřednictvím jejich adres a naměřené teploty zaznamenává do proměnných Teplota1, Teplota2 a Teplota3. Ve smyčce hlavního programu jsou jednotlivé teploty vypisovány na displej.

Komunikace po 1-wire sběrnici je časově náročná operace, program musí vytvářet a číst impulsy s délkou několika mikrosekund. V popisované aplikaci tato činnost koliduje s otáčkoměrem, který měří délku periody signálu ze zapalovací cívky automobilu. V době, kdy je motor zastaven, je komunikace po 1-wire sběrnici řízena časovačem T1 a probíhá s periodou 0,1s. V době, kdy běží motor, je komunikace po 1-wire sběrnici spouštěna přerušením od cívky zapalování. Část komunikace proběhne v přerušení INT0 (cívka motoru) i v nejvyšších otáčkách není riziko, že by došlo ke kolizi komunikace po 1-wire s programovým vybavením otáčkoměru.

Teploměry jsou připájeny na 2,5metrů dlouhé stíněné dvojlince. Na stínění je připojeno GND, na jeden vodič dvojlinky VCC a na druhý 1-wire sběrnice. Jeden teploměr je v kabině automobilu, druhý je připevněn na těleso termostatu, třetí je umístěn v mřížce před chladičem.

Otáčkoměr:

Vstupní informací pro měření otáček u zážehového motoru mohou být impulsy z obvodu zapalování. V mém případě je impuls přiveden přes rezistor R15 a RC článek R24 a C9 na vstup INT0 procesoru. Rezistor R15 je v provedení SMD, jako všechny ostatní a na začátku několikrát nevydržel vysokonapěťové špičky, tak jsem jej nahradil trojicí do série zapojených rezistorů s menším odporem.

K měření je použit čítač T0, hodinový kmitočet 8MHz je dělen 64, takže měření délky periody pulsů na vstupu INT0 je realizováno s rozlišením 8us. Čítač T0 je doplněn proměnnou Otacky1, ta je inkrementována při každém přetečení osmibitového čítače, takže společně tvoří 16-ti bitový čítač. Program přerušení od sestupné hrany INT0 ukládá naměřené hodnoty délky jednotlivých period do pole OtackyArray ze kterého je počítána průměrná délka periody uložená v proměnné Otacky.

Počet otáček motoru z minutu je vypočten jako podíl 3 750 000 / Otacky. Konstanta je sestavena následujícím způsobem:

– rozlišení měření délky periody je 8us, to je 125 000 dílků za sekundu

– požadovaný výsledek je počet otáček za minutu, to je 60 sekund

– během jedné otáčky čtyřdobého motoru jsou na cívce dva zapalovací impulsy, proto je potřeba výsledné otáčky vydělit dvěma

Výsledek: 60 x 125 000 / 2 = 3 750 000.

Otáčky jsou zobrazovány na třetím řádku displeje a na bargrafu. Ten je vytvářen z předem nadefinovaných znaků v paměti ACG displeje. Znaků je dvacet, každý je sestaven z pěti sloupců, proto je rozlišení bargrafu 100 dílků. Jeden dílek odpovídá 60 otáčkám za minutu, maximální otáčky jsou 6000 ot/min.

Cyklovač stěračů:

Vývod č.5 z přepínače stěračů ve Favoritu zapíná cyklovač umístěný na pojistkovém panelu. Já tento vývod připojil na vstup PA4 procesoru. Pokud je na něm úroveň H, bude s periodou nastavenou v proměnné 0xFD spínáno relé K1. Během chodu stěračů lze perioda měnit pomocí rotačního kodéru.

 Otáčkoměr

Poznámky k programování

Rozdělení úloh pro časovače:

    T0 – měření periody pro otáčkoměr

    T1 – časování periodických událostí, některé probíhají 100x za sekundu, jiné 1x za sekundu

    T1 – PWM moduly pro plynulé rozsvěcení displeje a osvětlení kabiny

    T2 – PWM kanál nastavený na 50% střídu signálu vytváří tón pro reproduktor

Problém s využitím paměti:

Program zkompilovaný v AVR studiu při svém startu uloží všechny řetězce a obsahy polí do paměti RAM. Současná verze programu používá ke své činnosti 32 textů po 20 znacích. To je 640 bajtů paměti, další paměť zaberou datová pole pro adresování teploměrů a pole pro speciální znaky používané u bargrafu. Je tedy nutné přinutit překladač, aby řetězce i statická pole nechal v paměti EEPROM a paměť RAM mohla být využívána programem. K tomu slouží knihovna <avr/pgmspace.h>

Soubory pro stažení:

Schéma a deska: favorit_schema

Projekt pro AVR studio: Favorit_01

Odkazy:

Otáčkoměr pro spalovací motory: http://hw.cz/constrc/auto/otackomer/index.html

Automatický spínač světel automobilu: http://hw.cz/teorie-praxe/art1981-automaticky-spinac-svetel-automobilu.html

Otáčkoměr a hlídač světlometů: http://www.holman.cz/hg/ohs/index.htm

Elektroinstalace Škoda Favorit: http://skodafavorit.xf.cz/elektroinstalace.html

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *