Das originale Vorglührelais im Bus war anfangs gar nicht angeschlossen, als ich es dann mit einem T4-Sensor (um zusätzlich einen Schaltkontakt für die Zusatzwasserpumpe zu haben) verbunden hatte, stimmten die Zeiten vorne und hinten nicht, keine Ahnung, ob die Kennlinie unterschiedlich ist oder das Relais einen weg hat.
Also habe ich auf Verdacht ein billiges Nachbauteil gekauft, mit dem ernüchternden Ergebnis, dass dieses die Motortemperatur gar nicht richtig auswertet.
Glück im Unglück: Die Platine ist eine gute Basis, um einen Mikrocontroller reinzubauen.
Also habe ich mir ein paar Attiny85-Platinchen ( http://www.ih-bäh.de/itm/Digispark-Gene ... 2606517644 ) bestellt und ein Programm geschrieben:
Code: Alles auswählen
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
uint16_t messung(void);
uint32_t u_r;
uint16_t R;
uint16_t r;
char nachgl;
uint8_t dir, val;
volatile uint16_t countdown, cnt; //Countdownzeit in ms
uint8_t vgg, ngg, temp; //Status: vorgeglüht, nachgeglüht, Motor warm
int main(void)
{
//PB0 Relais
//PB1 Anzeige OC0B
//PB2 ADC
//PB3 Klemme 50
//ADC initialisieren
ADMUX=((0<<REFS0)|(0<<REFS1)|(0<<REFS2)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0));
ADCSRA=((1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(1<<ADPS0));
//GPIOs initialisieren
DDRB=((0<<DDB5)|(0<<DDB4)|(0<<DDB3)|(0<<DDB2)|(1<<DDB1)|(1<<DDB0));
//Timer Initialisieren
GTCCR=((0<<TSM)|(0<<PWM1B)|(0<<COM1B1)|(0<<COM1B0)|(0<<FOC1B)|(0<<FOC1A)|(0<<PSR1)|(0<<PSR0));
TCCR0A=((0<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0)|(0<<WGM01)|(1<<WGM00));
TCCR0B=((0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00));
TIMSK|=(1<<OCIE1A);//(1<<TOIE1);
TCCR1=(1<<CTC1)|(0<<PWM1A)|(0<<COM0A1)|(0<<COM1A0)|(1<<CS13)|(1<<CS12)|(0<<CS11)|(1<<CS10);
OCR1C = 1;
sei();
u_r=messung();
r=(255-u_r);
R=((u_r*1000)/r);
if(cnt==0)
{
if(R>2000) cnt=20000; //Zuordnung Widerstand-> Vorglühzeit
else if(R>1000) cnt=9000;
else if(R>500) cnt=7000;
else if(R>300) cnt=1000;
else if(R<300)
{
cnt= 1;
temp=1; //Motor ist warm genug
}
}
while (1)
{
if (temp==0)
{
if (vgg==0)
{
vgg=1; //Vorglühvorgang gestartet
countdown=cnt;//Countdown laden
OCR0B=255;//Vorglühkontrollleuchte an
}
else if ((vgg==1)&(ngg==0)&(countdown==0))
{
OCR0B=0;//Vorglühkontrollleuchte aus
countdown=5000;//...aber noch ein bisschen Zeit lassen, um den Motor zu starten
vgg=2; //jetzt wird bis zum drehenden Anlasser nicht mehr vorgeglüht
}
if (PINB & (1 << PB3)) //egal was ist, wenn der Anlasser dreht, wird noch mal vorgeglüht
{
vgg=3;
countdown=10000;
ngg=0;
}
if(((PINB & (1 << PB3))==0)&(ngg==0)&(vgg==3)) //Anlasser wieder aus? Dann läuft der Motor wohl, und es kann nachgeglüht werden
{
countdown=0;
ngg=1; //Thema Nachglühen ist gleich abgehakt
countdown=6000; //nachglühen
}
}
}
}
ISR(TIMER1_COMPA_vect) {
if((countdown>0)&(ngg==1))
{
if(dir==0)
{
if (val<250) val=val+1;
else dir=1;
}
else if (dir==1)
{
if (val>0) val=val-1;
else dir=0;
}
OCR0B=val;
}
if(countdown>0)
{
countdown--;
PORTB|=(1<<PB0);//Relais an
}
else if(countdown==0)
{
PORTB&=~(1<<PB0);//Relais aus
OCR0B=0;
}
}
uint16_t messung(void)
{
uint16_t adc_s;
int sample_loop;
adc_s=0;
for (sample_loop=16; sample_loop > 0 ; sample_loop --)
{
ADCSRA |= (1 << ADSC); // start ADC measurement
while (ADCSRA & (1 << ADSC) ); // wait till conversion complete
adc_s+=ADCH;
}
return (adc_s>>4);
}
Der ADC erfasst bevor die Glühkerzen eingeschaltet werden den Widerstandswert - um die Störsicherheit zu erhöhen, werden 16 Werte aufsummiert und durch 16 geteilt.
Da die Kühlwassertemperatur ja sehr träge ist, wird sie nur einmal pro Einschaltzyklus ausgewertet.
Danach regelt eine state machine den weiteren Ablauf:
-Es wird einmal temperaturabhängig vorgeglüht, dann geht die Kontrollleuchte aus, der Countdown wird aber noch einmal aufgestockt, damit man den Motor noch gestartet bekommt.
-Sobald der Anlasser dreht, wird auch weiter vorgeglüht.
-Wenn der Anlasser wieder steht, läuft der Motor wahrscheinlich, daher beginnt die Nachglühphase und die Vorglühkontrolle wird abwechselnd heller und dunkler, bis diese Zeit abgelaufen ist.
Als nächstes Zwischendurchprojekt erwäge ich, die räudige Kühlwassermangelanzeige in besser nachzubauen.