Forum: Mikrocontroller und Digitale Elektronik Arduino - PulseIn Funktion - Genauigkeit


von Kalu (Gast)


Lesenswert?

Hallo zusammen,

ich habe einen Arduino Uno R3, mit dem ich ein PPM Signal eines 
RC-Empfängers auswerte. Der zu messende Puls (high) liegt zwischen 1ms 
und 2ms. Die gesamte Periode beträgt 20ms.

Ich habe das Signal des Empfängers auf Pin 5 gelegt und verwende 
folgenden Code:
1
void loop()
2
{
3
  duration = pulseIn(5, HIGH);
4
  Serial.println(duration);

Die Fernsteuerung sendet in Mittelstellung des Knüppels ein Signal von 
exakt 1,5ms. Das funktioniert und kontrolliere ich wenn ich ein Servo 
direkt an den Empfänger hänge.

Die Werte die ich nun mit dem Arduino bekomme liegen zwischen 1,464ms 
und 1,508ms. Da ich das Signal danach wieder an ein Servo ausgebe, 
verursacht das natürlich ein gewisses "Zittern".

Gibt es eine Möglichkeit die Genauigkeit zu erhöhen? Habt ihr eine Idee?

VG/Lukas

von Stefan F. (Gast)


Lesenswert?

Mehrere Messungen machen und den Mittelwert bilden.

von Kalu (Gast)


Lesenswert?

Stefan Us schrieb:
> Mehrere Messungen machen und den Mittelwert bilden.

Das wäre die "dirty" Variante. ich würde gerne erst mal probieren die 
Genauigkeit der Messung zu erhöhen und nicht die "ungenauen" Ergebnisse 
durch Mittelwert bilden glatt zu ziehen.

VG

von Karl H. (kbuchegg)


Lesenswert?

Das wird auch nicht genauer werden.

pulseIn benutzt meines Wissens eine delay-Variante mit mitzählen. Und da 
kommen dem Teil dann natürlich die 'System-Interrupts' dazwischen.

Ich denke nicht, dass du da mit dem Arduino-System hier weiter kommst. 
Du kannst mal probieren, vor dem pulseIn die Interrupts zu deaktivieren 
und hinterher wieder zu aktivieren. Mit ein bischen Glück funktioniert 
dann sogar millis() noch einigermassen.

Aber im Grunde wäre die vernünftigste Variante, solche Dinge ohne die 
Arduino-Lib zu machen. So wie das im AVR vorgesehen ist: Mit dem Capture 
Interrupt eines Timers. Aber ich schätze mal, das wird im Arudino System 
nicht so einfach sein.

von Kalu (Gast)


Lesenswert?

Stefan Us schrieb:
> Mehrere Messungen machen und den Mittelwert bilden.

Mir fällt auch grad ein dass das keinen Sinn macht. Wenn ich 10 Werte 
nehmen würde bräuchte ich alleine schon mal 200ms um einen neuen Wert zu 
errechnen. Das wäre eine Frequenz von 5 Hz. Das ist viel zu wenig.

von Kalu (Gast)


Lesenswert?

Karl Heinz schrieb:
> Das wird auch nicht genauer werden.
>
> pulseIn benutzt meines Wissens eine delay-Variante mit mitzählen. Und da
> kommen dem Teil dann natürlich die 'System-Interrupts' dazwischen.
>
> Ich denke nicht, dass du da mit dem Arduino-System hier weiter kommst.
> Du kannst mal probieren, vor dem pulseIn die Interrupts zu deaktivieren
> und hinterher wieder zu aktivieren. Mit ein bischen Glück funktioniert
> dann sogar millis() noch einigermassen.
>
> Aber im Grunde wäre die vernünftigste Variante, solche Dinge ohne die
> Arduino-Lib zu machen. So wie das im AVR vorgesehen ist: Mit dem Capture
> Interrupt eines Timers. Aber ich schätze mal, das wird im Arudino System
> nicht so einfach sein.

Hmm. Ok. Das ist auf jeden Fall mal ein Anhaltspunkt. Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.