Re: ECU- styrning till en VW pumpdysediesel.
Postat: 27 november 2018, 06:36:37
Min nolla är blå för att jag slår på syntax highlight i forumet, dropdownmenyn "Syntaxmarkera kod" och väljer C. 

Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
const unsigned int hogstavarv = 200; // div konstanta värden
const unsigned int lagstavarv = 1000;
int inpin = 2;
int utpin = 10;
volatile unsigned long VEVTAND_langd;
volatile unsigned long VEVTAND_start;
unsigned long delvalue = 0;
volatile byte tand = 0;
unsigned long prev_langd;
float mduration;
volatile int caseRead;
int gas;
float bduration;
int battvolt;
int sprstartkorr;
float error;
float starttid;
void setup()
{
pinMode(inpin, INPUT); // satt inpin som ingång
attachInterrupt(digitalPinToInterrupt(inpin), VEV_pulse, RISING); // här blir inpin interruptstyrd
pinMode(utpin, OUTPUT); // satt utpin som utgång
Serial.begin(250000); // initsierar serialprintfunktionen på 250000 b/sek
}
void loop()
{
if(caseRead == 1) {
caseRead = 0;
switch (tand) // här startar switch och case, tandräknaren stegar fram ett steg (case)
{
case 1: // Case 1:
delvalue = VEVTAND_langd; // tandluckan läggs in som första delvärde
// gas = analogRead(A0)>>2; // gaspot läses av här, skiftas två gånger (0-255)
// bduration = map(gas, 0, 255, lagstavarv, hogstavarv); // motorns börduration bestäms här (1000-100 uS)
Serial.println(delvalue);
break;
case 2:
delvalue = VEVTAND_langd + delvalue;
//battvolt = analogRead(A7);
//sprstartkorr = map(battvolt, 150, 700, 200, 800);
//sprstartkorr = constrain(sprstartkorr,150,400);
//Serial.println(delvalue);
break;
case 3:
delvalue = VEVTAND_langd + delvalue;
break;
case 4:
delvalue = VEVTAND_langd + delvalue;
break;
case 5:
delvalue = VEVTAND_langd + delvalue;
break;
case 6:
delvalue = VEVTAND_langd + delvalue;
break;
case 7:
delvalue = VEVTAND_langd + delvalue;
//Serial.println(delvalue);
break;
case 8:
mduration = VEVTAND_langd + delvalue;
mduration = mduration/12;
// Serial.println(mduration);
break;
case 16:
error = (mduration / bduration)-1;
if (error <=0.) // om error under noll
{
error = 0.; // förblir error 0 för att ej få minusvärden
}
if(error >=6.)
{
error = 6.;
}
starttid = map(mduration, 2000, 200, 21., 17.);
//starttid =constrain(starttid, 17,21);
//Serial.println(mduration);
break;
}
}
//Serial.print(mduration);
//Serial.print(" ");
//Serial.println(starttid);
}
void VEV_pulse() // Den interruptstyrda delaen börjar här
{
long thisLength = micros();
caseRead = 1;
prev_langd = VEVTAND_langd; // nuvarande vevtands längd läggs in som föregående vevtandslängd (döper om)
VEVTAND_langd = thisLength-VEVTAND_start; // Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
VEVTAND_start = thisLength; // Börja mätning av lucka
tand++; // tandräknaren räknar upp en tand
// caseRead = 0; // en "flagga" sätts till 0 = oläst case
//Serial.println(tand);
if(VEVTAND_langd > prev_langd +150) // OM nyaste vevtands längd är längre än föregåendes + 150
{ // då är luckan hittad
digitalWrite(utpin, HIGH); // Då går utpin hög
tand = 1; // och tandräknaren resetas till 1 (början på tandräkningen)
}
if(VEVTAND_langd < prev_langd -150) // OM nyaste vevtands längd är kortare än föregående -150
{ // då är luckan slut
digitalWrite(utpin, LOW); // och utpin blir låg igen.
}
}
Kod: Markera allt
4848
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848
2280
3132
3992
4844
2280
3132
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848
2284
3136
3996
4848
2280
3136
3992
4844
2280
3132
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848
2280
3132
3992
4844
2280
3132
3992
4844
2280
3132
3992
4844
2284
3136
3992
4844
2284
3136
3992
4844
2284
3136
3992
4848
2284
3136
3992
4848
2284
3136
3996
4848