M.R.Z. Mikroprocesorem Řízené Zapalování

Logo ústavu

Tomáš Veselý, Ondřej Melša UREL, FEEC, VUT Brno
xvesel46stud.feec.vutbr.cz
xmelsa02stud.feec.vutbr.cz

Obsah:

  1. Úvod
  2. Realizace
  3. Hardware
  4. Software
  5. Instalace
  6. Závěr
  7. Literatura

Úvod

Tato práce je věnována problematice řízení zapalování hořlavé směsi ve válci dvoutaktního spalovacího motoru. Úkolem je navrhnout zařízení, které bude implementovatelné do dvoutaktních spalovacích motorů. Bude univerzální pro použití v jednoválcových i dvouválcových systémech. Bude univerzální pro použití v širokém spektru modelů se zaměřením na náhradu mechanických zapalovacích soustav továrních značky JAWA a ČZ, případně dalších značek využívajících stejného mechanického uspořádání stávajícího zapalovacího mechanismu. Přitom bude brán ohled na minimalizaci nutnosti jakéhokoli většího mechanického zásahu do konstrukce motoru a stávající elektroinstalace. V čem je výhoda elektronického zapalování? Jedna z hlavních výhod elektronického zapalování je bezkontaktní spínání výkonové části zapalovací soustavy. U stávajícího řešení dochází vlivem mechanického opotřebení ke změnám nastavení předstihu. Jedná se především o opotřebení distanční plošky pohybující-se po obvodu vačky na klice motoru a k opalování kontaktů spínače (kladívka). V obou případech se mění „odtrh na kontaktu kladívka“, čímž dochází ke změně předstihu a tím zhoršení chodu motoru a ztrátě výkonu. U dvouválcových motorů může tímto opotřebením dojít k desynchronizaci úhlu předstihu, což vede k vibracím motoru a následně k mechanickým poškozením. Druhá, a možná ještě zásadnější výhoda elektronického zapalovacího systému je možnost měnit úhel předstihu v závislosti na různých aspektech. Je-li zapalování řízeno elektronicky s absencí přímého mechanického spojení spínačů a motoru, lze parametry stavu motoru, jako jsou: otáčky motoru, zatížení motoru, teplota atd., sledovat a vyhodnocovat. V závislosti na těchto aspektech je možno měnit velikost úhlu předstihu v téměř reálném čase. Velikost úhlu předstihu zcela ovlivňuje chod motoru, výkonovou křivku a křivku kroutícího momentu. Za tímto účelem lze využít jednočipový mikroprocesor, který je schopen pomocí periferních obvodů sledovat stav motoru a na základě těchto údajů plynule a aktuálně velikost předstihu měnit. Plynulá regulace předstihu je realizovatelná také mechanicky. Této možnosti se využívalo u starších čtyrdobých spalovacích motorů. Jednalo se o odstředivý regulátor, který měnil úhel předstihu v závislosti na otáčkách motoru a podtlakový regulátor, který měnil úhel předstihu v závislosti na podtlaku v karburačním systému. Toto řešení se nejspíše z důvodu mechanické náročnosti na dvoutaktní motory nemontovalo. Dokonce podtlaková regulace by byla vlivem zpětných tlakových rázů z válce zpět do karburace velmi obtížná.

Realizace

Následující návrh je prototypním řešením celého projektu. Zařízení snímá počet otáček motoru a dle vložené tabulky vyhodnocuje, s jaký je předstih zapalování. Při návrhu byl kladen důraz na minimalizaci zařízení, čož znamená využití součástek v SMD pouzdrech (navíc se nemusí vrtat tolik dírek). Další, možná ještě důležitější aspekt je konstrukce zařízení tak, aby nebylo třeba věších fyzických úprav motoru.

Hardware

