INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Drehzahlmessung mit TLE4906
27.03.2016, 13:48
Beitrag #1
Drehzahlmessung mit TLE4906
Hallo,

mache gerade Eine Drehzahlmessung einer Welle und nutze den TLE 4905.
bekomme leider immer nur ne 0 ausgegeben egal ob ich einen magneten davor halte oder nicht.
hab alles probiert was in meiner macht steht.
kann vielleicht jemand mal über den Code schauen, damit ich eins nach dem anderen auschließen kann

Code:
#define Eingang 2                             // Drehzahl-Eingang: Pin2 / Interrupt 0
#define AVG 8                                 // runden über 8 Werte                                
#define REFRESH 20                         // Wert wird alle 1000ms geholt

#define SENSORS 1                             //  Impulse pro Umdrehung

// Variablen
uint32_t last=0;                              // Zählerwert beim letzten Interrupt
uint16_t rra[AVG];                            // Array für rolling Average
uint8_t ptr=0;                                // Array Pointer
volatile int32_t prep=0;                      // Avg prep
volatile uint8_t cnt=0;                       // Avg count
volatile uint16_t drehzahl=0;                 // selbstredend
volatile uint16_t timeout=10;                 // dynamic timeout
volatile uint16_t wdog=10;                    // um Stillstand zu erkennen
char buf[18];                                 // Pufferstring für sprintf



void setup() {
  Serial.begin(9600);
  pinMode(Eingang, INPUT);                    // Eingangspin auf Eingang stellen
  digitalWrite(Eingang, HIGH);                // und Pullup-Widerstand einschalten


  attachInterrupt(0, readmicros, FALLING);    // Interrupt 0 auf Routine readmicros setzen
}

void loop() {  

  // Hauptprogramm
  if (wdog <= timeout) {                      // dynamic timeout
    wdog++;
  } else {
    cli();                                    // kein Impuls erhalten
    drehzahl = 0;                             // alle Werte auf 0
    cnt = 0;
    prep = 0;
    last = 0;
    sei();
  }
  drehzahl = myround(drehzahl);               // runden auf 5 / 10 / 50 / 100 - optional
  sprintf(buf, "%5u ", drehzahl);             // als 5stellig formatierte Zahl in den Puffer

  Serial.println(buf);
  
  delay(REFRESH);                             // etwas warten
}

void readmicros() {                           // Interrupt-Routine
  uint32_t m, dur;
  uint16_t rpm;
  m = micros();                               // Microsekundenzähler auslesen
  dur = m - last;                             // Differenz zum letzten Durchlauf berechnen
  if (dur > 5000L) {                          // plausibel? Drehzahl bis max 12000 U/min
    if (last > 0) {                           // ersten Messzyklus ignorieren
      rpm = (60000000L / SENSORS) / dur;      // Drehzahl ausrechnen
      if (cnt < AVG) {                        // |
        cnt++;                                // |
      } else {                                // |
        prep -= rra[ptr];                     // |
      }                                       // | rolling Average
      rra[ptr++] = rpm;                       // |
      prep += rpm;                            // |
      ptr %= AVG;                             // |
      drehzahl = prep / cnt;                  // |
    }
    last = m;                                 // letzten Wert merken
    timeout = dur / (REFRESH * 500L);         // timeout nach 2 fehlenden Impulsen
  }
  wdog = 0;                                   // timeout watchdog
}

uint16_t myround(uint16_t value) {            // Gewichtete Rundung
  uint16_t rto;
  if (value > 10000) {                        // Rundungswert bestimmen  
    rto = 100;
  } else if (value > 3000) {
    rto = 50;
  } else if (value > 500) {
    rto = 10;
  } else if (value > 100) {
    rto = 5;
  } else {
    return (value);
  }
  return (_myround(value, rto));
}

uint16_t _myround(uint16_t value, uint8_t roundto) { // Rundung Hilfsroutine
  value += (roundto >> 1);                    // halben roundto Wert addieren
  value /= roundto;                           // integer division  
  value *= roundto;                           // integer multiplikation
  return (value);
}

Frohe Ostern!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.03.2016, 14:15
Beitrag #2
RE: Drehzahlmessung mit TLE4906
Hallo,

wenn du keinen externen Pullup-Widerstand verbaut hast, ändere
Code:
pinMode(Eingang, INPUT);                    // Eingangspin auf Eingang stellen
mal nach
Code:
pinMode(Eingang, INPUT_PULLUP);                    // Eingangspin auf Eingang stellen
Der TLE 4905 hat einen Open-Kollektor-Ausgang und der liefert selbst keine Spannung.

Den Code habe ich mir erst mal nicht weiter angeschaut, weil es vermutlich ein Hardwareproblem ist.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.03.2016, 14:31 (Dieser Beitrag wurde zuletzt bearbeitet: 27.03.2016 15:03 von Kai H..)
Beitrag #3
RE: Drehzahlmessung mit TLE4906
keine Änderung

hab gerade gesehen das es ein 4905L ist
macht das nen unterschied für den Code?

Gruß

//edit

ein Pin hatte kein kontakt mit dem steckbrett
bekomme jetzt werte wenn ich nen magneten drannhalte
mache erstmal weiter

danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.03.2016, 12:44
Beitrag #4
RE: Drehzahlmessung mit TLE4906
Für den TLE4905L gilt das gleiche wie für den TLE4906.
Hast du mal in das Datenblatt geschaut?

Ansonsten kann ich nur empfehlen testweise eine Ausgabe zum SerialMonitor in das Programm zu schreiben woran du den Eingangspegel von "Eingang" ablesen kannst.
Dann siehst du erst mal ob der Eingang überhaupt richtig gelesen wird wenn der Sensor schaltet.
Solch kleine Hilfen können sehr nützlich bei der Fehlersuche sein.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Question Drehzahlmessung entkoppeln / entstören? skibby 0 271 29.03.2016 08:28
Letzter Beitrag: skibby

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste