PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : servo ansteuern



ikarus_177
09.04.2008, 11:58
hallo,

ich verwende die rn-control mit atmega 32 mit bootloader.

jetzt möchte ich einen servo anschließen. dazu müsste ich eigentlich nur die stromversorgung anschließen und eben das "PWM kabel" an einen freien pin an port A? muss ich da noch einen widerstand dazwischenschalten oder eher nicht? (bzgl. strombegrenzung)


lg
ikarus_177

Willa
09.04.2008, 12:19
Hi!
Nein, du kannst das einfach so direkt anschließen.
Viele Grüße,
William

kalletronic
09.04.2008, 12:22
Soweit ich weis brauchst du nur + und masse an das Servo anzuschliessen und den (meistens gelben Draht) an den Pin wo du die PWM ausgiebst, ohne Widerstand https://www.roboternetz.de/wissen/index.php/Servo

MeckPommER
09.04.2008, 13:06
Was das "ohne Widerstand" angeht ... also ich würde je nach Servo doch so 500-1000 Ohm dazwischenhängen am Signalpin. Habe schon einige Servos erlebt, die dort erstaunlich niederohmig waren. Geht 100 Mal ohne Widerstand gut ...

ikarus_177
09.04.2008, 15:30
hallo,

erst mal danke für die antworten...
habe mich dazu "durchgerungen" doch einen widerstand dazwischenzuschalten, da ich nicht gleich meine neuen servos schrotten möchte.

also danke sehr


lg
ikarus_177

MeckPommER
09.04.2008, 16:43
Nicht so sehr die Servos sind durch den fehlenden Widerstand unter Umständen gefährdet, sondern der µC, da einige Servos dort Strom ziehen, wenn deren Versorgungsspannung abgeklemmt ist. So jedenfalls meine negativen Erfahrungen.

Gruß MeckPommER

Roboman93
09.04.2008, 18:33
mal ne frage zu den PWM. lann mir mal einer nen link schicken, der über ein software-pwm an nem atmega geht???

Ceos
10.04.2008, 11:22
ich fass es mal kurz zusammen, nen link hab ich grad nicht, du nimmst en timer, stellst ihn dir so ein das er nützlich wird (10tel ms takt ein überlauf z.B.) aktivierst den timer-overflow interrupt, und schreibst in deiner interrupt routine mit hilfe einer zählvariable und einer sollwert variable in das portregister und schaltest je nach wunsch den pin zur richtigen zeit an und aus

EDIT: Beispiel
10tel ms takt



ISR {
count_vaiable inkrementieren;
wenn (pin high && count_variable == sollvar+10) pin low; count_variable = 0;
//wenn pin high dann 1-2mS high halten und dann wieder low schalten taktlänge ist 1.5ms +- 0.5ms
wenn (pin low && count_variable > rund(20ms*10)) pin high; Count_variable = 0;
//wenn pin auf low geht ne pause von 20-50ms einlegen damit der servo sich einstellen kann sonst ruckelt er

Roboman93
11.04.2008, 16:18
ok, aber was ich net verstehe, wie kriege ich den takt,nach dem die count_variable erhöht wird?

harry3
11.04.2008, 19:14
Die primitivste Möglichkeit ein PWM Signal zu erzeigen ist über die bereits vorliegenden Sleep Funktionen.

Also so in der Art, in diesem Fall kann man die PWM Zahl zwischen 0 und 10 einstellen(je höher die Auflösung desto besser), mit pwm_zahl=5 hat man ein Tastverhältnis von 50:50.

Pseudocode:


#define PWM_ZAHL_MAX 10
pwm_zahl=5;
while(bedingung)
{
Ausgang_auf_5V;
for(n=0;n<pwm_zahl;n++) Sleep(zeit);

Ausgang_auf_0V;
for(n=0;n<(PWM_ZAHL_MAX-pwm_zahl);n++) Sleep(zeit);
}

Es gibt natürlich viel elegantere Wege das zu lösen.

Roboman93
12.04.2008, 18:00
klar, mit sleep habe ich auch schon gemacht, aber halt zu ungenau. kann man eig den quarz-eingang auch abfragen, also z.b. if(quarzeingang==high)? dann könnte man einen genaueren pwm machen!

MeckPommER
12.04.2008, 18:39
auch bei einem sortware pwm würde ich die zetiliche steuerung mit einem timer machen, denn alles andere wird zu ungenau. das mit dem timer ist dann indirekt schon eine abfrage des quarzes.

harry3
12.04.2008, 18:55
Zu ungenau mit Sleep? Naja, kommt drauf an was du machen willst. Denn Sleep ist an sich schon genau weil es, wie bereits erwähnt, den Takt vom Quarz bekommt.
Für was brauchst du denn das PWM Signal?

Roboman93
13.04.2008, 09:26
in erster regel möchte ich ein servo genao ansteuern. mit sleep hat der aber gerade mal 10 positionen.

Ceos
13.04.2008, 12:38
@roboman deine frage "wo bekomm ich den takt" hab ich nicht ganz verstanden, ich hab gesagt du schreibst eine interrupt routine, diese wird immer ausgeführt wenn der entsprechende interrupt ausgelöst wird ... ausgelöst wird der interrupt von einem timer, der du darauf einstellen musst ...n oder wie oder was meinst du jetzt ? PS bitte lad dir das datenblatt runter und liess dir die beschreibung zu den timern und den steuerregistern wenigstnes kurz durch, damit wir nciht aneinander vorbeireden ^^

EDIT der timer macht GENAU DAS was du möchtest, er zählt immer ein register höher wenn der quarz eine flanke bringt, erreicht das register dann einen bestimmten wert oder läuft über undf wird wieder 0 löst der timer einen interrupt aus

EDIT2: wen cih mich nicht irre, (leider kann ichs grad net austesten) hab ich bei meinem servo-experiment auch nur eine auflösung von 1/10tel millisekunde, aber das reicht eigentlich vollkommen aus ... oder wars doch 1/100tel ... hauptvorteil der interruptlösung, du brauchst nichtmal ne main() damit das funktioniert, ich hab nur ein poti an den ADC gehangen, am anfang der main den ADC auf dauerhaftes messen gestellt und bei jedem ADC complete interrupt den wert in eine variable kopiert die ich im timer-interrupt für die steuerung des servos verwende ... die main kreiselt in einer leeren while(1); schleife rum, da ist also reichlich platz für mehr code