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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.