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
Zeitmessen zwischen 2 Impulse
01.02.2020, 19:54 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2020 20:05 von Lothileinchen.)
Beitrag #1
Zeitmessen zwischen 2 Impulse
Hallo!
Ein kleiner Testaufbau.
Beteiligt sind:
2 Arduino Uno
1 Stepper Nema 17 nebst Treiber
1Rotary Encoder LPD 3806 600BM (600 Pulse pro Umdrehung)
Und Ich
Der Aufbau:
Arduino Uno 1 steuert den Stepper. Dieser treibt den Encoder über eine Flex-Kupplung an.
Arduino Uno 2 zählt die Impulse, misst die Zeit zwischen 2 Impulsen und gibt dieses über den seriellen Monitor aus.
Arduino Uno 1und 2 sind elektrisch nicht verbunden
Das Problem:
Die ausgegebenen Zeiten stimmen nicht mit den erwarteten Zeiten überein.
Der Stepper macht 800 Schritte je Sekunde also 1 Umdrehung je Sekunde
Auf dem seriellen Monitor werden folgende Größen ausgegeben:
zeit_millis 3,00
zeit_micros 3108
Schwankt auch etwas nach jedem Durchlauf

Erwarten würde ich:
zeit_millis 1,66666667
zeit_micros 1666,66667
Denn:
1 Sekunde=1000millis/600 Pulse=1,66666667 millis je Puls
1Sekunde =1000000 micros/600 Pulse=1666,66667 micros je Puls

Woran mag das liegen, dass zwischen den gemessenen und den errechneten Werten ein so großer Unterschied ist?
Sketch? (Ist Eigentlich ein Teil eines Standartdrehzahlmessers)
Denkfehler? ( Falsch gerechnet)
Am Serieller Monitor? (Ausgabe zu langsam oder so)
Testaufbau?
????
Code:
//Arduino Uno 1
#include <AccelStepper.h>
const  int stepPin = 5 ;//für Nema Motor
const  int dirPin = 4 ; //für Nema Motor
const  int enPin = 8 ;  //für Nema Motor

AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

void setup() {
  Serial.begin(9600);
  pinMode (stepPin, OUTPUT);
  pinMode (dirPin, OUTPUT);
  pinMode (enPin, OUTPUT);
  digitalWrite (enPin, LOW);
  stepper.setMaxSpeed(4200);
}
void loop() {
  stepper.setSpeed(800);
  stepper.moveTo(800);
  stepper.runSpeedToPosition();
}


//================================================================================​=======
Arduino Uno 2


volatile long new_Time_millis = 0;
volatile long old_Time_millis = 0;
volatile long new_Time_micros = 0;
volatile long old_Time_micros = 0;
volatile long zaehler = 0;
volatile float zeit_millis = 0.00;
volatile float zeit_micros = 0.00;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
  attachInterrupt(0, Test, RISING);
}
void loop() {
  Serial.println("");
  Serial.print("zaehler    =    ");
  Serial.print( zaehler );
  Serial.print("  ");
  Serial.print("zeit_micros=   ");
  Serial.print(zeit_micros);
  Serial.print("  ");
  Serial.print("zeit_millis=   ");
  Serial.print(zeit_millis);
  Serial.print("  ");
  delay(1000);
}
void Test() {
  zaehler ++;
  new_Time_micros = micros();
  new_Time_millis = millis();
  zeit_millis =  new_Time_millis - old_Time_millis;
  zeit_micros = new_Time_micros - old_Time_micros;
  old_Time_millis = new_Time_millis;
  old_Time_micros = new_Time_micros;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 20:10 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2020 20:11 von Tommy56.)
Beitrag #2
RE: Zeitmessen zwischen 2 Impulse
Du musst zum Auslesen die Interrupts abschalten:

