Forum: Mikrocontroller und Digitale Elektronik oystick servo ansteuerung


von mic (Gast)


Lesenswert?

Hallo allerseits ich habe einen Attiny 13 und versuche einen Servo 
(modelcraft vsd-1) Billigservo von Conrad über einen joystick 
anzusteuern. Den Joystick habe ich aufgeschraubt und will über die Potis 
an ADC, dann je nach Position den Servo ansteuern.

Ziel ist es in ganz ganz ferner Zukunft ein Modellflugzeug o.Ä. damit zu 
Steuern aber im Moment ist es mir nur wichtig über EIN Poti EINEN Servo 
anzusteuern damit wäre ich schonmal gut bedient.

Ich bin noch recht neu in der Materie und bin schon diverse Tutorials 
durchgegangen und hab auch schon viel über Google gefunden aber auch 
viel Widersprüchliches deswegen die Fragen:

1.Ist das überhaupt mit dem Attiny 13 realisierbar ? (die Ansteuerung 
muss am Anfang nicht sehr genau sein)

2.Welchen Timer Modus soll ich dazu nehmen ?

3.Kann ich den Poti direkt an ADC anschließen oder muss ich etwas 
dazwischenklemmen ?
dasselbe bei dem Servo, direkt oder etwas dazwischen ?

Den Poti würde ich mit an die Versorgungsspannung vom Tiny legen und der 
Servo würde eine externe Versorgung bekommen.

Vielen Dank für eure Hilfe ich hoffe die Ínformationen reichen für den 
Anfang.

von Karl H. (kbuchegg)


Lesenswert?

mic schrieb:

> 1.Ist das überhaupt mit dem Attiny 13 realisierbar ? (die Ansteuerung
> muss am Anfang nicht sehr genau sein)

Ja

> 2.Welchen Timer Modus soll ich dazu nehmen ?

Ein PWM Modus würde sich anbieten

> 3.Kann ich den Poti direkt an ADC anschließen oder muss ich etwas
> dazwischenklemmen ?

nein musst du nicht.
Das Poti verschaltest du als Spannungsteiler und die variable Spannung 
misst du mit dem ADC. Daraus errechnest du dann die Pulslänge für die 
PWM

> dasselbe bei dem Servo, direkt oder etwas dazwischen ?

nichts dazwischen

> Den Poti würde ich mit an die Versorgungsspannung vom Tiny legen und der
> Servo würde eine externe Versorgung bekommen.

Gut


http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

von mic (Gast)


Angehängte Dateien:

Lesenswert?

Ok bin jetz soweit das ich die PWM und den ADC wie ich hoffe richtig 
eingerichtet habe.
Jetz würde ich evtl ein bißchen Hilfe brauche obwohl ich mir alles schon 
50 mal glaube ich durchgelesen habe, benötige ich so n bissl Anleitung 
wäre cool wenn mir jemand beistehen könnte.Was wären jetz meine nächsten 
schritte ? Wenn ich einmal dahintergekommen bin verstehe ich es dann 
hoffe ich auch :-)

von Tueftler (Gast)


Lesenswert?

So wie ich deinen Programmcode bis jetzt sehe, ist die Main-Schleige bei 
dir momentan noch nicht als Schleife implementiert.
Irgendwo solltest du etwa diese Zeilen haben:

main:
.
.
.
rjmp main;

Irgendwie ist mir so, als müssten die Interrupt-Vektoren alle der 
korrekten Reihenfolge nach angeordnet werden und wie du auch schon 
teilweise korrekt gemacht hast, am Anfang des Programms stehen.

ein Beispiel von mir:

.org 0x0000
rjmp RESET         ; Reset Handler
.org 0x0001
rjmp INT0address      ; External Interrupt0 Handler
.org 0x0002
rjmp INT1address      ; External Interrupt1 Handler
.org 0x0005
rjmp TIMER1_OVF
.org 0x0006
rjmp TIMER0_OVF
.org 0x000E
rjmp CompareB


RESET:
ldi temp1, low(RAMEND)    ; Main program start
out SPL,temp1      ; Set Stack Pointer to top of RAM

Main:

rjmp Main;

TIMER1_OVF:
##########
Timer InterruptRoutine
##########
reti;


Bei weiteren Fragen helfe
Jetzt kannst du in der TimerInterruptroutine beispielsweise eine 
Variable inkrementieren, die du immer mit verschiedenen PPM-Werten für 
die Kanäle vergleichst. Bei Erreichen des Vergleichswertes löscht du den 
entsprechenden PortPin, beim Überlauf der Variable setzt du wiederum 
alle. Somit kannst du dann Impulslängen unterschiedlicher Länge 
erzeugen...
Alternativ so lange warten, bis die PPM-Impulslänge verstrichen ist und 
dann den Pin löschen..

Tueftler

von mic (Gast)


Lesenswert?

Erstmal Danke :-)

Ich verstehe das ganze Prinzip eigentlich so:

POTI-->ADC(WERT) bei Wert X --> PWM Signal 1,0ms für linksPosition
                          Y --> PWM Signal 1,5ms für Mitte
                          Z --> PWM Signal 2,0ms für Rechts

ich komm jetz einfach noch nicht so dahinter wie ich dem Timer sagen 
soll das er z.B. bei Wert X 1,0ms herrausgeben soll und bei Wert Z z.B. 
2,0ms ???

von mic (Gast)


Lesenswert?

...und liege ich da richtig der Tiny läuft mit 9,6 Mhz mit dem Vorteiler 
8
= 1,2 Mhz für 1,0ms wären das dann 1200 Zählerschritte,
1,5ms 1800 und 24000 für 20ms ? oder hab ich da falsch gerechnet ?

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.