Arduino - PulseIn Funktion - Genauigkeit

Gast #3935459
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
#3935485
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.
Gast #3935490
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren