Forum: Mikrocontroller und Digitale Elektronik ATmega 16 servo poti


von Mic (Gast)


Lesenswert?

Hi kann jemand mal kurz über meinen  code gucken und mir sagen was 
falsch ist mein Servo bewegt sich nicht wirklich !
Danke




#include <avr/io.h>

int main(void)
{

  unsigned Ergebnis;
  Ergebnis = 0 ;
  DDRD = (1<<PD5); //PD5 (OC1A) auf Ausgang
  TCCR1B =(1<<CS11); // Vorteiler 8
  TCCR1A = (1<<WGM12)|(1<<WGM13)|(1<<COM1A0); // CTC (TOP ICR1), PB0 
Ausgabe Toggle comp A
  ICR1 = 6000; // Timer Top

    while(1)
    {


  ADMUX = (1<<ADLAR)|(1<<MUX0); // 8Bit ADC an PA1
  ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2); //ADC Start, Vorteiler 16
  while  (ADCSRA & (1<<ADSC)){} //Warten bis Fertig
  Ergebnis = ((2000*ADCH)/255)+2000; // Takte 2000 (1ms) bis 4000 
(2ms) sind Servowerte (ADC Wert wird umgerechnet)


  OCR1A = Ergebnis ; // an OCR1A ausgeben






    }
}

von Ralf (Gast)


Lesenswert?

Mic schrieb:
> TCCR1A = (1<<WGM12)|(1<<WGM13)|(1<<COM1A0); // CTC (TOP ICR1), PB0

CTC? PWM!

von Mic (Gast)


Lesenswert?

Über PWM machen oder was ?

von Ralf (Gast)


Lesenswert?

Auf jeden Fall. Im CTC-Modus gibts ja nur einen Interrupt, wenn der 
Zählwert erreicht ist.

von Mic (Gast)


Lesenswert?

OK ich versuchs mal Danke,
hab vorher nur mit nem Attiny13 gearbeitet un bin neu beim Atmega16 
deswegen hab ich noch nicht so den Durchblick ;-)

von Ralf (Gast)


Lesenswert?

Der Tiny kann das auch!

von Mic (Gast)


Lesenswert?

AHA ok der Servo bewegt sich jetz ganz nach Rechts?
Denke irgendwas mit dem ADC stimmt noch nicht ! ?

neuer CODE:

  unsigned Ergebnis;
  Ergebnis = 0 ;
  DDRD = (1<<PD5); //PD5 (OC1A) auf Ausgang
  TCCR1B =(1<<CS11); // Vorteiler 8
  TCCR1A = (1<<WGM12)|(1<<WGM11)|(1<<WGM13)|(1<<COM1A1); // Fast PWM 
(TOP ICR1), PB0 Ausgabe clear bei comp A
  ICR1 = 24000; // Timer Top

    while(1)
    {


  ADMUX = (1<<ADLAR)|(1<<MUX0); // 8Bit ADC an PA1
  ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2); //ADC Start, Vorteiler 16
  while  (ADCSRA & (1<<ADSC)){} //Warten bis Fertig
  Ergebnis = ((2000*ADCH)/255)+2000; // Takte 2000 (1ms) bis 4000 (2ms) 
sind Servowerte (ADC Wert wird umgerechnet)


  OCR1A = Ergebnis ; // an OCR1A ausgeben

von Mic (Gast)


Lesenswert?

Ralf schrieb:
> Der Tiny kann das auch!

Aber hat nicht so ne tolle Auflösung

von Ralf (Gast)


Lesenswert?

Mic schrieb:
> Ralf schrieb:
>> Der Tiny kann das auch!
>
> Aber hat nicht so ne tolle Auflösung
>
Das ist richtig, für'n Servo ungeeignet. Beim 2313 sieht's da schon 
anders aus. Ich meinte auch nur das Prinzip.

von Ralf (Gast)


Lesenswert?

Mic schrieb:
> ICR1 = 24000; // Timer Top
> ...
> Ergebnis = ((2000*ADCH)/255)+2000; // Takte 2000 (1ms) bis 4000 (2ms)

Muss nicht TimperTop bei 20ms liegen (40000)?

von Mic (Gast)


Lesenswert?

Ralf schrieb:
> Muss nicht TimperTop bei 20ms liegen (40000)?


Ne das nehmen die Servos wohl nicht so genau hab immer wieder gelesen 
und gehört das die Pulszeiten nur wichtig sind, aber die Pause kann auch 
bei 10 ms liegen.

von Ralf (Gast)


Lesenswert?

TimerTop natürlich. Wie sich das p eingemogelt hat?

von Ralf (Gast)


Lesenswert?

Die absolute Gesamtzeit muss nur ungefähr stimmen, es kommt auf das 
Tastverhältnis an.
Und das sollte so etwa zwischen 1/20 und 1/10 liegen. Daher 1ms, 2ms, 
20ms.

von Mic (Gast)


Lesenswert?

Wie gesagt er bewegt sich schonmal aber ich denke irgendwas mit meinen 
ADC einstellungen passt noch nicht aber was :-) ?

von Ralf (Gast)


Lesenswert?

Mit welcher Frequenz läuft der Mega?

von Mic (Gast)


Lesenswert?

16 Mhz

von Ralf (Gast)


Lesenswert?

16000000/8/24000=83,33Hz PWM-Frequenz
Ist nicht viel Aufwand, probier mal 40000 ... :)

von Mic (Gast)


Lesenswert?

Ja ne dreht immer noch an Anschlag nur n bissl langsamer !

von Ralf (Gast)


Lesenswert?

Mic schrieb:
> TCCR1B =(1<<CS11); // Vorteiler 8

optimale Frequenz soll zwischen 50 .. 200 kHz sein. (Vorteiler 64)

von Ralf (Gast)


Lesenswert?

Ralf schrieb:
> optimale Frequenz soll zwischen 50 .. 200 kHz sein. (Vorteiler 64)
>
reicht noch nicht: Vorteiler 128!

von Mic (Gast)


Lesenswert?

Ok hab ich umgestellt aber fährt immer noch an Anschlag :-(

von Mic (Gast)


Lesenswert?

aber du meinst den ADC Vorteiler oder ?

von Ralf (Gast)


Lesenswert?

Mic schrieb:
> aber du meinst den ADC Vorteiler oder ?
ja, genau.

von Ralf (Gast)


Lesenswert?

Jetzt sehe ich es erst :-(
War ja die falsch Zeile, die ich kopiert habe.

von Ralf (Gast)


Lesenswert?

Fällt mir gerade noch ein:
Beim Tiny13 war's so, dass der ADC nach der Initialisierung bei der 
ersten Wandlung Mist berechnet. Ich weiß jetzt nicht, ob das bei allen 
AVRs so ist.
Nimm mal die Initialisierung aus der while Schleife raus!

von Ralf (Gast)


Lesenswert?

Datenblatt:
When switching to a differential gain channel, the first conversion 
result may have a poor accuracy due to the required settling time for 
the automatic offset cancellation circuitry. The user should preferably 
disregard the first conversion result.

Ob Umschalten oder das erste Mal einschalten dürfte egal sein.

von Bastler (Gast)


Lesenswert?

Ralf schrieb:
> es kommt auf das Tastverhältnis an.
Da wäre ich mir jetzt nicht so sicher. IMHO legt die High-Dauer die 
Position fest. Positionen -90° .. +90° entsprechen 1..2 ms.

von Mic (Gast)


Lesenswert?

So die is auch raus aber immer noch ! Verdammt !
ich habe gerade gelesen das ich im SFIOR Register noch den 
Wandlungsmodus bestimmen muss

http://elk.informatik.fh-augsburg.de/da/da-21/Tutorial/tutorial.html

aber im single conv. Mode wie bei mir wird er ja jedesmal erneut einzeln 
abgefragt oder ?

von Ralf (Gast)


Lesenswert?

Bastler schrieb:
> Da wäre ich mir jetzt nicht so sicher. IMHO legt die High-Dauer die
> Position fest. Positionen -90° .. +90° entsprechen 1..2 ms.

Da bin ich mir eigentlich sicher. Die Länge des Impulses legt natürlich 
die Position fest. Die Positionen und die Zeiten sind dabei ungefähre 
Werte. Ob dann die Periodendauer 20ms oder 23ms oder 18ms ist, ist 
wahrscheinlich egal. Eine Position die der Servo bei 2ms und 20ms 
Periode hat, hat er dann, denke ich mal, bei einer Periode von 22ms bei 
2,2ms. Ich würde die Periodendauer von 20ms jedenfalls einhalten. Kost' 
ja nix. :)

von Ralf (Gast)


Lesenswert?

Ist zwar Assembler, funktioniert aber:
1
UP_WertLesen:      ;Rückgabe in r25:r24
2
  sbi ADCSRA, ADSC
3
WertLesen1:
4
  sbic ADCSRA, ADSC
5
  rjmp WertLesen1
6
  sbi ADCSRA, ADSC
7
WertLesen2:
8
  sbic ADCSRA, ADSC
9
  rjmp WertLesen2
10
  in r24, ADCL
11
  in r25, ADCH
12
  ret
Einmal einlesen würde bei dir reichen, ich schalte vorher die Kanäle um.
Wenn's ganz genau sein soll, kann man nach der Initialisierung ja schon 
mal eine Abfrage vor der Schleife machen. Ich glaube, bei dir fehlt noch 
das wiederholte Setzen von ADSC vor jeder Messung. (Bin mir da nicht 
sicher.)

von Mic (Gast)


Lesenswert?

Ich hab jetz an den AREF-Pin 5V angelegt und jetz zittert der Servo ganz 
komisch ! Vielleicht hilft das weiter !

Ich dachte er bezieht die Ref-Spannung intern ?

von Ralf (Gast)


Lesenswert?

Mic schrieb:
> Ich hab jetz an den AREF-Pin 5V angelegt
Na, richtig anschließen musst du's schon!

Mic schrieb:
> ADMUX = (1<<ADLAR)|(1<<MUX0); // 8Bit ADC an PA1
=AREF ausgewählt.

Wie hast du das Poti angeschlossen? Welcher Wert?

Servo an der selben Spannungsquelle wie der Atmega? Nicht so gut! Ging 
bei mir auch nicht, wenn ich gleichzeitig noch den Programmer 
angeschlossen hatte.

von Mic (Gast)


Lesenswert?

Der Poti is an der selben Stromquelle wie der MC + an VCC Mitte an PA1 
und - an GND ,

den Wert weiß ich nicht genau aber der selbe hat beim Attiny super 
funktioniert

Der Servo hat - an GND des MC Mitte an PD5 und + am selben Netzgerät 
aber nicht an VCC des MC

von Bastler (Gast)


Lesenswert?

Ralf schrieb:
> Bastler schrieb:
>> Da wäre ich mir jetzt nicht so sicher. IMHO legt die High-Dauer die
>> Position fest. Positionen -90° .. +90° entsprechen 1..2 ms.
>
> ... Eine Position die der Servo bei 2ms und 20ms Periode hat,
> hat er dann, denke ich mal, bei einer Periode von 22ms bei 2,2ms.

Nein, die Periodendauer spielt für die Position definitiv keine Rolle.

Habe gerade zwischen 10 und 40 ms Periodendauer probiert.
Die Bereichszuordnung ist natürlich 1..2 ms -> -45°..+45°
MfG

von Ralf (Gast)


Lesenswert?

Mic schrieb:
> jetz zittert der Servo ganz komisch

Tritt normalerweise auf, wenn der Strom nicht reicht. Evtl. stürzt auch 
deswegen der Atmega ab.
Mach mal noch einen 'Startcode' rein. So in der Art:
LED an - Pause - LED aus

Wenns dann blinkt: Absturz -> Extra Spannungsversorgung für Servo.

von Mic (Gast)


Lesenswert?

Ich muss es jetz erst mal mit zwei verschiedenen Stromquellen versuchen 
und dann guck ich mal !

Bis erher erstmal vielen vielen Dank für die Geduld :-)

