Tacho inlezen en puls regelen

Goedenmiddag allemaal,

Voor een klein project voor mijn schoonvader bots ik op de volgende problemen, ik ben bezig om zijn defecte toerenteller meter uit zijn auto te vervangen voor een digitale versie.
Nu heb ik de meter al vervangen door een digitaal exemplaar en het piekvormige signaal afkomstig uit de sensor (lijkt op driehoek) omgezet met een Schmitt-trigger in een nette blokgolf.
Maximale frequentie gemeten met oscilloscoop is ~100 hz bij 200 mVpp, waar ik dus niets aan had voor de digitale versie, vandaar de Schmitt trigger
Super mooi ingangssignaal gecreëerd voor de digitale toerenteller, echter maar de helft van de aangegeven waarde bij vol gas, nu heb ik een arduino beetle ertussen geknoopt en probeer met de volgende sketch het toerental aan te passen, echter lukt dat niet zoals ik wil.
Waarschijnlijk is er een veel betere manier (van sketch) toepasbaar, echter kom ik er niet meer uit.
Zie hieronder de sketch.

const int tacho = 9;  // ingang tacho signaal
const int uitgang = 11;    // uitgang naar Smitt trigger, daarna naar RPM
int signaal = 0;

void setup () {
pinMode (uitgang, OUTPUT);
pinMode (tacho, INPUT);

}
void loop() {
  // leest waarde tacho
  signaal = digitalRead(tacho); 
  if (signaal == HIGH) {
   
    digitalWrite(uitgang, HIGH);
    delay(1);
    digitalWrite(uitgang, LOW);
    delay(1);
    
  } else {
    digitalWrite(uitgang, LOW);
  }
}

Met deze sketch heb ik op de oscilloscoop het signaal precies omgekeerd zoals ik het wil hebben, de puls is langer geworden, ik wil graag bij 1 puls, twee pulsen of meer kunnen genereren, wie heeft er a.u.b. een idee?

Met vriendelijke groet,
Dreamload.

Probeer deze variant eens


const int tacho = 9;       // ingang tacho signaal
const int uitgang = 11;    // uitgang naar Smitt trigger, daarna naar RPM

const int multiplier = 1;        //  aantal pulsen 2,3, ... 10


void setup ()
{
  pinMode (uitgang, OUTPUT);
  pinMode (tacho, INPUT);
}

void loop() 
{
  // leest waarde tacho
  int signaal = digitalRead(tacho); 

  if (signaal == HIGH)
  {
    for (int i = 0; i < multiplier; i++)
    {
      digitalWrite(uitgang, HIGH);
      delayMicroseconds(1000  / multiplier);
      digitalWrite(uitgang, LOW);
      delayMicroseconds(1000 / multiplier);
    }
  } 
  else 
  {
    digitalWrite(uitgang, LOW);
  }
}

Dankjewel, ga ik gelijk uitvoeren.

Super bedankt, het werkt en heb ik weer wat geleerd.
delayMicroseconds heb ik op 10000 gezet, wat overeenkomt met 2 pulsen bij 1 ingangspuls.

Met vriendelijke groet,
Dreamload.

Een non blocking variant (geen delay)

  • met print statements voor debugging
  • met variabele multiplier (float)
#include "Arduino.h"

const int tacho = 9;       // ingang tacho signaal
const int uitgang = 13;    // uitgang naar Smitt trigger, daarna naar RPM

//  INPUT VARS
int signal;
int lastSignal = HIGH;
uint32_t lastHigh = 0;

float multiplier = 5.0

//  OUTPUT VARS
uint32_t lastPulse = 0;
uint32_t outputInterval = 0;


void setup ()
{
  //  Serial.begin(115200);
  pinMode (uitgang, OUTPUT);
  pinMode (tacho, INPUT);
}

