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
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
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.
|