Bis Bald

von Karl H. (kbuchegg)


Lesenswert?

Ralf schrieb:

> wahrscheinlich egal. Eine Position die der Servo bei 2ms und 20ms
> Periode hat, hat er dann, denke ich mal, bei einer Periode von 22ms bei
> 2,2ms.

No.
Die Pause ist relativ uninteressant.
Das einzige was die Servoelektronik interessiert ist die Dauer des 
High-Pulses. Ob da jetzt nach dem Puls bis zum nächsten Puls 10, 12, 15 
oder eben 20ms vergehen, das ist der Servoelektronik völlig egal. Das 
hier immer wieder 20ms kolportiert werden hat einen ganz anderen Grund, 
der mit dem Servo an sich nichts zu tun hat.

> Ich würde die Periodendauer von 20ms jedenfalls einhalten. Kost'
> ja nix. :)

Im Prinzip: ja.
Praktisch: doch, das kostet was (manchmal/meistens).

Das Problem ist, dass sich viele Servo-Anfänger viel zu stark auf die 
20ms konzentrieren. Da werden dann Timer so eingestellt, dass die 20ms 
stimmen und für den eigentlichen Servopuls bleibt keine oder kaum mehr 
'Timer-Auflösung' übrig. Fazit: die 20ms stimmen zwar, aber man hat 
keine Positionierauflösung mehr. Dabei interessieren die 20ms aber gar 
niemanden! Es ist völlig unerheblich ob die stimmen oder nicht! Daher: 
Zuerst darauf konzentrieren, dass man den 1 bis 2ms Servopuls gut und 
einfach erzeugen kann und dann nachsehen ob man mit dieser Einstellung 
hinten nach noch eine Pause bekommt, die sich irgendwo im Bereich von 5 
bis 30ms bewegt.

Der Puls und seine Länge ist das Wichtige! Nicht die Pause hinten nach.

Modellbauservo Ansteuerung



> So die is auch raus aber immer noch ! Verdammt !
> ich habe gerade gelesen das ich im SFIOR Register noch den
>  Wandlungsmodus bestimmen muss

Machs doch nicht so kompliziert.
Im AVR-GCC-Tutorial gibt es ADC Routinen, die du mehr oder weniger 1:1 
übernehmen kannst und die dann auch funktionieren.

von Ralf (Gast)


Lesenswert?

Noch für einen Zwischentest:
Mal eine LED mit Widerstand nach Masse an den PWM-Ausgang und den Timer 
so einstellen, dass 'sichtbare' Zeiten rauskommen.
z.B.: kürzeste Zeit 1/10s, maximale Zeit 1s, Periodendauer 2s.

von Ralf (Gast)


Lesenswert?

@Karl Heinz
Beim Wettbewerb ;-) gefunden:

"Von der Standard-Pulsdauer 20 ms kann je nach Servomodell erheblich 
abgewichen werden. Besonders zu erwähnen ist, dass mit Periodenzeiten 
von 10 ms bereits erfolgreich gearbeitet wurde(, klick hier für Posting 
und ganzen Thread). Dabei muss aber die Pulsdauer entsprechend angepasst 
werden, bei 10 ms beispielsweise beträgt dann die Pulsdauer maximal 10 % 
der Periodenzeit, schwankt also für die Endstellungen zwischen 0,5 ms 
(500 µs) und 1 ms."
Quelle: http://www.rn-wissen.de/index.php/Servos

Entspricht dann eher meiner Theorie.
Wobei "mit Periodenzeiten von 10 ms bereits erfolgreich gearbeitet" so 
klingt wie: "Bei mir funktioniert UART mit internem Oszillator schon 
seit Jahren".

von Matthias (Gast)


Lesenswert?

Theorie hin oder her.
Ich habs hier gerade praktisch aufgebaut:
Periodendauer 10 ms, Pulsdauer 1,5 ms -> Mittelstellung

von Hannes L. (hannes)


Lesenswert?

Ralf schrieb:
> Entspricht dann eher meiner Theorie.

Halte ich aber für Quatsch.

Die Position von (einfachen) Modellbauservos wird einzig und allein von 
der Impulsbreite (1 ms bis 2 ms, bzw. 0,7 ms bis 2,3 ms) bestimmt. Der 
Impulsabstand hat zwar Einfluss auf Stellgeschwindigkeit, Drehmoment und 
Stromaufnahme, aber nicht auf die Position.
Ich versuche zwar auch meist, etwa 20 ms einzuhalten, habe aber auch 
eine Bastelei, wo der Servoimpuls alle 64 ms erzeugt wird (Bahnschranke 
mit Mega8, 2 Servos, mehreren Blinkgebern, Bimmel-Soundausgabe).

...

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch mal die Servosignal als Oszillogramm für 20 ms bzw. 20 ms 
Periodendauer. Der Servo befindet sich jeweils in Mittelstellung.

Unten ist der in der oberen Spur markierte Zeitbereich vergrößert 
dargestellt.

von Ralf (Gast)


Lesenswert?

Hannes Lux schrieb:
> Halte ich aber für Quatsch.

Quatsch, im Sinne von Unsinn?
Nur mal so theoretisch:
Gelten die absoluten Zeiten als Basis, dann muss der Servo doch eine 
ziemlich genaue Zeiterzeugung/ -messung integriert haben. Nimmt man das 
gesendete Puls-/ Pausenverhältnis als Takt, braucht er nur vergleichen!
Könnte so sein. Wie das wirklich gemacht wird und ob da bei den Zeiten 
'noch was geht'... von mir aus.

Nur, wenn man einen Fehler sucht: Standardwerte verwenden! (denk' ich 
mal)

von Matthias (Gast)


Lesenswert?

Ralf schrieb:
> Nur mal so theoretisch:

Die ganze Theorie und Bemerkung auf
http://www.rn-wissen.de/index.php/Servos
bezügl. 10 ms Periodendauer bleiben Theorie

Praktisch führt auch ein mit z.B. 100 ms Periodendauer ein Puls von 1,5 
ms zu Mittelstellung. Die Einstellzeit gegenüber 20 ms verdoppelt sich 
etwa.

@Ralf
Hast du einen Servo, der etwas anderes macht?

von Ralf (Gast)


Lesenswert?

Matthias schrieb:
> @Ralf
> Hast du einen Servo, der etwas anderes macht?
Ich hab's noch nie ausprobiert.

Matthias schrieb:
> Die ganze Theorie und Bemerkung auf
> http://www.rn-wissen.de/index.php/Servos
> bezügl. 10 ms Periodendauer bleiben Theorie
Naja, wenn's so ist:
Matthias schrieb:
> Praktisch führt auch ein mit z.B. 100 ms Periodendauer ein Puls von 1,5
> ms zu Mittelstellung. Die Einstellzeit gegenüber 20 ms verdoppelt sich
> etwa.
dann ist das keine Theorie, sondern (objektiv) falsch! [Mmmh: 'objekiv 
falsch' :-) ...]

von Rolf Magnus (Gast)


Lesenswert?

Zur Theorie und Praxis: In der Praxis ist es so, daß klassische 
Empfänger die 20ms überhaupt nicht konstant halten. Vielmehr variiert 
die Pausenzeit prinzipbedingt, abhängig von den Pulsen der anderen 
Servos. Also darf die Position gar nicht von der Pausenzeit abhängen.

von Hannes L. (hannes)


Lesenswert?

Ralf schrieb:
> Nur mal so theoretisch:
> Gelten die absoluten Zeiten als Basis, dann muss der Servo doch eine
> ziemlich genaue Zeiterzeugung/ -messung integriert haben.

Viel einfacher. Zumindest bei den Servos vor gut 30 Jahren, als man sie 
noch nicht "analog" nannte, weil es noch keine Digitalservos gab und die 
speziellen Servo-ICs noch in der Entwicklung waren.

Da wird einfach zum Impulsbeginn ein Monoflop getriggert, dessen 
Impulsdauer mit dem Poti im Servo gesteuert wird, also der Servoposition 
entspricht. Von außen anliegender Impuls und vom Monoflop erzeugter 
Impuls gingen auf eine (querstromfreie) H-Brücke. Im Ruhezustand bekommt 
der Motor auf beiden Seiten Minus, ist also aus. Nach Impulsbeginn 
bekommt der auf beiden Seiten Plus, ist also auch aus. Erst dann, wenn 
ein Impuls zu Ende ist, der andere aber noch nicht, bekommt der Motor 
für die Zeitdauer der Impulsbreitendifferenz einen kurzen Stromstoß in 
die entsprechende Richtung. Je öfter das geschieht, also je kleiner die 
Periode (ich will es hier lieber Impulsabstand nennen), desto kräftiger 
und schneller kann der Motor zur neuen Position laufen.

Heutige Analog-Servos haben spezielle ICs drin. Deren genaue Funktion 
kenne ich nicht. Ich vermute aber, dass sie immer noch nach demselben 
Prinzip arbeiten.

> Nimmt man das
> gesendete Puls-/ Pausenverhältnis als Takt, braucht er nur vergleichen!

Viel zu kompliziert, der Vergleich zwischen extern anliegendem Impuls 
und intern per Monoflop generiertem Impuls ist doch viel einfacher.

...

von Hannes L. (hannes)


Lesenswert?

Rolf Magnus schrieb:
> Zur Theorie und Praxis: In der Praxis ist es so, daß klassische
> Empfänger die 20ms überhaupt nicht konstant halten. Vielmehr variiert
> die Pausenzeit prinzipbedingt, abhängig von den Pulsen der anderen
> Servos. Also darf die Position gar nicht von der Pausenzeit abhängen.

Genau, der Empfänger konnte da nichtmal was dran drehen, denn die 
Impulse (Summensignal, Servotelegramm) wurden vom Sender anhand der 
Monoflop-Kette der Bedienpotis (Steuerknüppel) moduliert. Im Empfänger 
wurde die demodulierte Impulskette zum Triggern eines Schieberegisters 
genutzt, dessen Ausgänge (immer nur einer aktiv) die Servo-Impulse 
generieren. Um nun dieses Schieberegister zwecks Synchronisation löschen 
zu können, braucht es eine "Kana11-Kennung". Diese wurde dadurch 
erreicht, dass man nach dem letzten Kanal einen breiteren Impulsabstand 
gesendet hat. Diese Zeit hat gereicht, ein RC-Glied soweit umzuladen, 
dass es den Reset-Pegel für das Schieberegister erreichte. Die Zeiten 
der Kanalimpulse reichten dazu nicht.

Der Sender wurde also mit Impulsen von etwa 0,5 ms getastet, deren 
Abstände von einer Monoflop-Kette generiert wurde. Für jeden Kanal gab 
es ein per Poti (oder Schalter mit Widerständen) verstellbares Monoflop, 
für die Synchronisationspause ein weiteres fest auf etwa 4 ms 
eingestelltes Monoflop. Die Gesamtdauer des Telegramms betrug also nicht 
korrekt 20 ms, sondern die Summe der Kanalwerte plus Syncron-Pause.

Soviel zur Geschichte der Funkfernsteuerungen, die man damals noch nicht 
"RC" nannte. Das Wissen darüber stammt aus einem Buch der 
DMV-Amateurbibliothek vom Autor Günther Miel, das ich vor über 30 Jahren 
mal gelesen habe, aber selbst nicht besitze.

...

von Ralf (Gast)


Lesenswert?

Hannes Lux schrieb:
> Da wird einfach zum Impulsbeginn ein Monoflop getriggert, dessen
> Impulsdauer mit dem Poti im Servo gesteuert wird, also der Servoposition
> entspricht. Von außen anliegender Impuls und vom Monoflop erzeugter
> Impuls gingen auf eine (querstromfreie) H-Brücke. Im Ruhezustand bekommt
> der Motor auf beiden Seiten Minus, ist also aus. Nach Impulsbeginn
> bekommt der auf beiden Seiten Plus, ist also auch aus. Erst dann, wenn
> ein Impuls zu Ende ist, der andere aber noch nicht, bekommt der Motor
> für die Zeitdauer der Impulsbreitendifferenz einen kurzen Stromstoß in
> die entsprechende Richtung. Je öfter das geschieht, also je kleiner die
> Periode (ich will es hier lieber Impulsabstand nennen), desto kräftiger
> und schneller kann der Motor zur neuen Position laufen.
Und das ist doch mal zu 100% einleuchtend!
Die 20ms sind sicher historisch gewachsen (Fernsteuerung?) und stellen 
möglicherweise das Optimum der Leistungsausbeute dar (Stromverbrauch 
gegen Stellgeschwindigkeit, Haltekraft...)

P.S.: hab' zu langsam geschrieben. Hier steht's ja mit der 
Fernsteuerung:

Hannes Lux schrieb:
> Genau, der Empfänger konnte da nichtmal was dran drehen, denn die
> Impulse (Summensignal, Servotelegramm) wurden vom Sender
... usw. ...

von Ralf (Gast)


Lesenswert?

Ach so: Und warum sagt das den Roboter- und Servobastlern niemand?

von Rolf Magnus (Gast)


Lesenswert?

Ralf schrieb:
> Ach so: Und warum sagt das den Roboter- und Servobastlern niemand?

Weil die selber groß sind und dieses Wissen nicht geheim ist? ;-)