Zde se tedy vyskytuje jedna důležitá a nezbytná úprava oprati původnímu zapojení vozidla a to přívod napájecího napětí ze spínací skříňky. Ve spínací skřínce vozidla se ke kontaktu, jenž napájí indukční cívku, připojí napájení obvodu. Z elektrického rozvodu je napájecí napětí vyfiltrováno tlumivkou a stabilizováno stabilizátorem. Jak již bylo zmíněno, obvod je řízen mikroprocesorem a je tedy zapotřebí vyfiltrovat napěťové špičky vznikající ve výkonové části obvodu. Pro správnou funkci mikroprocesoru a dalších periferních integrovaných obvodů je napětí stabilizováno a opět vyfiltrováno kondensátorem. Blokem monitorování stavu motoru se rozumí obvodová část, která zjišťuje aktuální neelektrické parametry motoru. Těmi jsou míněny otáčky motoru, aktuální úhel otočení klikového hřídele, teplota motoru, zatížení motoru apod. Čím více aktuálních parametrů je k dispozici, tím efektivněji může být využit potenciál motoru a zkvalitněno spalování, čímž lze dosáhnout i nižších emisí. Do bloku vlastní řídící jednotky je zahrnut jednočipový mikroprocesor vhodných parametrů. K vyhodnocení všech informací z výše zmíněných snímačů neelektrických veličin je vhodná jejich úprava a možnost modifikace signálů před jejich zpracováním. K tomuto účelu jsou zařazeny komparátory. Mikroprocesor pak zpracovává pouze upravené užitečné informace. Na základě všech dat řídí mikroprocesor výkonovou část. Tento výkonový blok je ve funkci spínače, který uzavírá okruh indukčních cívek. Tím dochází k indukci potřebného vysokého napětí a řízenému přeskoku jiskry v okamžiku určeném řídící jednotkou.
blokove schema

Jelikož je napětí v napájecí síti vozidla, a ještě k tomu motocyklu s šestivoltovým rozvodem, nestabylní a dokonce se mohou v síti objevovat výrazné napěťové špičky, je třeba před použitím napětí vyfiltrovat a stabilizovat. Jako filtrační prvek je na vstup zapojena tlumivka o velikosti 1mH. Pro dostatečný účinek je třeba větší indukčnosti, ale vzhleden k odběru napájených obvodů je kompromisně zvolena tato hodnota. Za tlumivkou je posazen stabilizátor 7805. O něm není třeba dlouhých slov. Je zablokován dvěma kondensátory s hodnotami 100nF a následně je napětí dohlazeno elektrolytickým kondensátore 220uF.

Nejdůležitější a základní prvek konstrukce je mikroprocesor. Je zvolen typ Atmel Mega8 v SMD pouzdru TQFP. Jedná se o 8bitový procesor s 8kB programové Flash paměti, 512B EEPROM paměti, 1kB SRAM paměti, dvěma 8bitovými a jedním 16bitovým časovačem/čítačem, třemi PWM kanály, dvěma ADC převodníky v různých řežimech, I2C sběrnicí, ISP a USART programovací sběrnicí,čtyrmi osmiportovými I/O porty, externími přerušeními a dalšími možnostmi. Procesor je napájen 4,5 až 5,5V s vlastním odběrem do 4mA. Jeho pracovní frekvence je 0-16MHz.
Základní zapojení procesoru je z datasheetu. Z procesoru jsou vyvedeny piny MISO, MOSI a SCK, které spolu s napájením a resetovacím pinem slouží k programování procesoru pomocí ISP. Tyto piny jsou vyvedeny do standartně používaného 6pinového konektoru MLW. Dále je z pinů SCL a SDA vyveden dvoupinový konektor se zámkem určený k budoucímu možnému propojení s dalšími periferními ražízeními.
A teď k vlastním funkčním částem obvodu.
Na piny externího přerušení jsou přivedeny signály z optických snímačů. Na pin INT1(PD3) je přiveden signál určující otáčky motoru. Na pin INT0(PD2) je přiveden signál určující natočení motoru. Na piny AD6 a AD7 jsou přivedeny vstupy do obvodu spínání indukčních cívek.
Pro lepší orientaci doporučuji obrázek celého schématu:
schema

