Arduino kontroller lisapihusti juhtimiseks

Tehnilised probleemid, küsimused ja lahendused.

Moderaatorid: Mihkel, Ringo

Vasta
kruvi
Postitusi: 2
Liitunud: 06.10.2012 12:11

Arduino kontroller lisapihusti juhtimiseks

Postitus Postitas kruvi »

Tere

Kuna tootjapoolseid lisapihusti kontrollereid liigub vähe või ei oska hästi otsida, siis on tekkinud mõte Arduino kontrollerist see ise teha.
Antud kontrolleriga lisapihusti juhtimist on mainitud põgusalt ka siin foorumis, kuid selle nö ehitusest vähe.
Seega äkki keegi leiab aega ja veidi tutvustaks, juhendaks ja suunaks, milliseid komponente kasutada ja milline kood sisestada, et kontroller toimiks selliselt: Läbi MAP-anduri saadud signaali tulemusel on võimalik reguleerida pihusti avanemist ja seda kuni 0,5 bar ülerõhuni (võib ka rohkem). Ehk siis näiteks 0,1 bar juures on pihusti avatud 20 % , 0,2 korral 40% jne. Kontroller peaks vajadusel suutma juhtida rohkem kui ühte pihustit ning toimima kõrgeoomiste pihustitega.

Igasugune abi on teretulnud!
PS: Kui kellegil pakkuda juba toimivat terviklahendust, siis olen avatud ka neile.
Kasutaja avatar
murjam
Postitusi: 689
Liitunud: 16.03.2008 13:01
Asukoht: Tallinn
Kontakt:

Re: Arduino kontroller lisapihusti juhtimiseks

Postitus Postitas murjam »

Kui valida lisapihusti kõrge takistusega, on selle juhtimine lihtsam - ei pea kasutama voolu piiramiseks PWM-i, vaid saab lihtsalt pihusti avada. Pihusti avamiseks sobib sisuliselt mistahes transistor/fet, mis kannatab piisavat voolutugevust.

Võimaliku Arduino koodi osas oskan anda paar soovitust:
* implementeeri pöörete lugemine protsessori katkestustega (interrupt, https://www.arduino.cc/reference/en/lan ... interrupt/)
* vastavalt pöörete ja rõhu väärtusele arvuta vajalik pihusti avatuse aeg või %.
* loop() funktsiooni sees ära ühtki delay-d tee ning iga tsükliga arvuta, kas pihusti on vaja avada või sulgeda. Aja arvutusteks kasuta nt micros() funktsiooni

Visandan näitekoodi - läksin natuke hoogu :). Toimimist pole katsetanud:

Kood: Vali kõik

const byte RPM_INPUT_PIN = 2; // nt tahhomeetri väljund, Arduino sisend pin
const byte MAP_PIN = A0; // MAP sisend pin, saab otse 0-5V ühendada
const byte INJECTOR_PIN = 3; // pihusti väljundpin, millele on lisatud jõu-transistor (fet)

const int TIME_FRAME = 20000; // tsükkel mikrosekundites, mille vältel toimub 1x pulseerimine. kui pihusti pole silindritest kaugel, peaks seda väärtust dünaamiliselt pööretega muutma
const double MAP_0V = 20; // kPa väärtus 0V juures
const doulbe MAP_5V = 250; // kPa väärtus 5V juures

const int TABLE_SIZE = 5; // tabeli suurus
// pihusti avatuse tabel protsentides RPM/MAP
const int INJECTOR_OPEN_TABLE[6][6] = {
  {   0,    0, 3000, 4000, 5000, 6000 }, // esimene rida on pöörded, esimene veerg MAP
  {   0,    0,    0,    0,    0,    0 }, 
  { 110,   10,   15,   20,   25,   30 }, 
  { 130,   20,   28,   38,   45,   50 },
  { 150,   35,   45,   58,   65,   75 }, 
  { 180,   50,   65,   72,   85,  100 }
};

volatile int rpm = 0; // viimatimõõdetud RPM väärtus.
volatile int revCount = 0; // loendab pulsse viimasest RPM arvutamisest
volatile unsigned long lastTime = 0; // viimase RPM arvutamise aeg
bool injectorOpen = false; // pihusti avatuse olek
long changeStateAtMoment = 0L; // pihusti järgmise avamise/sulgemise ajahetk

void setup() {
  pinMode(INJECTOR_PIN, OUTPUT);
  pinMode(MAP_PIN, INPUT);
  pinMode(RPM_INPUT_PIN, INPUT);
  attachInterrupt(RPM_INPUT_PIN, rpmInterrupt, RISING);
}
void rpmInterrupt() {
   revCount++;
   if (revCount == RPM_COUNT_COLLECT) {
      unsigned long thisTime = micros();
      rpm = (double) revCount
            / (((double) thisTime - (double) lastTime) / (double) 60000000);
      revCount = 0;
      lastTime = thisTime;
   }
}
int readMapKpa() {
  int mapRaw = analogRead(MAP_PIN); // 0..1023
  return MAP_0V + ((double) mapRaw / 1024.) * (double)(MAP_5V - MAP_0V);
}
// pihusti avatuse protsent
int getInjectorOpenPercent() {
  int map = readMapKpa();
  int mapIndex = 1;
  int rpmIndex = 1;
  while (mapIndex < TABLE_SIZE - 1 && map > INJECTOR_OPEN_TABLE[mapIndex + 1][0]) {
    mapIndex++;
  }
  while (rpmIndex < TABLE_SIZE - 1 && rpm > INJECTOR_OPEN_TABLE[0][rpmIndex + 1]) {
    rpmIndex++;
  }
  // TODO interpolation
  return INJECTOR_OPEN_TABLE[mapIndex][rpmIndex];
}
void loop() {
  unsigned long moment = micros();
  if (moment > changeStateAtMoment) {
    int openPercent = getInjectorOpenPercent();
    if (injectorOpen) {
      if (openPercent >= 100) {
        // 100+% korral hoia pihusteid lihtsalt lahti
        changeStateAtMoment = moment + TIME_FRAME;
      }
      else {
        // sulgeme pihusti "ülejäänud" timeframe'i ulatuses
        digitalWrite(INJECTOR_PIN, LOW);
        injectorOpen = false;
        changeStateAtMoment = moment + ((double)(100 - openPercent) / 100. * TIME_FRAME);
      }
    }
    else {
      if (openPercent <= 0) {
        // 0% korral ei hakka pihustit avama
        changeStateAtMoment = moment + TIME_FRAME;
      }
      else {
        // avame pihusti ettenähtud ajaks
        digitalWrite(INJECTOR_PIN, HIGH);
        injectorOpen = true;
        changeStateAtMoment = moment + ((double)(openPercent) / 100. * TIME_FRAME);
      }
    }
  }
}
Lauda nitro
m6nge
Postitusi: 23
Liitunud: 05.11.2014 15:29

Re: Arduino kontroller lisapihusti juhtimiseks

Postitus Postitas m6nge »

:D ülinaiss tahaks katsetada seda kohe..
Mangus Media / YOUTUBE
Kasutaja avatar
jeff01
Postitusi: 2829
Liitunud: 29.11.2004 21:48
Asukoht: tartu

Re: Arduino kontroller lisapihusti juhtimiseks

Postitus Postitas jeff01 »

Det3 Piggypack jääb oma 200€ga liiga kalliks? saaksid teha ju veel palju muudki, omaks kasutajatuge jne jne lisad.
DÜNOPINK Tartus 56231442 https://www.facebook.com/WhlsUP/
Pakun ka Megasquirt juhtajusid ning nende paigaldust, ümberehitust ja seadistust.
Vasta