von Klaus (Gast)


Lesenswert?

Hannes Lux schrieb:
> Viel einfacher. Zumindest bei den Servos vor gut 30 Jahren, als man sie
> noch nicht "analog" nannte, weil es noch keine Digitalservos gab und die
> speziellen Servo-ICs noch in der Entwicklung waren.

Nun mach mal unsere Altvorderen nicht so schlecht ;-)

Wenn ich richtig suche, finde ich vielleicht noch ein so altes 
Datenblatt von einem Servocontroler IC, das genau das in einem Chip 
macht, was du im weiteren beschreibst. Wenn man die externen 
Kondensatoren für die Monos anders dimensioniert hat, konnte man das 
auch als Motorcontroler (für kleine Motoren) einsetzen.

MfG Klaus

von Klaus (Gast)


Lesenswert?

Ralf schrieb:
> Ach so: Und warum sagt das den Roboter- und Servobastlern niemand?

Weil man ein solches Signal gerne mit der PWM Einheit eines µC erzeugt, 
nennen die es "PWM". Und damit das dann in das Bild einer PWM passt, 
muß irgendwie das Puls/Pause Verhältnis da rein. Dann schließen sie ein 
solches Signal auch gern an eine H-Brücke oder eine LED an, und wundern 
sich, daß es nicht funktioniert.

MfG Klaus

von Hannes L. (hannes)


Lesenswert?

Klaus schrieb:
> Hannes Lux schrieb:
>> Viel einfacher. Zumindest bei den Servos vor gut 30 Jahren, als man sie
>> noch nicht "analog" nannte, weil es noch keine Digitalservos gab und die
>> speziellen Servo-ICs noch in der Entwicklung waren.
>
> Nun mach mal unsere Altvorderen nicht so schlecht ;-)
>
> Wenn ich richtig suche, finde ich vielleicht noch ein so altes
> Datenblatt von einem Servocontroler IC, das genau das in einem Chip
> macht, was du im weiteren beschreibst.

Da kannst Du ohne weiteres recht haben, meine Infos stammen aus einem 
Buch, das ich vor 30...35 Jahren mal las, dessen damaliges Alter mir 
entfallen ist und das von einem DDR-Verlag stammte. Da ist es gut 
möglich, dass da noch 10 oder mehr Jahre dazu kommen.

> Wenn man die externen
> Kondensatoren für die Monos anders dimensioniert hat, konnte man das
> auch als Motorcontroler (für kleine Motoren) einsetzen.

Nur waren diese Chips östlich des Zauns nicht oder nur schwer zu 
bekommen. Und was man nicht bekommt, das plant man auch nicht ein, hat 
etwas mit Realismus zu tun. ;-)

>
> MfG Klaus

...

von Hannes L. (hannes)


Lesenswert?

Klaus schrieb:
> Ralf schrieb:
>> Ach so: Und warum sagt das den Roboter- und Servobastlern niemand?
>
> Weil man ein solches Signal gerne mit der PWM Einheit eines µC erzeugt,
> nennen die es "PWM". Und damit das dann in das Bild einer PWM passt,
> muß irgendwie das Puls/Pause Verhältnis da rein. Dann schließen sie ein
> solches Signal auch gern an eine H-Brücke oder eine LED an, und wundern
> sich, daß es nicht funktioniert.
>
> MfG Klaus

Da stimme ich Dir uneingeschränkt zu.

...

von Ralf (Gast)


Lesenswert?

Klaus schrieb:
> Dann schließen sie ein
> solches Signal auch gern an eine H-Brücke oder eine LED an, und wundern
> sich, daß es nicht funktioniert.

So schlimm? ;-)

von Hannes L. (hannes)


Lesenswert?

Ralf schrieb:
> Klaus schrieb:
>> Dann schließen sie ein
>> solches Signal auch gern an eine H-Brücke oder eine LED an, und wundern
>> sich, daß es nicht funktioniert.
>
> So schlimm? ;-)

Ja.