Modul bezkontaktního snímače je tvořen fotobránou. Fotobrána je velmi jednoduše tvořena LED diodou s vlnovou délkou záření 940nm, čili infračervená oblast. Dioda je zapojena v sérii s rezistorem a připojena přímo na stabilizované napětí. Jako přijímač je zde fototranzistor zapojen jako SE. Na kolektor je tedy přes rezistor 10k připojeno stabilizované napětí. V přídadě osvětlení citlivé oblasti tranzistoru se tranzistor otevře a na kolektoru klesne napětí. Ke kolektoru je připojen komparátor s operačním zesilovačem. Ten Ten překlápí v nastavené komparační úrovni nastavené rezistory RK1A a RK1B. Vlastní zařazení komparátoru je zde k jednoznačnému určení obou stavů "1" a "0". Výstup komparátoru je přiveden na vstup mikroprocesoru vyvolavající externí přerušení. Toto zapojení je provedeno dvakrát. Jednou slouží k určování otáček motoru a v druhém případě signalizuje natočení motoru (klikového hřídele). V těchto optozávorách je použita brána ve formě speciálního kolečka, které je připevněno na klikové hřídeli a rotuje s ní. Takto se dle výřezů v kolečku generují impulzi.
Situace je znázorněna na ilustrační fotografii prototipu:
cele
Výkonový spínací obvod. Spínání okruhu indukční cívky je nepříliž jednoduchá záležitost. Obzvláště, pokud se pracuje s takto malým napětím, tudíž s velkými proudy. Nároky na spínací prvek jsou jasné. Co nejmenší zbytkové napětí přechodu v sepnutém stavu a odolnost proti napěťovým a proudovým špičkám. Ve výběrovém řízení nejlépe obstál tranzistor typu MOSFET IRFP250N. Tento tranzistor je opět v zapojení SE. Na drain je připojena indukční cívka. Gate je řízen tranzistorem optočlenu PC355, nebo PC817. Tento tranzistor je opět zapojen SE, čili na kolektor je připojeno přes rezistor napájecí napětí a gate výkonového MOSFETu. Ještě je připojen obvod s LED diodou v sérii s rezistorem, to je ovšem jen indikační záležitost činnosti spínání tranzistoru. Optočlen je řízen výstupem z mikroprocesoru v sérii s rezistorem. Ze zapojení vyplývá, že díky použití zapojeni SE pomocného tranzistoru, je logika řízení inverzní. Tudíž, pokud je na výstupu mikroprocesoru vysoká úroveň, čili 5V, pomocný tranzistor optočlenu je sepnutý a na gatu MOSFETu je 0V, tedy je zavřen a okruh s cívkou je rozpojen.

Software

Řídící program je založen na obsluhách přerušení a na poly hodnot, které udávají velikost předstihu v souvislosti s otáčkami motoru.
Při psaní programu byla snaha vše důkladně a hlavně pochopitelně zakomentovat. V následujících řádcích bude obdobný popis, co je v komentáři.
V hlavním programu "main" jsou deklarovány vstupní porty D2 a D3. Výstupní porty jsou C6 a C7. Je aktivováno externí přerušení s tím, že čítání otáček INT1 reaguje na hranu a natočení motoru INT0 reaguje na změnu úrovně. Následně je naplněno pole mapy hodnot. v poslední řadě se v hlavním programu nastaví TIMER0, pomocí kterého se indikuje počet otáček motoru, potažmo i aktivita motoru. Z důvodu úspory energie jsou cívky po sepnutí spínací skříňky odpojeny. Až po prvním impulzu z optobrány měření otáček je připojena cívka, která bude palit v následujícím okamžiku. Pokud je motor v klidu nějaký okamžik (konkrátně doba, kdy 100x přeteče TIMER0), cívky se opět odpojí, dokud se zase motorem nepootočí. Ještě se aktivuje povolení přerušení v ppřípadě přetečení TIMERu0. Do popisu můžete přidávat i ukázky zdrojového kódu:

	
	
