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
Drezahl messen mit Arduino Due
10.12.2018, 10:23
Beitrag #1
Drezahl messen mit Arduino Due
Hallo Forumsmitglieder,

ich steuere mit einem Arduino Due, auf dem mit ein Pololu Dual VNH5019 Motor Driver Shield aufgesteckt ist einen Motor mittels Pulsweitenmodulation (PWM).
Im Moment wir die Geschwindigkeit des Motors über einen Analogeingang bestimmt, der über ein Potentiometer verändert werden kann. Das funktioniert auch einwandfrei.
Nun möchte ich die Drehzahl des Motors am Arduino berechnen und über den Seriellen Monitor ausgeben., später aber an einem OLED-Display. Der Drehzahlbereich liegt zwischen 0- und 6000 Umdrehungen pro Minute und wird über ein Rechteckssignal ausgegeben (eine steigende Flanke pro Umdrehung), dieses triggere ich mit einem Interrupt und berechne dadurch die Frequenz.
Das funktioniert auch, aber die Werte die ausgegeben werden schwanken enorm. Da ich die Drehzahl gleichzeitig mit einem manuellen Drehzahlmesser gemessen habe , weiß ich dass diese Schwankungen am Motor nicht stattfinden. Meine ersten Tests machte ich mit einem Arduino Uno R3, dieser zeigte das gleiche Verhalten. Ich bin nur auf den Due umgestiegen, da dieser leistungsfähiger ist und ich mir eine genauere Drehzahlausgabe erhofft habe. Leider ohne Erfolg.


Hat jemand eine Idee was zu den Schwankungen, selbst bei sehr niedrigen Drehzahlen, führt? (Kann es eventuell am seriellen Monitor liegen?)
Stimmt etwas an meinem Programm nicht?
Sollte ich die Drehzahlauswertung an einem separaten Arduino durchführen? ( Das PWM-Programm funktioniert auch auf einen Arduino Uno R3 ohne Probleme)

Code:
#include "DualVNH5019MotorShield.h"
#include <Arduino.h>//################################################################################​#####
DualVNH5019MotorShield md;


int sensorPin = A5;                 // ANIN EIngang
int sensorValue = 0;                // Variable wert AN-Signal
int sensorValueMap = 0;             // map speed from AN to Motorshield
volatile int count;                 //Flankenzähler
volatile unsigned long Timestamp;   //Zeitstempel
int interruptPin = 3;               //Interruptpin
volatile int f;                     // Frequenz
volatile int rpm;                   // Umdrehungen pro Minute



void stopIfFault()                  // Fehlerausgabe Motorshield
{
  if (md.getM1Fault())
  {
    Serial.println("M1 fault");
    while(1);
  }
}





void setup() {

  Serial.begin(115200);               //Baudrate
  md.init();                          // MOtordriver initialisieren

  
   pinMode(interruptPin, INPUT_PULLUP); //Pinmod einstellungen
   //count = 0;

  //attachInterrupt(3, Drezahl, FALLING);
  attachInterrupt(3, Drezahl, RISING);   //Interrupt declaration
}


void Drezahl(){
  count++;
  
}


void loop() {
  // put your main code here, to run repeatedly:


    sensorValue = analogRead(sensorPin);                    //Geschwindigkeit über AN5 Steuern
    sensorValueMap = map(sensorValue, 0, 1023, 20, 400);    //Geschwindigkeit über AN5 Steuern
    //Serial.println(sensorValueMap);                       //Geschwindigkeit über AN5 Steuern
    md.setM1Speed(sensorValueMap);                          //Geschwindigkeit über AN5 Steuern
    // md.setM1Speed(100);                                  //Geschwindigkeit über AN5 Steuern


   if ( millis()-Timestamp > 1000){                         // Berechnung der FRequenz
     noInterrupts();                                        // Berechnung der FRequenz
     f = (count * long(1000))/ 1000;                        // Berechnung der FRequenz                                                    // Berechnung der FRequenz
     count = 0;                                             // Berechnung der FRequenz
     Timestamp = millis();                                  // Berechnung der FRequenz
     Serial.print("Drezahl RPM: ");                         // Berechnung der FRequenz
     Serial.println(f);                                     // Berechnung der FRequenz
     interrupts();                                          // Berechnung der FRequenz
   }  

}


Danke im Voraus für eure Hilfe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2018, 15:08 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2018 15:09 von Franz54.)
Beitrag #2
RE: Drezahl messen mit Arduino Due
(10.12.2018 10:23)Idefix schrieb:  Der Drehzahlbereich liegt zwischen 0- und 6000 Umdrehungen pro Minute und wird über ein Rechteckssignal ausgegeben (eine steigende Flanke pro Umdrehung),

Mit welchen Sensor wird die Drehzahl festgestellt und das Rechtecksignal ausgegeben?