Es ist sicherlich von Vorteil, das Steuersignal "Servoimpuls", bei dem 
es nicht auf den Tastgrad ankommt, sondern auf die Impulsbreite, von 
einem zur Drehzahlveränderung eines Motors oder Licht-Dimmung 
verwendeten PWM mit Tasgrad 0% bis 100% unterscheiden zu können. Nennt 
man Beides "PWM", so hagelt es Missverständnisse. Deshalb wehre ich mich 
dagegen, Servo-Impulse "PWM" zu nennen.

Ralf schrieb:
> Ach so: Und warum sagt das den Roboter- und Servobastlern niemand?

Weil es sinnlos ist und da ja sowiso keiner drauf hört. Es ist wie in 
fast allen anderen Sparten auch, einer guckt vom anderen ab und alle 
sind glücklich...

...

von Ulli B. (ulli-b)


Lesenswert?

Hannes Lux schrieb:
> Der Sender wurde also mit Impulsen von etwa 0,5 ms getastet, deren
> Abstände von einer Monoflop-Kette generiert wurde. Für jeden Kanal gab
> es ein per Poti (oder Schalter mit Widerständen) verstellbares Monoflop,
> für die Synchronisationspause ein weiteres fest auf etwa 4 ms
> eingestelltes Monoflop. Die Gesamtdauer des Telegramms betrug also nicht
> korrekt 20 ms, sondern die Summe der Kanalwerte plus Syncron-Pause.

Das kann ich so nicht ganz stehen lassen.
Es ist vom Prinzip her schon richtig, aber:
Die 20ms Impulspause sind ein Henne-Ei-Problem.

Um die Impulse von 8 Steuerkanälen plus Syncro-Pause zu übertragen waren 
wenn alle 8 Kanäle auf maximum stehen 8*2ms+4ms=20ms nötig.
Bei einer 2-kanaligen Fernsteuerung wurde der Syncro-Impuls jedoch von 4 
auf ca.16ms verlängert. So dass wieder für jedes Servo eine Impulspause 
von ca 20ms erreicht wird.
Dabei gilt jedoch, dass die 20ms nicht ganz exact 20ms sein müssen. Es 
können genauso gut 18ms oder 16ms sein. Das darf man nicht so eng sehen.

Dadurch war zu "Analogzeiten" auch die Kanalzahl der Fernsteuerungen auf 
8 begrenzt. Eine Kanalerweiterung war nur durch sequenzielle Übertragung 
möglich. Aber das führt jetzt hier zu weit.

Erst als digitale Anlagen heraus kamen waren auch mehr als 8 Kanäle 
möglich. An den Empfängern standen und stehen aber für den Servo wieder 
ein Impuls mit ca.20ms Impulspause an.

Der Umbruch kam durch die Kreiselsysteme für Modellhubschrauber.
Die Kreiselsysteme konnten den Servo für den Heckrotor sehr schnell 
ansteuern. Doch durch die 20ms Impulspausen hat dann der Servo den 
Regelkreis gebremst. Logische Folge: Es wurde ein Servo gebaut, welches 
eine wesentlich kleinere Impulspause verdauen kann. Dieser Servo konnte 
damals ausschliesslich an den passenden Kreiselsystemen betrieben 
werden. Es gibt auch heute noch solche Servo/Kreisel-Kombinationen.

Irgendwann kam dann jemand auf die Idee, dass es doch praktisch wäre, 
wenn nicht nur der Heckrotor sondern alle Funktionen schneller bedient 
werden könnten. Und ab da ging es dann drunter und drüber. Sender, 
Empfänger, Servos, alle wurden immer schneller und die Syncro-Pausen 
immer kürzer.
Jetzt gibt es inzwischen Servos, welche an einen digitalen Bus 
angeschlossen werden. Fragt mich nicht nach dem Protokoll, der Bus ist 
von Robbe / Futaba und heisst S-BUS (unter www.robbe.de nach S-BUS 
suchen).

Wie auch immer, die meisten Servos können eine Impulspause von 20ms 
verarbeiten. Die sogenannten "analogen" Servos auf jeden Fall, die 
"digitalen" meistens auch, jedoch nur meistens und nicht immer!

Und wie schon irgendwo weiter geschrieben: Zum Testen mit 20ms 
Impulspause anfangen.

MfG
Ulli-B

PS.: Es gäbe noch viel mehr zu schreiben und es gibt und gab auch einige 
Ausnahmen von dem oben gesagten, aber grundsätzlich stimmts ;-)

von Karl H. (kbuchegg)


Lesenswert?

Ralf schrieb:

> Die 20ms sind sicher historisch gewachsen (Fernsteuerung?) und stellen
> möglicherweise das Optimum der Leistungsausbeute dar (Stromverbrauch
> gegen Stellgeschwindigkeit, Haltekraft...)

Hat im Grunde damit immer noch nichts zu tun.
Es geht schlicht und ergreifend darum, dass man vom Sender zum Empfänger 
die Pulse der einzelnen Kanäle nacheinander übertragen muss. Man hat ja 
schliesslich nur eine Funkstrecke.

Und dann hat man  noch das Problem, dass der Empfänger in der Lage sein 
muss, den ersten Puls eindeutig zu identifizieren.

ALso macht man dieses hier auf der Funkstrecke (bei 3 Kanälen)


    +--+  +--+  +--+            +---+  +-+  +--+
    |  |  |  |  |  |            |   |  | |  |  |
 ---+  +--+  +--+  +------------+   +--+ +--+  +-----------

Die langen Pausen zwischen den Pulsgruppen sind lang genug, so dass der 
Empfänger eindeutig erkennen kann, dass jetzt eine neue Gruppe anfängt. 
Die Pausen zwischen den Pulsen reichen dazu nicht aus.

Der Empfänger reicht einfach jeden Puls, so wie er ihn bekommt auf den 
richtigen Ausgang weiter. Mehr tut er nicht. Die lange Pause sagt ihm, 
wann er beim ersten Kanal anfangen muss und die Pausen zwischen den 
Pulsen sagen ihm, dass jetzt der nächste Kanal kommt.