//******************************************************************************************************** //** Program rizeni predstihu dvoutaktniho spalovaciho motoru. ** //** ** //** Port D2 - impulzi natoceni motoru (INT0) ** //** Port D3 - impulzi citani otacek motoru (INT1) ** //** ** //** Port C6 - sepnuti civky L1 ** //** ( negativni sepnuti ~ pri "1" je vystup rozpojen, "0" spina civku ) ** //** Port C7 - sepnuti civky L2 ** //** ( negativni sepnuti ~ pri "1" je vystup rozpojen, "0" spina civku ) ** //** ** //******************************************************************************************************** // f_CPU = 1MHz
#include #include #include #include // preruseni pro casovac unsigned int citac_otacek = 0, // promena, do ktere se hodnota otacek docasny_citac_otacek = 0; // docasna promena, do ktere se uklada hodnota otacek int mapa[301]; // pole promenych obsahujici hodnoty predstihu pro TIMER2 char i = 0; // pomocna promenna pro pocatecni stav char j = 0; // pomocna promena odpojeni civek void napln_mapa (); // funkce napneni pole hodnotami //================================================================================== void main (void) { DDRC = 0b11000000; // nastaveni pinu 6 a 7 potru A jako VYSTUPNI PORTC = 0b11000000; // nastaveni vysoke urovne pinu 6 a 7 ( na optoclenu ) DDRD = 0b00000000; // nastaveni potru D jako VSTUPNI GICR |= 0b11000000; // aktivace externiho preruseni INT0 a INT1 MCUCR = 0b00001101; // aktivace preruseni INT1 na nabeznou hranu, // INT0 na zmenu urovne sei (); // povoleni preruseni napln_mapa(); // do pole se vlozi hodnoty predstihu TCCR0 = 0b00000101; // nastaveni preddelicky TIMER0 na 1024 ( citani otacek ) TCNT0 = 0; // nastaveni pocatecni hodnoty TIMER0 TIMSK |= 0b00000001; // povoleni preruseni po preteceni TIMERu0 0b00000001 while (0); // zacykleni, uz provadi jen obsluha přeruseni } //=================================================================================

Obsluha externího přerušení INT1. Čili, pokud přijde impulz z optozávory pro měření otáček (optozávora na vvnitřním kruhu, tedy ty dirky na rotoru), proměná "docasny_citac_otace" se inkrementuje. Otáčky motoru tedy určute, kolik impulzů za dobu určenou TIMERem0 se v proměné nainkrementuje. Ta následující podmíněná funkce slouží k připojení cívky, která bude pálit při rozběhu motoru. Jakmile je funkce použita, již se při chodu motoru neuplatňuje až do chvíle, kdy se motor opět zastaví a odpojí se cívky.


  //================================================================================= 
  // obsluha externiho preruseni INT1 ( citani impulzu za casovy usek dany casovacem )
  
  ISR (INT1_vect)                 // obsluha externiho preruseni
  {
    docasny_citac_otacek ++;      // inkrementace docane promenne

    if (i == 0)                   // nastaveni valce k zapalu v pocatecnim stavu 
    {
      if (bit_is_set (PIND,2))    // nastaveni urciteho valce
        PORTC = 0b01111111;       // bude palit L2
      else
        PORTC = 0b10111111;       // bude palit L1
      i =	1;
    }	
  }
  
  //=================================================================================
  