void loop()
{
  //  take timestamp for this loop
  uint32_t now = micros();

  //  determine input frequency by measuring between
  //  RISING edge of HIGH pulses
  signal = digitalRead(tacho);
  if ((signal == HIGH) && (lastSignal == LOW))
  {
    uint32_t inputInterval = now - lastHigh;
    outputInterval = inputInterval / multiplier / 2;
    lastHigh = now;  //  remember begin of last pulse

    //  Serial.println(inputInterval);
    //  Serial.println(outputInterval);
    //  Serial.println();
  }
  lastSignal = signal;

  //  generate output signal if not 0.
  if (outputInterval > 0)
  {
    if ((now - lastPulse) >= outputInterval)
    {
      //  remember last invert output
      lastPulse = now;
      //  invert output
      digitalWrite(uitgang, !digitalRead(uitgang));
    }
  }
}


//  -- END OF FILE --

wat bij deze laatste nog ontbreekt is het expliciet op nul zetten

Nu met auto reset als er geen input pulse is,


#include "Arduino.h"

const int tacho = 9;       // ingang tacho signaal
const int uitgang = 13;    // uitgang naar Smitt trigger, daarna naar RPM

//  INPUT VARS
int signal;
int lastSignal = HIGH;
uint32_t lastHigh = 0;

int multiplier = 5;        //  2,3, etc

//  OUTPUT VARS
uint32_t lastPulse = 0;
uint32_t outputInterval = 0;


void setup ()
{
  Serial.begin(115200);
  pinMode (uitgang, OUTPUT);
  pinMode (tacho, INPUT);
}

void loop()
{
  //  take timestamp for this loop
  uint32_t now = millis();

  //  determine input frequency by measuring between
  //  RISING edge of HIGH pulses
  signal = digitalRead(tacho);
  if ((signal == HIGH) && (lastSignal == LOW))
  {
    uint32_t inputInterval = now - lastHigh;
    outputInterval = inputInterval / multiplier / 2;
    lastHigh = now;  //  remember begin of last pulse

    Serial.println(inputInterval);
    Serial.println(outputInterval);
    Serial.println();
  }
  lastSignal = signal;

  //  generate output signal
  if (outputInterval > 0)
  {
    if ((now - lastPulse) >= outputInterval)
    {
      //  remember last invert output
      lastPulse = now;
      //  invert output
      digitalWrite(uitgang, !digitalRead(uitgang));
    }
  }

  //  switch to zero if no input pulse for 5 seconds
  if (now - lastHigh > 5000)
  {
    outputInterval = 0;
  }
}

Inderdaad toch proberen met een nadere oplossing, de tacho liep in het begin mooi op met eerste voorbeeld, maar begon te denderen na het verlagen van de inpuls.
Ik ga gelijk even testen, alsnog super bedankt voor de te nemen moeite.

Loopt als een zonnetje, perfect gedaan en mijn dank hiervoor.
Met vriendelijke groet,
Dreamload.

Foto?


Ik zie geen Beetle (dat is natuurlijk ook de bedoeling), wel een (vermoedelijk) Uno clone in een hoekje op het eerste plaatje.
Een Beetle is geen Uno maar een minimalistische Leonardo variant.

Functiegenerator en oscilloscoop zijn handige hulpmiddelen.
Nu nog het werkelijke signaal uit de auto testen, of is dat inmiddels ook al geschied ?

Het klopt dat je geen Beetle ziet, die heb ik eraf gehaald en een ander exemplaar (micro) geplaatst, ook dit is niet op foto te zien, de Beetle had ik net gekocht voor een ander project.
Probleem waar ik ook in het begin op stuitte was het uitgangssignaal van een (Chinese versie) die niet helemaal blokvormig was, ook dat gaf uiteindelijk problemen.
De originele Beetle gaf een strak uitgangssignaal.
Het werkelijke signaal uit de auto had ik al een paar maanden geleden getest
Zie hieronder het signaal: stationair, half gas, vol gas.



Foto 2 is stationair, 1 is middel, 3 is vol

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.