https://www.youtube.com/watch?v=Fnzn85oWM_Q
Hier was zum Thema Deutsche Politik Angry
Und hier zum Thema richtige Politik Big Grin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2018, 15:56
Beitrag #3
RE: Drezahl messen mit Arduino Due
(10.12.2018 10:23)Idefix schrieb:  Das funktioniert auch, aber die Werte die ausgegeben werden schwanken enorm.
Was verstehst Du unter schwankt enorm? Kannst Du das in Zahlen ausdrücken?
Was verwendest Du als Geber? Ist dessen Signal bei konstanter Drehzahl konstant? Evtl. mit Oszi kontrollieren.

Wenn schon die Abtastung Mist ist, kann der beste Rechner nichts vernünftiges draus machen (höchstens Mittelwerte bilden)

Verwende lieber
Code:
attachInterrupt(digitalPinToInterrupt(3),Drezahl, RISING);
und die reale Differenz zwischen millis und Timestamp und mache die Interruptfreie Zone kürzer:

Code:
uint32_t aktMillis, oldTmst, diff;
   int tmpCount;
   if ( aktMillis()-Timestamp >= 1000){                         // Berechnung der FRequenz
     noInterrupts();                                        // Berechnung der FRequenz
     tmpCount = count;
     oldTmst = Timestamp;
     count = 0;                                             // Berechnung der FRequenz
     Timestamp = aktMillis;                                  // Berechnung der FRequenz
     interrupts();                                          // Berechnung der FRequenz
     diff = aktMillis - oldTmst;
     // hier dann mit diff anstelle von 1000 rechnen, da es selten genau 1000 sein werden
     // hier kannst Du auch problemlos mit Serial.print arbeiten
     f = (tmpCount * long(1000))/ 1000;                        // Berechnung der FRequenz                                                    // Berechnung der FRequenz
     Serial.print("Drezahl RPM: ");                         // Berechnung der FRequenz
     Serial.println(f);                                     // Berechnung der FRequenz
   }

Dass in jeder Zeile der Kommentar "Berechnung der FRequenz" steht, ist sinnlos.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2018, 16:10
Beitrag #4
RE: Drezahl messen mit Arduino Due
Das Rechtecksignal kommt von einem Hall-Sensor.

Das Signal wurde bereits mit einem Oszilloskop gemessen. Pro Umdrehung 10ms bei 100 Umdrehungen pro Sekunde (= 6000 rpm). Das scheint zu passen.

Sorry für die schlechte Kommentierung, wird noch geändert.

Ich werde später Bilder vom seriellen Monitor posten, damit íhr die Schwankungen sehen könnt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2018, 16:59
Beitrag #5
RE: Drezahl messen mit Arduino Due
(10.12.2018 16:10)Idefix schrieb:  Das Rechtecksignal kommt von einem Hall-Sensor.

Das Signal wurde bereits mit einem Oszilloskop gemessen. Pro Umdrehung 10ms bei 100 Umdrehungen pro Sekunde (= 6000 rpm). Das scheint zu passen.

Sorry für die schlechte Kommentierung, wird noch geändert.

Ich werde später Bilder vom seriellen Monitor posten, damit íhr die Schwankungen sehen könnt.
Probier dann mal, wie es aussieht, wenn Du die realen Millis in die Berechnung einbeziehst.
Eine Schwankung +-1 digit ist normal.

Eigentlich ist die Frequenz (Drehzahl) ja count/Zeit. Probiere mal, was da bei einer Floatdivision raus kommt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2018, 19:02
Beitrag #6
RE: Drezahl messen mit Arduino Due
Hallo,

teste mal:
Code:
const int intPin = 3;               // Interruptpin
const uint32_t messperiode = 750;   // in ms
volatile uint32_t impulse;
volatile uint32_t messzeit;
uint32_t impulszeit;
uint32_t messdauer;
uint32_t messstart;
uint32_t Timestamp;
float frequenz;
float drehzahl;

void Drehzahl() {
  impulszeit = micros();
  messdauer = impulszeit - messstart;
  messstart = impulszeit;
  messzeit += messdauer;
  impulse++;
}

void setup() {
  Serial.begin(115200);
  pinMode(intPin, INPUT_PULLUP);          //Pinmod einstellungen
  attachInterrupt(1, Drehzahl, RISING);   //Interrupt declaration
}

void loop() {
  // hier Motorsteuerung

  if ( millis() - Timestamp > messperiode) {
    if (impulse != 0) {
      frequenz = ((float)messzeit / impulse);
      drehzahl = 60000000 / frequenz;
      Serial.print(" Frequenz = ");
      Serial.print(frequenz);
      Serial.print(" Drehzahl = ");
      Serial.println(drehzahl);
      impulse = 0;
      messzeit = 0;
    }
    Timestamp = millis();
  }
}
Das ist jetzt nur die reine Drehzahlmessung. Deine Motorsteuerung musst du noch dazu bauen wenn die Drehzahlmessung zufriedenstellend funktioniert.
Mit der Konstanten "messperiode" kannst du einstellen nach welcher Zeit in Millisekunden eine neue Messung gemacht werden soll.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2018, 09:20
Beitrag #7
RE: Drezahl messen mit Arduino Due
Hallo allerseits,