Obsluha přerušení při přetečení TIMERu0. Je to tedy vyhodnocení, kolikrát byla imkrementována proměná, čož je přímo úměrné otáčkám motoru. Obsah proměnné "docasny_citac_otacek" se presune do "citac_otacek", aby se mohla původní proměná vynulavat a bylo možno do ní opět čítat. Samozřejmě je vynulován i registr TIMERu0. Podmíněná funkce zkoumá, zda-li není obsah proměnné po časovém úseku nulový. Pokud ano, inkrementuje se proměná "j". Pokud se takto zjistí, že 100x za sebou byla proměnná prázdná, odpojí se cívky a aktivuje se funkce počátečního připojení cívek uvedená víše.


  //=================================================================================
  
  // obsluha preruseni TIMER0 ( citani otacek )

  ISR (TIMER0_OVF_vect)                    // obsluha preruseni na zaklade preteceni casovace TIMER0
  {
    citac_otacek = docasny_citac_otacek;   // vlozeni docasne promenne do pracovni promenne

    if (docasny_citac_otacek == 0)         // pokud neni zaznamenan zadny impulz, inkrementuje se prom. j
    {
      j++;
      if (j == 100)                        // pokud nebyl impulz 100x za sebou, motor se netoci
      {
        PORTC |= 0b11000000;               // odpojeni civek v dobe evidentni necinnosti
        j = 0;                             // promena se muze vynulovat, pokud se rotor neotoci, civky se nepripoji
        i = 0;                             // aktivace funkce pripojeni civek pri pootoceni motorem
      }
    }
    else
      j = 0;                               // pokud se motor otoci, promenna se nuluje

    docasny_citac_otacek = 0;              // nulovani docasne romenne
    TCNT0 = 0;                             // nulovani registru TCNT0
  }
  
  //=================================================================================
  

Obsluha externího přerušení INT0. Rotor je z poloviny po obvodu vykrojen. Hrany tohoto půlměsíce dávají informaci o natočení motoru v podobě impulzů vyvolavajících přerušení INT0. Tento impulz je 30 stupňů před horní úvratí, čili, od tohoto bodu se dopočítá zpoždění pomocí TIMERu2 k bodu zápalu. Nejprve je nastavena předdělička TIMERu. Do registru je načtena hodnota z pole "mapa", která je odečtena od maxima TIMERu, aby obsluhu zápalu vyvolalo přerušení přetečení TIMERu2. Proto je povoleno přerušení při přetečení TIMERu2.


  //=================================================================================
  
  // obsluha externiho preruseni INT0 ( impulz natoceni motoru v nastavenem uhlu )

  ISR (INT0_vect)                    // obsluha externiho preruseni
  {
    TCCR2 = 0b00000110;              // nastaveni preddelicky casovace "1" na 256 ( dopocet k uhlu predstihu )
    TCNT2 = 255-mapa[citac_otacek];  // nastaveni pocatecni hodnoty TIMER2
    TIMSK |= 0b01000000;             // povoleni preruseni po preteceni TIMERu2
  }
  
  //=================================================================================
  

Obsluha přerušení při přetečení TIMERu2. Nyní dochází k ROZEPNUTÍ koncového tranzistoru a tím k přeskoku jiskry na svíčce. Oba výstupní porty jsou aktivovány a tím je díky inverzní logice rozepnut koncový tranzistor, který byl sepnut. Následně je druhý tranzistor, který byl do teď neaktivní, sepnut a tím se začne nabíjet cívka druhého válce. Ještě je vypnuto povolení přerušení TIMERu2, aby náhodou nedošlo k nechtěnému zápalu.


  //=================================================================================
  
  // obsluha preruseni TIMER1 ( preteceni casovace "1" )
  ISR (TIMER2_OVF_vect)						
  {
    PORTC |= 0b11000000;        // rozepnuti obou civek - preskok jiskry na jedne svicce
    if (bit_is_set (PIND,2))    // zjisteni, ktery valec bude palit
      PORTC &= 0b0111111;       // dle natoceni aktivace nabyjeni jedne z civek
                                // optobrana je prerusena, bude palit L2
    else
      PORTC &= 0b1011111;       // dle natoceni aktivace nabyjeni jedne z civek
                                // optobrana neni prerusena, bude palit L1

    TIMSK &= 0b10111111;        // zakazani preruseni po preteceni TIMERu2
  }
  
  //=================================================================================
  

