ECU- styrning till en VW pumpdysediesel.

Berätta om dina pågående projekt.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Bosen »

Genom att köra ditt program som du gör nu så finns det så oroligt stora risker för fel vilket gör det väldigt svårt att felsöka. T.ex anledningen att du har fått steloperera svänghjulet tror jag beror på att du hamnar några kuggar fel under uppstart. Eftersom det är så många saker som skall köras igenom innan det felet kan rättas till så klarar motorn helt enkelt inte att starta. Om du kör interrupt som räknar, så kommer du få med ALLA pulser ALLTID, vilket tar bort väldigt många felkällor. du kan även samla ihop dina avläsningar av ingångar på ett sätt som gör att du läser in dom OM du har tid, om det inte finns möjlighet tidsmässigt så läser du inte in dom just då.
Du har så otroligt mycket att tjäna på i detta projektet med interrupt så jag kan inte förstå varför du hela tiden försöker måla in dig i ett hörn.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Ja det är ju tusan att jag är så dålig på att programmera... Annars hade jag väl slängt ihop nåt för länge sedan. Men jag har lite börjat med att tänka om, men det är inte interrupt i sig som är största problemet utan tack vare just pulseIn så gör processorn det den skall göra en gång och väntar sedan på nästa grej osv. Det vill jag och förmodligen måste göra så vidare även utan pulseIn men med interrupt.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Ja nu har jag börjat titta på interrupt och vad allt som följer med... Jag har börjat med bosens kod på sid 23 i denna tråd och lagt in den för en första test/utvärdering. (jag måste lära känna koden för att förstå den) Jag antar at jag kan ha kvar ganska mycket från min gamla kod men måste göra om insprutningsmodulen fullständigt, ta bort delay, delaymicros, och inte ha den låst till tand 16 (case 16) Jag antar att delayer måste bort för gott?
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Bosen »

Ja, delay ska du fösöka hålla dig ifrån. Varje gång du använder en "delay" så "stoppar" du processorn. Det vill säga att (i ditt program som du har nu) när du ligger i en "delay" så kan inte processorn använda PulseIn. Skulle det råka komma en tand just då så räknas inte den. Med interrupt så kommer tanden räknas oavsett var i programmet du ligger.
Du har alltså två felkällor i ditt nuvarande program:
1. Antagligen missar du vissa pulser på grund av att du inte kör ingången på interrupt.
2. Du använder delay som gör att du inte utnyttjar processorn med att köra annat samtidigt som du väntar.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Jahopp, nu har jag tagit steget till att bygga ett nytt program, kanske inte för att jag behöver det men jag kan nog ändå inte låta bli...
Och sen har jag två program, ett med interuptstyrning och ett utan så kan jag ju sen jämföra via ECU A/B.
En första snutt är nu löst, att räkna dom 28 tänderna och att hitta luckan. Jag har både satt lysdiod och använder Serial.print så jag verkligen se att rätt sak händer. Bosen: Jag har tagit din kod som en första starter men fick ändra jättemycket innan det blev någon funktion alls, men sen...
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Bosen »

Ja, koden va absolut inte testad utan jag bara drog den rakt från huvudet :D
...men ladda gärna upp den ändrade koden här så vi ser vad du kör med.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Ok, koden nästan utan kommentarer. Själva interruptet fungerar nog och tänder/släcker en lysdiod vid tandluckan. (tror jag)
Tandräknaren fungerar (tror jag med...)
Nu vill jag få motorns duration per tand baserat på en lucka plus 7 tänder tillsammans, där skiter det sig... Vid 12 som borde vara i närheten så blir det alldeles för höga tal, speciellt på riktigt låga varv. Dom blir typ 84000 uS, borde varit ca 4000 uS
Där måste jag felsöka vidare...

Kod: Markera allt

int inpin = 2;
int utpin = 10;
unsigned long VEVTAND_langd;
unsigned long VEVTAND_start;
unsigned long delvalue = 0;
int tand = 0;
unsigned long prev_langd;
unsigned long mduration;


void setup() 
{
 pinMode(inpin, INPUT);
 attachInterrupt(digitalPinToInterrupt(inpin), VEV_pulse, RISING);
 pinMode(utpin, OUTPUT);
 Serial.begin(250000);
}

void loop() 
 {
  Serial.println(mduration);
  
  switch (tand)
  {
   case 1: 
   
   delvalue = VEVTAND_langd;
   break;

   case 2:
   delvalue = VEVTAND_langd + 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;
   break;

  case 8:
  mduration = VEVTAND_langd + delvalue;
  mduration = mduration/16;
  break;
  
  case 9:
 
  break;
  
  }
 
// Serial.println(mduration);
 }

 void VEV_pulse()
 {
  prev_langd = VEVTAND_langd;
  VEVTAND_langd = micros()-VEVTAND_start; //Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  VEVTAND_start = micros();  //Börja mätning av lucka
 tand++;
  
   if(VEVTAND_langd > prev_langd +150)
   {
    digitalWrite(utpin, HIGH);
    tand = 1;
   }
  if(VEVTAND_langd < prev_langd -150)
  {
   digitalWrite(utpin, LOW);
  }
 }


 
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Klas-Kenny »