Und wenn man sich das jetzt aus Sicht eines einzigen Kanals ansieht

    +--+  +--+  +--+            +---+  +-+  +--+
    |  |  |  |  |  |            |   |  | |  |  |
 ---+  +--+  +--+  +------------+   +--+ +--+  +-----------

          <--------------------------->
                  ungefähr 20ms

dann stellt man fest, dass jedes Servo ungefähr alle 20ms einen neuen 
Puls bekommt. Daher kommen die 20ms.


Kanal 1
    +--+                        +---+
    |  |                        |   |
 ---+  +------------------------+   +----------------------

Kanal 2
          +--+                         +-+
          |  |                         | |
 ---------+  +-------------------------+ +-----------------

Kanal 3
                +--+                        +--+
                |  |                        |  |
 ---------------+  +------------------------+  +-----------


Wie das technisch im Empfänger gemacht wird/wurde, hat Hannes ja schon 
beschrieben. (Schieberegister und RC Glied, welche sich auflädt, wenn 
das Signal auf Low ist. Ist es lang genug auf low, dann überchreitet die 
Spannung am RC-Glied eine Grenze und setz das Schieberegister zurück. 
Ganz einfach). Die 20ms haben also erst mal nichts mit dem Servo selber 
zu tun, sondern kommen vom Synchronisiermechanismus mit dem sich der 
Empfänger mit dem Sender synchronisiert um die Pulse auf der Funkstrecke 
wieder den Servoausgängen zuordnen zu können.

Wenn ein Sender nur 4 Kanäle überträgt, dann ist die Zeit für 1 
Impulstelegramm kürzer als wie wenn der Sender zb 12 Kanäle überträgt. 
Beliebig hoch kann man mit der Anzahl der Kanäle daher auch nicht gehen, 
weil dann ganz einfach zu wenige 'Updates' in der Sekunde über die 
Funkstrecke kommen und sich das dann in merkbaren Verzögerungen 
bemerkbar macht. Aber ob die Pause hinter einem Impulstelegrom jetzt 10 
oder 12 oder 15ms lang ist, ist egal. Sie muss nur lang genug sein, dass 
das RC-Glied im Empfänger mit Sicherheit die Schwelle überschreitet, 
damit das Schieberegister zurückgesetzt wird.
Für das Servo an sich, spielt diese Pause daher überhaupt keine Rolle. 
Und es ist auch klar, dass zb bei einer senderseitigen Übertragung von 
10 Kanälen die Pause beim Servo(!) (nicht beim Empfänger) länger ist, 
als wie wenn der Sender nur 4 oder 6 oder 8 Kanäle überträgt. Denn die 
Pause auf der Leitung zum Servo ist ja die Summe aller Pulslängen plus 
die Länge der Synchronisierpause. Die Summe der Pulslängen hängt aber 
von der Anzahl der Pulse (und natürlich deren Länge) ab.

Und daher sind die 20ms bei einer Servoansteuerung so ziemlich das 
Unwichtigste überhaupt. Eine kleine Pause hinter dem Puls sollte sein, 
damit die Servoelektronik ihre Kondensatoren die im Regelmechanismus 
stecken auch wieder entladen kann, aber diese Pause braucht keine 20ms 
zu sein.

von Hannes L. (hannes)


Lesenswert?

Ulli B. schrieb:
> Um die Impulse von 8 Steuerkanälen plus Syncro-Pause zu übertragen waren
> wenn alle 8 Kanäle auf maximum stehen 8*2ms+4ms=20ms nötig.
> Bei einer 2-kanaligen Fernsteuerung wurde der Syncro-Impuls jedoch von 4
> auf ca.16ms verlängert. So dass wieder für jedes Servo eine Impulspause
> von ca 20ms erreicht wird.

Ja sicher doch, bei weniger Kanälen wurde die Sync-Pause verlängert um 
wenigstens halbwegs an die 20 ms heranzukommen. Tut mir leid, dass ich 
das nicht extra betont habe.

Ulli B. schrieb:
> Erst als digitale Anlagen heraus kamen...

Da halte ich mich raus. Die einzige neuzeitliche Anlage, mit der ich 
mich näher befasst habe, ist die 2,4GHz-Anlage "Planet T5" / "Planet 
R6m" von J.Perkins. Diese überträgt die Signale zwar digital, tut aber 
nach außen so, als wäre sie eine herkömmliche analoge Anlage. Die 
Empfänger liefern leider kein Summensignal. Die Servoimpulse kommen aber 
schön nacheinander, so dass man mittels 3 Dioden und einem PullDown-R 
(als wired OR) die Kanäle 1, 3 und 5 zu einem "Summensignal" 
zusammenfassen kann und über den Analog-Komparator des Tiny2313 einlesen 
kann (Pegel reicht nicht mehr für normalen Eingang). So kann man mit nur 
einem Eingang alle 5 Kanäle erfassen.
http://www.hanneslux.de/planet5b/index.html

@Karl-Heinz:
Volle Zustimmung...

...

von Mic (Gast)


Angehängte Dateien:

Lesenswert?

HI ! war jetz ne Zeit lang nicht mehr dran hab aber jetz mal ne einfache 
Zeichnung gemacht sowie alles angeschlossen ist !

Dann noch mein Code ! da ich denke das meine Berechnungen nicht ganz 
stimmen oder etwas anderes nicht stimmt wäre es nett wenn ihr mal 
drüberschauen könntet :-)

Danke



#include <avr/io.h>