Zde je program pro naplnění pole "mapa" hodnotami. Význam funkce je pouze ten, aby celý výpis hodnot nebyyl na začátku programu. Jiné opodstatnění, proč se toto pole plní v tomto programu není.:-) Jak bylo již zmíněno, hodnoty jsou získány z programu exel, ve kterém jsou vytvořeny tabulky počítající otáčky motoru, jsou tam zadány hodnoty předstihu a z toho pak hodnoty, se kterými přímo pracuje TIMER2. Celé je to velmi vtipně naformátováno tak, že se celá výsledná tabulka zkopíruje do AVR Studia. Je to zatím pouze pomůcka, jak nepřepisovat všech 301 hodnot ručně.


  //=================================================================================
  
  // macteni hodnot do pole mapa ( hodnoty nakopirovane z exelu )
  void napln_mapa (void)
  {
  mapa[	0	]=	255	;	//	0	 rpm
  mapa[	1	]=	255	;	//	29	 rpm
  :
  mapa[	299	]=	1	;	//	8554	 rpm
  mapa[	300	]=	1	;	//	8583	 rpm
  }
  
  //=================================================================================
  

Instalace


Instalace zařízení by měla být velmi jednoduchá, čož bylo i kritérium hry.
Je potřeba přivést vodič připojený do spínací skříňky ke kontaktu napájení indukčních cívek. Ten bude napáje zařízení. Na FASTON Ucc se připojí tento vodič a na FASTON GND je záhodno připojit vodič zapojený na kostru.
Po vyjmutí stávajícího systému kladívek se nainstalije pomocná destička, na které je na distančních sloupcích přišroubována osazená deska plošného spoje zařízení. Tento komplet statoru se přišroubuje tak, aby byl natočen co nejvíce vpravo. Motor se otočí do horní úvratě a na rotor se přišroubuje stínítko. Stínítko je natočeno tak, aby hrana vykrojení procházela optobránou (při malém pohybu bliká červená LED vpravo, ne LED LD1 nebo LD2). Niní se část statoru povolí a pootočí o 30° doleva. Tím je dávo, že hrana stínítka prochází optobránou 30stupňů před horní úvratí. Pokud v tuto chvíli svítí ona červená LED, bude de pálit válec na L1. Na FASTON L1 se připojí cívka válce, který je v dolní úvrati. (V případě jednoválce se připojí jeho cívka na FASTON L2)

Teď už stačí snad jen nastartovat :-).

Závěr

Jak bylo napsáno v úvodu, toto je prototypní verze, tudíž určitě ne konečná. Zařízení zatím bere v potaz pouze otáčky motoru, podle kterých nastavuje předstih. V dalších verzích bude zaměřen pohled na zohlednění teploty motoru a zatížení motoru. U dvoutaktních motorů se velmi těžko zjišťuje zatížení motoru, proto bude brán jako ekvivalent tohoto paranetru natočení plynové rukojeti. Aktuální mapa obsažená v programu je NEodladěná a má naprosto teoretický průběh. Na přesné odladění celého zařízení by byla vhodná výkonová brzda, nebo hodně najetých kilometrů a hodně času.
Každopádně věškerá dosavadní dokumentace s obrazy LAYOUTů v PDF, zkdojových kódů je obsažena zde.

Literatura

[1] Veselý T. Mikroprocesorový modul řízení předstihu zapalování dvoutaktního motoru. VUT Brno, Brno, 2009.
[2] Váňa V. Mikrokontroléry Atmel AVR programování v jazyce C. BEN, Praha, 2006.
[3] Atmel corporatin ATmega8/ATmega8L. Atmel corporatin, USA, 2008, www.atmel.com/literature