Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

vro

RCLine User

  • »vro« ist der Autor dieses Themas

Wohnort: Berlin, Germany

  • Nachricht senden

1

Sonntag, 21. März 2010, 18:37

Genauigkeit von Servo-Impulsen

Hallo allerseits,

weiß jemand wie genau man die Länge der einzelnen Kanal-Impulse erzeugen muss, um ruhige Servobewegungen ohne Zittern zu erhalten?

Dabei meine ich zum Einen die systhematische Genauigkeit, dh. die Auflösung, die man für den Bereich von 0.9-2.1ms realisieren sollte (8bit, 10bit, 16bit?)

Zum Anderen aber auch, wie groß das "Rauschen" der Impulslängen (durch blockierende Interrupt-Routinen etc..) höchstens sein darf, damit die Servos nicht zittern.


Meine ersten Versuche mit Attiny's und 8bit-Timern waren dahingehend nämlich nicht allzu erfolgreich. ???


Grüße,
Roland
[SIZE=1]E-Copter 450 SX
EP100pro
HM 4#3
HM 5#5[/SIZE]

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

2

Sonntag, 21. März 2010, 18:52

Hi Roland,

mit der Auflösung (8 Bit, 10 Bit , mehr ist sinnlos) hat dein Problem nichts zu tun.

Es geht um das, was du als "Rauschen" bezeichnest (den sog. "Jitter").

Spitzenservos kriegen 1-2 µs noch mit und reagieren darauf mit Knacken oder Zittern. 3-5 µs Auflösung des Servo sind etwa Mittelklasse.

Mit einem 8-Bit-Timer (255 Steps) kann man problemlos jitterfreie Impulse erzeugen. Wenn´s bei dir nicht so ist, dann stimmt in deinem Programm was nicht.

Gruß,
Helmut

wurpfel1

RCLine User

Wohnort: CH-rheintal

  • Nachricht senden

3

Sonntag, 21. März 2010, 20:13

je nach reglerstrategie und präzision des poties reagiert ein srvo auf eine impulsänderung. da zudem noch spiel der zahnräder und achsen dazukommt wird in der praxis kaum mehr als 7bit positionsgenauigkeit erreicht, ohne last!


mit jedem 8bit-timer lässt sich ein ruhiges servo erreichen, wenn was zittert solltest du deine interruptroutinen optimieren oder besser gleich WEGLASSEN :D


belastet nun ein grösseres ruder oder ein klemmendes scharnier das servo kann es zu schwingen/zittern anfangen. um das zu berühigen hilft WENIGER auflösung.


ich habe dutzende modelle mit SPC-tastern vermessen, die allerwenigsten haben am ruder 6bit erreicht.



einen grundsätzlich anderen weg geht man mit openservo. durch den ersatz der servoelektronik sind alle regelparameter anpassbar, einige verwenden zb hall-effekt-lagesensoren mit 12bit auflösung. das resultat ist spektakulär:

superstarke und schnelle servos die NIE zittern :evil:

der sequencer ist schon eingebaut, das servo meldet drehwinkel, speed, strom, temperatur und vieles mehr zurück.

12servo-ballet
http://www.youtube.com/watch?v=Son-qYJPh30&feature=related

sequencer/konfigurator
http://www.youtube.com/watch?v=i8Xl9pHUiN8&feature=related

how-to
http://www.openservo.com/StepByStep


damit soll eine achtfüssige spinne gebaut werden, für fliessende, stetige bewegungen sind insgesamt 40servos verbaut, dank openservo ist das ganze einfach ansteuerbar und absolut zitterfrei ;)

bin schon zu alt zum spielen.. macht aber gleichwohl spass ;-)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »wurpfel1« (21. März 2010, 20:24)


vro

RCLine User

  • »vro« ist der Autor dieses Themas

Wohnort: Berlin, Germany

  • Nachricht senden

4

Sonntag, 21. März 2010, 20:28

Danke für eure Antworten

1-2 µs, das sind 8-16 Takte bei 8MHz. Klar dass das nicht hinhaut, wenn ich mit nem tiny13A mit einem 8bit-Timer 2 Inputkanäle auslesen und gleichzeitig 2x Software-PWM machen will (will einen Kreuzmischer bauen)
Habs nicht unter 50-60 Takte garantierte Antwortzeit geschafft, da ich viele Critical Sections im Programm hatte.


Bin jetzt dabei ein Program für einen ATtiny44 aufzusetzen. Den 16bit-Timer nehm ich für den gesamten 20ms Output-Zyklus. Gibt mir bei 8MHz,CLK/8 eine Auflösung von 1 µs und vor allem Hardware-PWM. Das sollte wohl hinhauen - im Simulator siehts schon ganz gut aus :)
Muss jetzt nur erstmal den neuen µC bestellen.

OpenServo werd ich mir mal angucken. Klingt interessant, scheint mir für mein Vorhaben aber wohl etwas hoch gegriffen.

Gruß, Roland
[SIZE=1]E-Copter 450 SX
EP100pro
HM 4#3
HM 5#5[/SIZE]

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

5

Sonntag, 21. März 2010, 20:56

Hi Roland,

warum nimmst du nicht gleich einen Mega8 (L) ?

Der ist -grob gesagt- so eine Art Standard für Modell-Projekte. 3 Timer (einer davon 16 Bit), Capture und Compare-Funktion bei 2 der Timer. Damit kann man eine Menge machen.

Den 16 Bit-Timer würde ich für´s Einlesen verwenden, einen der 8 Bitter für die Ausgaben, und den andern für den Check auf anliegendes Signal.

Bei 20 ms Ausgabe-framerate hast du alle Zeit der Welt für Rechnungen o.ä. Du musst dir zuerst immer einen (zeitlichen) Plan machen, wo wann was passieren kann/darf und darauf aufbauend dein Programm strukturieren. Eine gute Idee ist es auch immer, eingelesene Daten erst mal in buffern abzulegen, gfls. in der Hauptprogramm-Schleife zu verarbeiten und erst später wieder auszugeben. Wenn du z.B. eine der Einlese-ISRs als "pacemaker" verwendest, dann machen die keine Probleme mehr in den Ausgaben.

Das Einlesen ist idR die größte Hürde, da kommt´s dann auch drauf an an, wie deine Eingangsimpulse zeitlich zueinander aufreten.

Hier hat gerade Einer einen Mischer auf Basis des Tiny45 entwickelt, der deinem Vorhaben vielleicht nahe kommt:
http://www.rclineforum.de/forum/thread.p…did=271193&sid=


Gruß,
Helmut

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »haschenk« (21. März 2010, 20:58)


vro

RCLine User

  • »vro« ist der Autor dieses Themas

Wohnort: Berlin, Germany

  • Nachricht senden

6

Sonntag, 21. März 2010, 22:01

Hi Helmut,

Gegen den Mega8 spricht eigentlich nur die Größe. In PDIP 28 ist er halt doppelt so groß wie der Tiny44, und auf SMD-Bauteile löten hab ich (vorerst noch) keine Lust. Das ist für mich auch eher son Einstiegsprojekt zum warm werden mit der Materie. Platinen basteln kommt (vielleicht) später