int main(void)
{


  unsigned Ergebnis;
  Ergebnis = 0 ;
  DDRD = (1<<PD5); //PD5 (OC1A) auf Ausgang
  TCCR1B =(1<<CS11); // Vorteiler 8
  TCCR1A = (1<<WGM12)|(1<<WGM11)|(1<<WGM13)|(1<<COM1A1); // Fast PWM 
(TOP ICR1), PB0 Ausgabe clear bei comp A


          ICR1 = 40000; // Timer Top

    while(1)
    {


  ADMUX = (1<<ADLAR)|(1<<MUX0); // 8Bit ADC an PA1 u
  ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); 
//ADC Start, Vorteiler 128
  while  (ADCSRA & (1<<ADSC)){} //Warten bis Fertig
  Ergebnis = ((2000*ADCH)/255)+2000; // Takte 2000 (1ms) bis 4000 (2ms) 
sind Servowerte (ADC Wert wird umgerechnet)


  OCR1A = Ergebnis ; // an OCR1A ausgeben






    }
}

von Klaus W. (mfgkw)


Lesenswert?

Jedenfalls stimmt die Formatierung nicht :-)

von Mic (Gast)


Angehängte Dateien:

Lesenswert?

Ja hab gerade gemerkt das meine Zahlen bissl dumm waren habs geändert in 
...

von Karl H. (kbuchegg)


Lesenswert?

> da ich denke das meine Berechnungen nicht ganz stimmen

dann zeig doch mal deine Berechnnugen.
Im ganzen Thread gibt es ja von dir mitlerweile einen ganzen Haufen 
Zahlen. Nur die wichtigste ist nicht dabei: Wie schnell wird dein µC 
getaktet?


(PS: Es ist immer gut, wenn man die Dinge stufenweise in Betrieb nimmt. 
Wenn du gleichzeitig ADC und PWM in Betrieb nimmst, und nichts 
funktioniert, dann weißt du nicht, ob das Problem beim ADC oder beim PWM 
liegt. Ersetz doch mal deinen Wert, denn du vom ADC bekommst durch fixe 
128 (also Poti-Mittelstellung). Dann muss das Servo in Mittelstellung 
fahren. Wenn es das tut, dann weißt du, dass deine PWM richtig ist. Zum 
Gegentest auch mal andere Werte als 128 probieren. Klappt die PWM dann, 
kann man den ADC mit dazu nehmen. Wenn es dann nicht klappt, weißt du, 
dass das Problem diesmal beim ADC liegt, denn die PWM hast du ja schon 
getestet.

Programme immer so aufbauen, dass man möglichst Einzelkomponenten zum 
Testen hat, die von nichts anderem abhängen!

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> da ich denke das meine Berechnungen nicht ganz stimmen
>
> dann zeig doch mal deine Berechnnugen.
> Im ganzen Thread gibt es ja von dir mitlerweile einen ganzen Haufen
> Zahlen. Nur die wichtigste ist nicht dabei: Wie schnell wird dein µC
> getaktet?

Ich nehms zurück.
Irgendwo mitten drinn stand mal 16Mhz.
Sowas schreibt man sich immer entweder als Kommentar oder gleich als

#define F_CPU 16000000

in den Quelltext hinein. Denn in einem Jahr weißt du nicht mehr, auf 
wieviele Mhz die Konstanten damals gerechnet wurden.

von Karl H. (kbuchegg)


Lesenswert?

Wenn ein OCR Wetr von 62 ca 1ms ist, wie lange dauert dann ein PWM 
Zyklus, wenn du einen TOP Wert von
   ICR1 = 40000; // Timer Top
hast?

Und genau deswegen lässt man sich solche Sachen vom Compiler ausrechnen
1
#define F_CPU 16000000UL
2
#define VORTEILER 256
3
4
#define MS_1  (uint16_t)(  1 * F_CPU / VORTEILER / 1000 )
5
#define MS_20 (uint16_t)( 20 * F_CPU / VORTEILER / 1000 )
6
7
8
  ICR1 = MS_20;    // 20 Millisekunden
9
10
....
11
    Value = 127;   // probehalber, kommt später vom ADC
12
    OCR1A = Value * MS_1 / 256 + MS_1;


(Optimizer einschalten, damit der die Taktberechnungen gleich 
wegoptimiert. Das dein µC auch wirklich mit 16Mhz rennt, hast du 
kontrolliert? Spannungsversorgung vom µC und Servo sind ausreichend 
dimensioniert? Blockkondensatoren hast du an den Versorgungspins des 
µC?)

von Mic (Gast)


Lesenswert?

Wahnsinn !!! :-)

Dir muss ich einfach mal danken weil genau so stelle ich mir eine gute 
Hilfestellung vor wirklich damit kann ich nämlich etwas anfangen !
Da ich einfach noch nicht die Erfahrung habe ! Ich setze mich mal dran 
und dann nerv ich euch weiter ;-) !

von Mic (Gast)


Angehängte Dateien:

Lesenswert?

So hab jetz mal alles so geändert und funktioniert eigentlich alles 
einwandfrei :-)
Irgendwie hab ich die ganze Zeit mit diesen 16 Mhz gerechnet, ja sehr 
doof von mir da ich kein Quarz habe danke nochmal für den Hinweis.

Jetz noch meine Fragen:

1.
Dieser "Optimizer" was ist das und wie schalte ich den an ? hab schon 
gegoogelt aber nix tolles gefunden ?

2.
Der Servo bewegt sich nicht ganz nach Links und Rechts, also ca in einem 
Winkel von denke 45° ! Dass das so ist hab ich auch schon mal gelesen 
oder zumindest das es keine 90° sind , wie bekomme ich es jetzt noch hin 
damit er sich etwas "mehr" bewegt ?

von Mic (Gast)


Lesenswert?

3.
Nur noch so ne Frage nebenbei :

Ich habe von Conr.. ein Sende/Empfänger-Modul 868 Mhz, würde es 
funktionieren wenn ich die Signalleitung für den Servo
und am Empfänger den Servo anschließe ?

von Mic (Gast)


Lesenswert?

???

von Glaskugel (Gast)


Lesenswert?

Wenn das Modul die Impulse sauber überträgt (Pegel/Impulsform/Dauer), 
dann sollte das funktionieren, sonst eher nicht.
Aber woher soll hier jemand wissen, was du für ein Modul hast?

von Mic (Gast)


Lesenswert?


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.