Forum: Mikrocontroller und Digitale Elektronik Hilfestellung bei Servo Signal auslesen/erzeugen benötigt


von M. H. (dbzwerg)


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

von Stephan K. (dustpuppy)


Lesenswert?

Hi,
benutz einfach die lib von Julian Mendel. Damit kannste bis zu 10 Servos 
ansteuern. http://derjulian.net/mikrocontroller

Gruesse

Dusty

von M. H. (dbzwerg)


Lesenswert?

Erstmal Danke für die Antwort... ich suche aber vorallendingen nen 
bespiel für die Servo Signalerfassung in "C"

von user (Gast)


Lesenswert?

die Beispiele sind in "C"

von Achim M. (minifloat)


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

von M. H. (dbzwerg)


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?

von Martin (Gast)


Lesenswert?

M. H. schrieb:
> Kann man bei Steigender Flanke nicht auch das Zählregister auf 0 setzen?

Könnte man, aber wenn du zwei Servosignale oder mehr auswerten möchtest, 
werden irgendwann die Zähler knapp. Und sooo schlimm ist eine 
Subtraktion ja nun nicht.

von Michael (Gast)


Lesenswert?

M. H. schrieb:
> Reicht denn ein 8-Bit Timer dafür aus, oder brauchs ich genauer?

Woher sollen das hier einer wissen. Wie genau ist dein Ausgabeservo, wie 
genau sind die Servoeingangssignale und wie genau muß das Signal 
rauskommen.

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.