Der kleine reicht aber auch, denn mit dem 16bit-Timer kann man sowohl Input als auch Output bedienen. Im Unterschied zu meiner ersten Programmversion kommt die Impulserzeugung jetzt komplett ohne Interrupts aus (eigentlich ganz ohne Code, wenn man's genau nimmt: Fast-PWM Mode 14). Ferner ist das Aulesen der 16bit Timestamps atomisch, also schnell, so dass sich parallel eingehende Pin-Change-Interrupts vom Input kaum blockieren dürften. Das Programm ist jetzt auch nur noch ein Viertel so lang. :ok:

Nun soweit die Theorie und Simulatorpraxis. Schaun wir was passiert, wenn echte Servos dran hängen.
Bis dahin lese ich mir mal den genannten Thread durch.

Roland
[SIZE=1]E-Copter 450 SX
EP100pro
HM 4#3
HM 5#5[/SIZE]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »vro« (21. März 2010, 22:05)


haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

7

Sonntag, 21. März 2010, 23:02

Hallo Roland,

"ganz ohne Interrupts" klingt jetzt auch ein bißchen übertrieben....
Die sind schon eine feine Sache, wenn man damit (in Echtzeit...) umzugehen gelernt hat.
In welche Sprache programmierst du denn ?
Ralf im zitierten thread hat z.B. in in BASCOM programmiert, aber die ISRs in Assembler, um den unnötigen overhead dafür in BASCOM zu vermeiden.
Ich mache solch kleine Sachen immer ganz in Assembler, da weiß man besser, wann was passiert, und kann effizient programmieren.

Und die Entwicklung (mit Mega8 ) mache ich mit der PDIP28-Version, idR auch mit Quarz, und die endgültige Version dann in SMD/QFP32, wo´s geht, ohne Quarz.

Mit dem Mega8 hat man bei der Entwicklung auch den Vorteil, daß man fast immer einen Port frei hat und Routinen zur Ausgabe in ein LCD mit ins Programm reinhängen kann (die Zeit dafür reicht idR locker). Zur Kontrolle/Fehlersuche (ob das Teil auch tatsächlich mit den Werten rechnet, von den man ausgeht, ist das eine große Hilfe.

Im Anhang ein Bild von einem PWM=>Servoimpuls-Umsetzer für 1s-Betrieb. Links der Entwicklungsaufbau, rechts die SMD-Version (12x15 mm, 0.5 gr). Muß so klein/leicht sein, weil es in kleine Flieger rein soll, z.B. Kyosho Minium. Es setzt die dort für die Bürstis übliche PWM in Servo-Impulse um; die steuern dann einen 1gr-China-Steller für BLs an. Bei der SMD-Version ist noch etwas getrickst; alle nicht benötigten Beinchen am µC abgemacht, das schafft Platz für die Leiterbahnen.


Gruß,
Helmut
»haschenk« hat folgendes Bild angehängt:
  • DSC01092.jpg

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »haschenk« (21. März 2010, 23:09)


vro

RCLine User

  • »vro« ist der Autor dieses Themas

Wohnort: Berlin, Germany

  • Nachricht senden

8

Montag, 22. März 2010, 00:19

Zitat

Original von haschenk
"ganz ohne Interrupts" klingt jetzt auch ein bißchen übertrieben....
Die sind schon eine feine Sache, wenn man damit (in Echtzeit...) umzugehen gelernt hat.
In welche Sprache programmierst du denn ?

Na zum Einlesen benutze ich ja Pin-Change-Interrupts, praktischer Weise auf verschiedenen Interruptvektoren, so dass man nicht mehr abfragen muss, wer den Interrupt ausgelöst hat - spart ein paar Takte in der ISR.
Ich denke damit kann ich dann hoffentlich 1µs Jitter einhalten.
Für die Impulserzeugung gehts wirklich super komfortabel ohne Interrupts: einfach die entsprechenden Timer-Register beschreiben, und schon liegen die Signale and OC1A und OC1B an :)

Das Ganze ist in Assembler. Muss eigentlich nur noch die Mischer-Arithmetik (Impulse werden momentan nur durchgereicht) und Plausibilitäts-Checks einbauen.

Deine SMD-Platine sieht ja wirklich winzig aus :ok: So klein brauchts hier nicht zu werden um in meinen ollen Nuri reinzupassen ;)

Roland
[SIZE=1]E-Copter 450 SX
EP100pro
HM 4#3
HM 5#5[/SIZE]

9

Dienstag, 23. März 2010, 12:43

Der Tiny44 ist für viele Modellbauanwendungen optimal: relativ klein, 16-Bit Timer, PC-Interrupts :)
Was mir grad beim durchlesen einfällt: zum Einlesen der Signale bietet sich auch der Input-Capture-Modus des 16-Bit timers an. Reicht zumindest für ein Eingangssignal :)

viele Grüße,
Hermann

vro

RCLine User

  • »vro« ist der Autor dieses Themas

Wohnort: Berlin, Germany

  • Nachricht senden

10

Mittwoch, 24. März 2010, 00:01

Zitat

Original von hoppppla
Der Tiny44 ist für viele Modellbauanwendungen optimal: relativ klein, 16-Bit Timer, PC-Interrupts :)

Stümmt, obwohl's jetzt ein Tiny24 geworden ist (wieder 50 Cent gespart :D )

Input-Capture hatte ich auch mal überlegt, geht aber glaub ich nicht, wenn ich den 16bit Timer im Fast-PWM-Modus benutzen will. Input wird also nach wie vor über Interrupt gemacht, dabei TCNT ausgelesen und am Pulsende auch gleich subtrahiert. Maximal könnte ich so um die 20 Takte Verzögerung reinkriegen, und zwar nur dann wenn, die Flanken beider Inputs genau zugleich eintreffen. Weiß gar nicht ob mein Empfänger das macht (R617FS)

Jedenfalls ist das Zittern weg, und mit den Chinaservos mit denen ich das grad probiert habe, merkt man keinen Unterschied, ob sie direkt am Empfänger hängen, oder an meiner Schaltung.

Gruß, Roland
[SIZE=1]E-Copter 450 SX
EP100pro
HM 4#3
HM 5#5[/SIZE]

11

Mittwoch, 24. März 2010, 09:38

Hallo,

Input-Capture geht nur dann nicht, wenn das Register zu Begrenzung der Auflösung des Timers benutzt wird (also ICR1 als TOP). Ist vom Modus unabhängig

viele Grüße,
Hermann