rozpracováno

Procesorem řízené zapalování

Jedná se o tranzistorové, mikroprocesorem řízené zapalování k dvouválcovému dvoutaktnímu motoru pro Jawu 350. Obvod je postaven na procesoru PIC 16F84AP, který zajišťuje tři funkce:

  • budí zapalovací cívky pulsy o konstantní šířce bez ohledu ma otáčky motoru
  • vytváří předstih v závislosti na otáčkách
  • protože mi zbyl jeden celý port volný, funguje zapalování zároveň jako digitální otáčkoměr
řídící jednotka

Zapojení

Na zapojení není nic záludného. Procesor jsem pro jistotu od ostatních obvodů důsledně oddělil optočleny. Tranzistorová spínací část zapalování je okopírovaná z nějakého staršího návodu.

Oproti zapojení a návrhu plošného spoje, který je již opravený, chybí na vyfotografované desce dva odpory. Zapomněl jsem na ně a musel jsem je dobastlit ze strany spojů.


Program

Program je napsaný v céčku. Zapalování funguje zhruba tak, že měří časové intervaly mezi pulsy na vstupech. Pokud jsou otáčky malé, na výstupech se objevují pulsy s konstantní šířkou podle vstupních pulsů. Při vyšších otáčkách procesor přepokládá, že další puls na vstupu přijde ve stejném intervalu, jako ten předchozí a puls na výstup pošle dříve. Podle toho, kdy následně přijde skutečný puls od přerušovače, procesor upraví interval, ve kterém pošle následující puls.

Veškeré zpracování probíhá v přerušení, které je periodicky spouštěno přetečením časovače. V hlavní smyčce programu se provádí pouze pošťuchování hlídacího psa, aby netahal za reset.

#include <pic.h>

unsigned long TIME;               // počítadlo časovače 
signed char PULS;                 // délka pulsu x 100 us (počet přerušení)
bit PS1, PS2;                     // předchozí stav vstupu - reagujeme na hranu
signed char JISKRA1, JISKRA2;     // počítadla délky pulsu pro válec 1 a 2
unsigned long ZAPAL1, ZAPAL2;     // časy vyslání pulsu pro válec 1 a 2

void interrupt isr(void)
{
	TMR0 = 59;     // preruseni kazdych 100 us / 8 MHz krystal	
	TIME++;        // inkrementuj počítadlo časovače
	T0IF = 0;      // shoď flag přerušení, aby bylo povoleno další

	if (TIME == ZAPAL1)
	{
		JISKRA1 = PULS;
		RA0 = 0;
	}
	if (JISKRA1 > 0)
	{
		JISKRA1--;
		if (JISKRA1 == 0) RA0 = 1;
	}

	if (TIME == ZAPAL2)
	{
		JISKRA2 = PULS;
		RA1 = 0;
	}
	if (JISKRA2 > 0)
	{
		JISKRA2--;
		if (JISKRA2 == 0) RA1 = 1;
	}

	if (PS1 == RA3) return;

	PS1 = RA3;
	if (PS1 == 1)
	{
		if (TIME < 2000)
		{
			ZAPAL1 = ((TIME*260 - 2220)/256) - PULS;
			ZAPAL2 = ZAPAL1 - (TIME/2);
		}
		else
		{
			JISKRA1 = PULS;
			ZAPAL1 = TIME - PULS;
			ZAPAL2 = TIME/2 - PULS; 
		}
		
		RB0 = TIME > 600;    // 1000 rpm
		RB1 = TIME > 300;    // 2000 rpm
		RB2 = TIME > 200;    // 3000 rpm
		RB3 = TIME > 150;    // 4000 rpm
		RB4 = TIME > 120;    // 5000 rpm
		RB5 = TIME > 100;    // 6000 rpm
		RB6 = TIME > 86;     // 7000 rpm
		RB7 = TIME > 75;     // 8000 rpm
		
		TIME = 0;
	}
}

main()
{
	__CONFIG (HS);
	T0CS = 0;        // časovač inkrementuje podle oscilátoru
	TRISA = 0xEC;    // Port A bit 0 je výstup
	TRISB = 0;
	T0IE = 1;        // povol přerušení při přetečení TMR0
	GIE = 1;         // globální povolení přerušení
	PS = RA3;
	JISKRA1 = -1;
	JISKRA2 = 0;
	ZAPAL1 = 0;
	ZAPAL2 = 0;
 	TIME = 0;
 	PULS = 30;
	RA0 = 1;
	RA1 = 1;

	for(;;)
		CLRWDT();	    // v klidu čutej do psa
}

Uvedený kód berte s rezervou. Je to zatím pracovní verze. Využívá jenom jeden vstup a pulsu pro druhý válec generuje v polovině intervalu mezi pulsy pro první válec. Nevím, jak bude motor chytat. Předstih je vypočítáván jednoduchou funkcí. Procesorem řízená zapalování, která se dají koupit, obvykle berou průběh předstihu z tabulky, takže do nich lze naprogramovat libovolný průběh.


Funkci zapalování jsem vyzkoušel zatím jenom laboratorně, pomocí generátoru a osciloskopu. V reálu jsem ho ještě nenasadil. Máme ve stodole jednu částečně rozebranou Jawu 350 a čekáme, až P15/2 trochu povyroste, aby si jí dal dohromady a jezdil na ní za vesnicí po poli.


Otáčkoměr

budík

Pro zobrazení otáček jsme použili starý budík s kontrolkami ze Škody 120. Budík je nerozebíratelný, takže ho musíme rozebírat opatrně. Tady je ukázka, jak jsme do budíku integrovali otáčkoměr s ostatními kontrolkami (obrázek má rozlišení 600 dpi).

Na zadní stranu budíku jsme upevnili napájecí konektor z PC ATX mainboardu - to se jeví jako vhodné mechanické řešení pro napojení kabelů. Místo žárovek jsou použity vysokosvítící diody.

P15/1, K15 - prosinec 2006, naposledy aktualizováno: leden 2024