leider komme ich erst heute zum Antworten. Bei meinem letzen Test habe ich mit einem Arduino Uno R3 die PMW gemacht und einen separaten Arduino Due für die Drehzahlmessung verwendet. Habe das Programm von Ardu_arne getestet und bei geringen Drehzahlen gute Ergebnisse erzielt.
Hier mein Testprogramm: Habe mir nur mal die Frequenz ausgeben lassen. Das hat am Anfang bei niedrigen Drehzahlen sehr genau mit der Messung des Manuellen Messgeräts übereingestimmt.
Leider bin ich mit 5 Volt auf den Arduino Due Interrupt-Pin drauf, es kann sein, dass ich den Due beschädigt habe. Werde heute einen Spannungsteiler einbauen und es mit einem neuen Due versuchen.

Anbei noch mein aktueller Code vom Due und ein Bild vom Seriellen Monitor mit den schwankenden Sensorwerten. Das Bild wurde nach der eventuellen Beschädigung aufgenommen.


Code:
#include <Arduino.h>//################################################################################​#####

const int intPin = 2;               // Interruptpin
const uint32_t messperiode = 1000;   // in ms
volatile uint32_t impulse;
volatile uint32_t messzeit = 1000000;
uint32_t impulszeit;
uint32_t messdauer;
uint32_t messstart;
uint32_t Timestamp;
float frequenz;
float drehzahl;

volatile int zaehler;
volatile uint32_t timer;
volatile uint32_t timerOld;
volatile uint32_t startzeit;

void setup() {
  Serial.begin(115200);                  
  pinMode(intPin, INPUT_PULLUP);          //Pinmod einstellungen
  attachInterrupt(2, Messung, FALLING);   //Interrupt declaration
}


void Messung()
{
zaehler++;
timer = micros() - timerOld;
timerOld = micros();

//Serial.print("Zaehler: ");
//Serial.println(zaehler);
}


void loop() {
  
if ((micros() - startzeit) >= messzeit)
{
  float f = timer; //Datentyp 'float', wegen untenstehender Division
f = 1000000/f; //Aus Periodendauer Frequenz berechnen
noInterrupts();
Serial.print("f: ");
Serial.println(f);
interrupts();
zaehler = 0; //Frequenzzähler zurücksetzen
startzeit = micros(); //Zeitpunkt der letzten Ausgabe speichern

}
  }


   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2018, 10:38
Beitrag #8
RE: Drezahl messen mit Arduino Due
So wird das nichts werden. Ich hatte Dir bereits etwas geschrieben, dass Du ignoriert hast, also noch ein Versuch einer Hilfe.
Code:
void Messung()
{
zaehler++;
timer = micros() - timerOld;
timerOld = micros();  // <-- hier hast Du schon einen anderen Wert von micros()

//Serial.print("Zaehler: "); // Serial.print hat nichts in der Interrupt-Routine zu suchen
//Serial.println(zaehler);
}


void loop() {
  
if ((micros() - startzeit) >= messzeit)
{
  float f = timer; //Datentyp 'float', wegen untenstehender Division
f = 1000000/f; //Aus Periodendauer Frequenz berechnen
noInterrupts(); // Um Serial ist nointerrupts sinnlos, das muss um die Übernahme der Werte aus dem Interrupt.
Serial.print("f: ");
Serial.println(f);
interrupts();
zaehler = 0; //Frequenzzähler zurücksetzen
startzeit = micros(); //Zeitpunkt der letzten Ausgabe speichern

}
  }
Es wäre sinnvoll, wenn Du unsere Beiträge auch liest und versuchst sie zu verstehen. Ansonsten kannst Du auch fragen, aber sinnlos rumstoppeln bringt nichts.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 562 14.10.2019 14:48
Letzter Beitrag: Thorsten_S
  Waagerechte Beschleunigung messen scritch 3 732 18.03.2019 22:45
Letzter Beitrag: Bitklopfer
Question Spannungen unter 5V messen phischmi 6 1.283 06.04.2018 19:48
Letzter Beitrag: phischmi
  Die Frequenz von der Lichtmaschine, Klemme W messen torwart0306 7 3.332 13.09.2017 17:53
Letzter Beitrag: georg01
  Aufwachen und Spannung messen ardun 5 1.632 26.05.2017 10:36
Letzter Beitrag: Franz54
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 4.015 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Schallgeschwindigkeit mit digitalen Mikrofonen messen scritch 2 1.765 27.11.2015 11:56
Letzter Beitrag: a.part
  Arduino Druck Messen GaLeMa00 17 6.559 18.09.2015 20:12
Letzter Beitrag: GaLeMa00
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 3.556 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 9.738 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf

Gehe zu:


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