Prova med någonting så enkelt som att sätta volatile på tand och VEVTAND_langd.
Du bör använda volatile på alla globala variabler, som används i interrupt.

Annars kan det mycket väl bli så att kompilatorn optimerar bort läsningar av den variabeln, eftersom att koden inte någonstans ändrat på den variabeln (i main-loopen...) utan förutsätter att den är oförändrad. Då kan man få alla möjliga konstiga fel.


Sen gäller det alltid att hålla tungan rätt i mun i övrigt också, när det gäller dessa variabler.
Till exempel så kan du i ditt program komma i läget att programmet snurrar i loopen, och så är tand==8. Den går in där i switch-satsen, men sen innan den hinner exekvera nästa kodrad mduration = VEVTAND_langd + delvalue; så kommer interruptet. Då kommer VEVTAND_langd att ha skrivits över med ny data, för nästa tand. Men kopplas samman med den förra i programmet.

Finns en rad olika sätt att komma runt det problemet, beroende på omständigheterna..
Tex. sätta en flagga för "ny data" i interruptet, som kollas och nollställs i main-loopen före och efter läsning, eller att helt grovt temporärt inaktivera interruptet medan man läser data.



En annan liten detalj, du läser micros() två gånger i interruptet. Det är ju lite dumt om man vill ha riktig precision. Bättre är att tex göra

Kod: Markera allt

 void VEV_pulse()
 {
  unsigned long current_micros = micros();
  prev_langd = VEVTAND_langd;
  VEVTAND_langd = current_micros-VEVTAND_start; //Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  VEVTAND_start = current_micros;  //Börja mätning av lucka
 tand++;
Det allra bästa vore att använda input capture i hårdvara, om Arduino har och stödjer detta. Då sparas automatiskt timervärde ner någonstans exakt vid flanken, sen gör det inget om det tar en liten stund innan interruptet sker (om man tex. inaktiverar det, eller har flera interrupt där något annat har högre eller samma prioritet). Eller om man då rent av skiter i interrupt för just den funktionen utan pollar capture-modulen istället.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Klas-Kenny: Ja det är en bra iakttagelse med två Micros istället för att bara använda det en gång. Nu verkar hela denna VEV_pulse del fungera, jag har oscilliskopsmätt, och det funkar alldeles utmärkt, så här är PulseIn() ersatt. Jag trodde jag förstod problemet varför den räknar fel på låga varv, men egentligen borde det bli samma fel på höga varv? Jag har mätt med skopet samtidigt och det stämmer exakt på höga varv men visar många gånger fel på låga varv...
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Jag tror mig veta varför det blir fel på tidsräkningen. På Fullvarv så läser den case 1 en gång, case 2 en gång, case 3 en gång osv, det är vad den hinner. Men på lägre varv hinner den läsa case 1 två till tio gånger case 2 två till tio gånger osv och den plussar ihop hela skiten så ju mindre, inte mindre, mer tid processorn får att läsa ju mer fel blir totalsumman... Det måste göras på et bättre sätt men hur? egentligen vill jag bara ha räkna varje case en gång per tand om den hinner räkna fler gånger skall resultatet inte plussas.
Edit: både felstavning och fel: mindre skall vara mer!
Senast redigerad av Janson1 23 november 2018, 15:51:22, redigerad totalt 1 gång.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Bosen »

Janson1 skrev: Nu vill jag få motorns duration per tand baserat på en lucka plus 7 tänder tillsammans, där skiter det sig... Vid 12 som borde vara i närheten så blir det alldeles för höga tal, speciellt på riktigt låga varv.
Vad menar du med motorns duration?
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av mrfrenzy »

I interruptrutinen sätter du flag=1
I dina case kör du bara om flag=1 och sen resetta till flag=0.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Janson1 »

Bosen: Duration är den tid varje tand tar i tid att passera, (det är jag som döpt det så) sen lägger jag ihop x antal tänder och dividerar sen i det antalet och får därmed en medeltid per tand, duration.
mrfrenzy: Jag förstår att det går lätt att avhjälpa med en flag men jag har ingen aning om hur, har du möjlighet att ge en liten hint?
Det finns ju en kopia på mitt försöksalster...
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av Bosen »

Hmm... varför just 7 tänder. Medel på 3 tänder borde ju räcka?
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: ECU- styrning till en VW pumpdysediesel.

Inlägg av mrfrenzy »

Typ såhär:

Kod: Markera allt

void loop() 
 {
  Serial.println(mduration);
  
  switch (tand)
  {
   case 1:
   if(flag == 1)
   {
     delvalue = VEVTAND_langd;
     flag = +0; 
   }   
   break;

...


 void VEV_pulse()
 {
  flag = 1;
  prev_langd = VEVTAND_langd;
  VEVTAND_langd = micros()-VEVTAND_start; //Längden på nuvarande lucka hamnar i variabeln VEVTAND_langd
  VEVTAND_start = micros();  //Börja mätning av lucka
 tand++;
  
   if(VEVTAND_langd > prev_langd +150)
   {
    digitalWrite(utpin, HIGH);
    tand = 1;
   }
  if(VEVTAND_langd < prev_langd -150)
  {
   digitalWrite(utpin, LOW);
  }
 }
Kan du ladda upp koden för din simulator så man kan labba lite "live"?
Skriv svar