Code:
uint32_t tmp_millis, tmp_micros;
cli();
tmp_millis = zeit_millis;
tmp_micros = zeit_micros;
sei();
// hier mit den tmp-Werten weiter arbeiten
Es brauchen auch nur die zeit_xxx-Variablen volatile sein, da Du nur mit diesen in- und ausserhalb der ISR arbeitest;

Andere Variante:
Code:
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  tmp_millis = zeit_millis;
  tmp_micros = zeit_micros;
}
// hier mit den tmp-Werten weiter arbeiten

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
01.02.2020, 20:28
Beitrag #3
RE: Zeitmessen zwischen 2 Impulse
(01.02.2020 19:54)Lothileinchen schrieb:  Hallo!
Ein kleiner Testaufbau.
Beteiligt sind:
2 Arduino Uno
1 Stepper Nema 17 nebst Treiber
1Rotary Encoder LPD 3806 600BM (600 Pulse pro Umdrehung)
Und Ich
Der Aufbau:
Arduino Uno 1 steuert den Stepper. Dieser treibt den Encoder über eine Flex-Kupplung an.
Arduino Uno 2 zählt die Impulse, misst die Zeit zwischen 2 Impulsen und gibt dieses über den seriellen Monitor aus.
Arduino Uno 1und 2 sind elektrisch nicht verbunden
Das Problem:
Die ausgegebenen Zeiten stimmen nicht mit den erwarteten Zeiten überein.
Der Stepper macht 800 Schritte je Sekunde also 1 Umdrehung je Sekunde
Auf dem seriellen Monitor werden folgende Größen ausgegeben:
zeit_millis 3,00
zeit_micros 3108
Schwankt auch etwas nach jedem Durchlauf

Erwarten würde ich:
zeit_millis 1,66666667
zeit_micros 1666,66667
Denn:
1 Sekunde=1000millis/600 Pulse=1,66666667 millis je Puls
1Sekunde =1000000 micros/600 Pulse=1666,66667 micros je Puls

Woran mag das liegen, dass zwischen den gemessenen und den errechneten Werten ein so großer Unterschied ist?
Sketch? (Ist Eigentlich ein Teil eines Standartdrehzahlmessers)
Denkfehler? ( Falsch gerechnet)
Am Serieller Monitor? (Ausgabe zu langsam oder so)
Testaufbau?
????
Code:
//Arduino Uno 1
#include <AccelStepper.h>
const  int stepPin = 5 ;//für Nema Motor
const  int dirPin = 4 ; //für Nema Motor
const  int enPin = 8 ;  //für Nema Motor

AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

void setup() {
  Serial.begin(9600);
  pinMode (stepPin, OUTPUT);
  pinMode (dirPin, OUTPUT);
  pinMode (enPin, OUTPUT);
  digitalWrite (enPin, LOW);
  stepper.setMaxSpeed(4200);
}
void loop() {
  stepper.setSpeed(800);
  stepper.moveTo(800);
  stepper.runSpeedToPosition();
}


//================================================================================​=======
Arduino Uno 2


volatile long new_Time_millis = 0;
volatile long old_Time_millis = 0;
volatile long new_Time_micros = 0;
volatile long old_Time_micros = 0;
volatile long zaehler = 0;
volatile float zeit_millis = 0.00;
volatile float zeit_micros = 0.00;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
  attachInterrupt(0, Test, RISING);
}
void loop() {
  Serial.println("");
  Serial.print("zaehler    =    ");
  Serial.print( zaehler );
  Serial.print("  ");
  Serial.print("zeit_micros=   ");
  Serial.print(zeit_micros);
  Serial.print("  ");
  Serial.print("zeit_millis=   ");
  Serial.print(zeit_millis);
  Serial.print("  ");
  delay(1000);
}
void Test() {
  zaehler ++;
  new_Time_micros = micros();
  new_Time_millis = millis();
  zeit_millis =  new_Time_millis - old_Time_millis;
  zeit_micros = new_Time_micros - old_Time_micros;
  old_Time_millis = new_Time_millis;
  old_Time_micros = new_Time_micros;
}
Hallo Tommy 56!
Danke für die schnelle und sachliche Antwort. Werde deinen Rat befolgen und die Änderungen im Code vornehmen.
Gruß! Lothar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 20:30 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2020 20:31 von Tommy56.)
Beitrag #4
RE: Zeitmessen zwischen 2 Impulse
Und warum musst Du dazu den ganzen Thread nochmal zitieren?

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
01.02.2020, 20:33
Beitrag #5
RE: Zeitmessen zwischen 2 Impulse
(01.02.2020 20:30)Tommy56 schrieb:  Und warum musst Du dazu den ganzen Thread nochmal zitieren?

