Hilfestellung bei Servo Signal auslesen/erzeugen benötigt

OP #2367163
Lesenswert?
• ▲
▼
Hallo,

Ich möchte mir eine Steuerung für min 1 Servo bauen.
Die Steuerung sollte außerdem auch min 2 Servo signale einlesen und 
auswerten.
Unabhängig von den servo soll die schaltung auch noch nen ldr per adc 
auslesen und ggf. outs steuern


Das erste Servosignal sollte mit Referenzwerten verglichen werden und 
bei über/unterschreiten gewisser werte sollte eien Art Notlauf Programm 
an den Servo gesendet werden, anasonsten wird das eingelesene Signal 
durchgereicht.

Beim 2. Servo Signal solls so aussehen das je nach Signal ein Out 
geschaltet wird.

An HW/Plattform möchte ich gerne Die Atmel AVR Familie 
verwenden(Atmega/attiny) und bestenfalls der Code in C sein.
Wobei hier gilt desto kleienr desto besser :-)(mein den µc)

Aufgrund dieser sachen hab nun erstmal nen paar Fragen:

-Wie genau müssen die Timer für Servosignale sein. Müssen es 16-bit 
timer sein oder tun es auch 8 Bit timer.
Benötige ich überhaupt für jedes Seervo signal nen eigenen Timer?

-Hat jemand beispiel c-code speziell fürs auslesen der servo signale?


Ich dnek in der nächsten Zeit werden noch mehr fragen auftauchen, aber 
im moment wärs das erstmal.


Besten Dank im vorraus
#2368570
Lesenswert?
• ▲
▼
M. H. schrieb:
> nen
> bespiel für die Servo Signalerfassung in "C"

Lass einen Timer durchlaufen.

Das Zählregister des Timers wird dann von einem Pinchange-Interrupt, 
steigende Flanke, ausgelesen und zwischengespeichert in eine Variable 
nennen wir sie mal x.
Das Zählregister des Timers wird dann von einem Pinchange-Interrupt,
fallende Flanke, ausgelesen und x davon abgezogen. Man erhält die 
Pulslänge in Timer-Counts. Überlauf des Timers macht hier nix 
aus(Beispielrechnung in uint16_t: 23 - 65530 ergibt eben 29, das genüger 
hier als Beweis, geht aber nur wenn COUNT_MAX des Timers dem INT_MAX der 
Variable zum rechnen entspricht).

Von hier aus kann dann eine Auswertung erfolgen
if(pulslaenge > 30){
tuediesunddas();
} else if(pulslaenge > 30 && pulslaenge < 100){
tuejenes();
}//usw...

Um einen Servopuls auszugeben, "Waveform Generation Mode" eines Timers 
nutzen, die gemessene Pulslänge in die OCR-Register stecken und 
fertig(musst natürlich den Timer erst zurechtkonfiguruieren).

mfg mf
OP #2368777
Lesenswert?
• ▲
▼
@ Mini Float

Vielen Dank für die Antwort... scheint echt plausibel zu klingen ;-).
Kann man bei Steigender Flanke nicht auch das Zählregister auf 0 setzen? 
So würde dann kein Überlauf passieren, bzw könnte ich den dann als 
Fehler auswerten und ich hät direkt die passende Zeit im Timer.

Reicht denn ein 8-Bit Timer dafür aus, oder brauchs ich genauer?

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.