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 } }
Auf jeden Fall. Im CTC-Modus gibts ja nur einen Interrupt, wenn der Zählwert erreicht ist.
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 ;-)
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
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.
Mic schrieb: > ICR1 = 24000; // Timer Top > ... > Ergebnis = ((2000*ADCH)/255)+2000; // Takte 2000 (1ms) bis 4000 (2ms) Muss nicht TimperTop bei 20ms liegen (40000)?
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.
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.
Wie gesagt er bewegt sich schonmal aber ich denke irgendwas mit meinen ADC einstellungen passt noch nicht aber was :-) ?
16000000/8/24000=83,33Hz PWM-Frequenz Ist nicht viel Aufwand, probier mal 40000 ... :)
Mic schrieb: > TCCR1B =(1<<CS11); // Vorteiler 8 optimale Frequenz soll zwischen 50 .. 200 kHz sein. (Vorteiler 64)
Ralf schrieb: > optimale Frequenz soll zwischen 50 .. 200 kHz sein. (Vorteiler 64) > reicht noch nicht: Vorteiler 128!
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!
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.
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.
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 ?
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. :)
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.)
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 ?
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.
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
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
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.
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
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.
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.
@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".
Theorie hin oder her. Ich habs hier gerade praktisch aufgebaut: Periodendauer 10 ms, Pulsdauer 1,5 ms -> Mittelstellung
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). ...
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.
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)
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?
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' :-) ...]
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.
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. ...
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. ...
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. ...
Ralf schrieb: > Ach so: Und warum sagt das den Roboter- und Servobastlern niemand? Weil die selber groß sind und dieses Wissen nicht geheim ist? ;-)
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
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
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 ...
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. ...
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? ;-)
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... ...
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 ;-)
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.
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... ...
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 } }
Ja hab gerade gemerkt das meine Zahlen bissl dumm waren habs geändert in ...
> 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!
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.
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?)
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 ;-) !
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 ?
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 ?
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?
Ist das hier: http://www.conrad.de/ce/de/product/190939/SENDE-EMPFAeNGERMODULSET-868MHZ/SHOP_AREA_17364&promotionareaSearchDetail=005
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.