Gruß Tommy

Upps war nicht gewollt
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.02.2020, 21:57 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2020 21:58 von MicroBahner.)
Beitrag #6
RE: Zeitmessen zwischen 2 Impulse
Es gibt auch oben und unten die größeren Buttons 'New Reply' .
Da wird dann erstmal garnichts zitiert. Ist für eine einfache Antwort am besten.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2020, 16:02
Beitrag #7
RE: Zeitmessen zwischen 2 Impulse
Hallo!
Ich habe den Code, wie von Tommy vorgeschlagen, angepasst.
Leider hat sich nichts geändert. Die gemessenen Zeiten sind immer noch unbrauchbar. Und gehe nun davon aus, dass der Code so okay ist.
Um den Fehler einzugrenzen, habe ich mein China-Oszilloskop (DSO138) angeschlossen und konnte nun erkennen, dass die Signale unterschiedlich lang sind, so auch unterschiedliche Pausenlängen haben. Ich könnte mir nun vorstellen, dass es an dem treibenden Stepper liegt. Denn dieser läuft ja nicht kontinuierlich, sondern macht nur einzelne Schritte.
Was meint ihr dazu?
Gruß! Lothar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2020, 16:08
Beitrag #8
RE: Zeitmessen zwischen 2 Impulse
Naja, wenn die Quelle schon Müll ist, kann die beste Messung nichts anderes daraus machen. Garbage in - garbage out.

Evtl. wirkt auch noch die Flexkupplung verzerrend.

Welchen praktischen Nährwert soll der Aufbau denn überhaupt haben? Ich halte ihn für eine Fehlentwicklung.

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
  Probleme mit Wert zwischen Messbereichen von bis juergen001 6 198 07.09.2020 14:49
Letzter Beitrag: juergen001
  Float über I2C zwischen 2 Arduinos UNO Marduino_UNO 23 9.196 18.08.2020 11:53
Letzter Beitrag: hotsystems
  Berechnen der Entfernung zwischen 2 GPS Koordinaten louard 5 1.127 14.04.2020 11:52
Letzter Beitrag: louard
  Mit einen Taster zwischen zwei Ausgängen Toggeln luft-post 6 771 13.01.2020 17:41
Letzter Beitrag: hotsystems
  Verbindung zwischen BLE Shield und Feather32u4 WinTiger 10 1.901 21.05.2019 11:07
Letzter Beitrag: WinTiger
Exclamation Frage zur I2C zwischen Master und Slave saberlucien 6 2.333 27.02.2018 15:49
Letzter Beitrag: Tommy56
  [Frage] Unterschied zwischen &=~ und ^= beim Bit ändern auf dem Port? avoid 13 3.279 11.01.2018 00:53
Letzter Beitrag: avoid
  Pause zwischen SPI.transfer's Zogrob 0 1.598 20.10.2015 08:51
Letzter Beitrag: Zogrob
  Relais an zwischen 22 und 5 Uhr ?? DL1AKP 5 2.501 16.06.2015 11:14
Letzter Beitrag: Scherheinz
  Variablen per WIFI zwischen 3 Arduinos versenden Daewid 4 2.446 23.04.2015 01:22
Letzter Beitrag: Daewid

Gehe zu:


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