Hallo,
im Arm meines Roboters sind 2 Servos. Servo 1 ist im Schultergelenk und
Servo 2 im Ellbogengelenk.
Folgende Armbewegung will ich realisieren:
Oberarm und Unterarm hängen gestreckt am Körper runter. Beide Servos
werden mit 1,5 ms angesteuert (Mittelstellung). Danach wird der
komplette Arm (Oberarm und Unterarm) nach vorne gestreckt. Das heisst,
Servo 1 wird mit jetzt mit 0,5 ms angesteuert und der Unterarm müsste
aber seine 1,5 ms weiter bekommen. Der Unterarm hat ja noch seine
gestreckte Position. Geht aber nicht, weil Timer0 ja alle 20ms nur eine
einzige Impulslänge generieren kann, also entweder 0,5ms oder 1,5ms
Meine Frage:
Kann ich an einem Gelenkstück (Hand, Ellenbogen, Schultergelenk) mehrere
Servos mit unterschiedlichen Impulslängen von 0,5 ms bis 2ms unabhängig
versorgen? Die Impulse werden in der ISR von TIMER0 generiert.
Ich habe für mich die Frage insofern selbst beantwortet, dass ich sage:
DAS KANN NICHT FUNZEN! Wie denn auch. Es sei denn, jemand von euch hätte
eine Anregung, wie man sowas trotzdem realisieren kann. Vielleicht
mehrere TIMER?
Alle Servos am Roboter arbeiten einwandfrei, wenn sie ihren "privaten"
Impuls bekommen. Aber zeitgleich 2 unterschiedliche Impulse an den
Servos am Arm???!!
Ausschnitt aus dem sehr umfangreichen Programm:
In der ISR wird "pos" per switch abgefragt und dementsprechend die PORTS
gesetzt.
1
voidarm_STEMMEN()// stemmen
2
3
{
4
switch(count)
5
{
6
case140:pos=0x0003;break;// Ellenbogen 0,5ms
7
case200:pos=0x0073;break;// Ellenbogen 1,5ms
8
case280:pos=0x0003;break;// Ellenbogen 0,5ms
9
case400:count=120;k++;break;
10
}// Ende switch
11
12
switch(k)
13
{
14
case2:k=0;count=401;break;
15
}// Ende switch
16
17
}// End
18
19
20
########################## check von "pos" in der ISR #####################
21
22
23
ISR(TIMER0_OVF_vect)
24
{
25
if(TCCR0==5)// wenn ja, dann ist die 20ms Pause zuende, es folgt Port setzen
26
{
27
28
switch(pos)
29
{
30
case0x0000:TCNT0=0xd5;PORTC&=~(1<<PC0);break;// 0 Grad
31
case0x0010:TCNT0=0xB0;PORTC&=~(1<<PC0);break;// 12 Grad
> Ich habe für mich die Frage insofern selbst beantwortet, dass ich sage:> DAS KANN NICHT FUNZEN!
So schlimm ist es nicht! Es kann funzen.
Wie wäre es, wenn du den Timer auf die kleinste gemeinsame Zeit
einstellst (0,5ms) und alle anderen Zeiten als Vielfache dieser Zeit
betrachtest, d.h. intern Zähler mitlaufen lässt?
Also der Timer als Taktgeber für eine Stoppuhr mit einem 0,5ms Takt. Der
Zähler Servo1 startet bei 1 (0,5ms) und läuft bis 41 (Start+20ms)
beginnt von vorne. Der Zähler Servo2 startet bei 3 (1,5ms) und läuft
bis 43 (Start+20ms).
ich hab mal eine Routine geschrieben die 3 Servos versorgt über EINEN
Timer
Ablauf:
1. 1. Ausgang high -> Timer laden mit Pulslänge 1
2. Timer schlägt zu -> 1.Ausgang low, 2. Ausgang high -> Timer laden mit
Pulslänge 2
3. Timer schlägt zu -> 2. Ausgang low, 3. Ausgang high -> Timer laden
mit Pulslänge 3
4. ...
Du mußt dann natürlich die Pins alleine umschalten, das erledigt nicht
mehr der Timer alleine...
Hallo ihr beiden Hotliner,
gute Ideen, die ihr vorgeschlagen habt. Ich glaube, dass ich meine 10
Servos im Roboter mit Timer0 versorgen kann. Die anderen Timer im MEGA16
sind schon mit Encoder und Tastenentprellung beschäftigt. Ich setze mich
diese Woche hin und berichte dann, inwieweit ich das realisieren konnte.
Sehr interessante Antworten von euch.DANKE!
Udo
Hallo Hotliner,
Danke für eure Anschubhilfe. Habe das Prinzip bei 2 Servos realisiert.
Beide Servos werden unabhängig mit frei wählbaren Impulsen angesteuert.
Der Einfachheit halber drehen in diesem Demoprogramm beide Servos von
0,8ms nach 2,2ms jeweils in entgegengesetzte Richtung.
Es ist sehr wahrscheinlich die x-te Variante, um Servos unabhängig
anzusteuern. Wer will, kann das Programm als Einstieg verwenden.
Ich programmiere noch nicht solange in C. Deshalb ist der Code
möglicherweise noch umständlich.Aber er funktioniert tadellos. Trotzdem
möcht ich mal bei den Experten nachfragen, wie ein optimierter,
verkürzter Code aussieht. Würde mich über die eine oder andere Anregung
freuen.
Hier mein Programm. Liebe Experten: Es ist bestimmt verbesserungswürdig.
Bitte um eure Anregungen!!
Udo
1
// 2 unabhängige Servos drehen gleichzeitig in entgegengesetzte Richtung