- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 17

Thema: Atmega168 Timer initialisieren und an/aus-schalten

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406
    JA, eine ähnliche Methode hatte ich schon verwendet, allerdings mit einem kleinen Fehler:
    Ich habe die Servosteuerzeiten direkt aneinander gereiht um die komplette Ansteuerung aller 12 Servos kurz zu halten....

    Wenn die 1. paar Servos größere Steuerzeiten hatten, hat sich der Impuls der letzten Servos umsoweiter verzögert - dadurch gabs dann eine unschöne Ansteuerung der Servos.

    Ein großes Problem nebenbei ist, dass ich sehr billige Servos verwende, und erstmal testen woltle, ob ich den Roboter zum laufen bekomme eh ich da richtig Geld reinstecke! (die Servos laufen generell nicht ganz flüssig)

    Ich werde mal deinen Weg probieren! Wenn ich die Servowinkel auf +-45° Beschränke (weil ich nicht mehr benötige) komme ich auf eine Periodenzeit von 21 Sekunden, im Schlimmsten Fall 24 Sekunden.
    Generell werde ich das mit dem Versatz berücksichtigen und alles Servos im 1,75 / 2 ms Takt ansteuern anstatt sie aneinander zu reihen.

    Mit den vielen Timern meinte ich, je mehr Timer man hat, desto mehr kann man den MC entlasten und die Servo-Ansteuerung in die "Hardware" verlagern. ....das hätte sicher auch seine Vorzüge.

    Aber generell benötigen die Berechnungen für die aktuellen Beinpositionen 5 ms - das heißt pro 20-ms Periode habe ich noch 15 ms den Controller was anderes tun zu lassen (z.B. den Weg berechnen).
    Später wird der MC sowieso ausgewechselt!

    Danke für die Hilfe, ich werde berichten wenn es etwas neues gibt

    Gruß Erik
    Meine Projekte auf Youtube

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Hi Erik.
    ... ähnliche Methode ... verwendet ... Servosteuerzeiten ... aneinander gereiht ...
    Das Aneinanderreihen geht offensichtlich auch, obwohl da die Pausen zwischen den Pulsen z.T. ziemlich variieren. So stehts jedenfalls in vielen Beiträgen hier und in anderen Foren. Ich wollte bei meiner Lösung einfach, soweit es möglich ist, zweifelsfrei reproduzierbar genau sein, ob es nun nötig ist oder nicht.

    ... großes Problem nebenbei ist, dass ich sehr billige Servos verwende ...
    Gibts damit Probleme? (kopfschüttel) Ich verwende die Carson CM-1 (ganz offensichtlich dasselbe wie früher Conrads ES-2) - hatte ich für 395 als Auslaufmodell noch schnell gekauft. Ausserdem laufen noch zwei RS-2 mit - schauderhafte Langsamkeit und SEHR weicher P-Regler :-/. Die Carsons laufen bei mir prächtig. Bauteilunterschiede werden durch einen Offset in der "finalen" Ansteuerung ausgeblendet, siehe Code

    Code:
    // - - - - - - - - - - - - - - -
        Svpt ++;                    // Pointer eins rauf für nächsten, aktuellen Servo
        if ( (Svpt < 1) || (Svpt > Svmx)) Svpt = 1; // Definierten Wert eingrenzen
    // - - - - - - - - - - - - - - -
    //      Für den aktuellen Servopointer liegt ein korrekter Wert vor
    //      Jetzt wird der aktuelle Srv_tm-Wert in zulässige Schranken eingegrenzt
    //      und vor dem Setzen geoffsettet.  
        if ( Srv_tm[Svpt] < SerMin [Svpt] ) Srv_tm[Svpt] = SerMin [Svpt];
        if ( Srv_tm[Svpt] > SerMax [Svpt] ) Srv_tm[Svpt] = SerMax [Svpt];
    // - - - - - - - - - - - - - - -
        if (Svpt ==  1) PORTB |=  (1<<1);   //
        if (Svpt ==  2) PORTB |=  (1<<2);   //
        if (Svpt ==  3) PORTD |=  (1<<3);   //
        if (Svpt ==  4) PORTD |=  (1<<4);   //
        if (Svpt ==  5) PORTD |=  (1<<5);   //
        if (Svpt ==  6) PORTD |=  (1<<6);   //
        if (Svpt ==  7) PORTD |=  (1<<7);   //
        if (Svpt ==  8) PORTB |=  (1<<0);   //
        if (Svpt ==  9) PORTC |=  (1<<0);   //
        if (Svpt == 10) PORTC |=  (1<<1);   //
    // - - - - - - - - - - - - - - -
    //  OCR1B   = Srv_tm[Svpt];     // Rampe ist durch Stellwert Srv_tm definiert
        OCR1B   = Srv_tm[Svpt] + Seroff [Svpt]; // Stellwert evtl. korrigieren
        TIFR1  |=  (1<<OCF1B);      // Klappt nur wenn dies gesetzt wird
        TIMSK1 |=  (1<<OCIE1B);     // Tmr/Cntr1 CompB Match interrupt enabled
    // - - - - - - - - - - - - - - -
    ... komme ich auf eine Periodenzeit von 21 Sekunden, im Schlimmsten Fall 24 Sekunden ...
    Ähhh - Schreibfehler, gelle! Das sind drei Zehnerpotenzen weniger - ist schon klar.

    ... Versatz berücksichtigen ... Servos im 1,75 / 2 ms Takt ... anstatt sie aneinander zu reihen ...
    Nochmal - ich bin nicht der Meinung, dass es notwendig ist diesen Versatz zu vermeiden, dazu kenne ich zu viele Aussagen, dass dies keine Rolle spielt. Aber bei mir klappts bestens, die Routine steht, was soll ich also ändern. Nebenbei bemerkt: von restlichen Timern ist nur mein traditioneller 50µs-heartbeat belegt. ABER - mit dem 16bitter kann ich eben so präzise unterteilte Signalpulse ausgeben, dass von daher kein Störungseinfluss zu erwarten ist.

    Wenn Du den kompletten Code für die Timer brauchst, kriegste auch. Aber ohne Garantie



    Nachbemerkung: ein paar ES-2er und die Carsons waren mir vor Jahren ziemlich schnell über den Jordan gegangen, deswegen hatte ich die gehackt (siehe mein Getriebemotorthread und meine autonomen Dosen) - seither laufen die STUN DEN LANG
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406
    Hallo,

    kleine Rückmeldung!

    Natürlich meine ich Millisekunden!

    Code ist fertig geschrieben - das mit dem Timer funktioniert ja super so - und der Code ist jetzt winzig.
    Es war mir leider vorher nicht bewusst wie man mit dem PWM-Timer CompA/CompB arbeiten kann...
    Die Zeiten sind sehr präzise! (Könnte nicht besser sein)

    Leider habe ich heuet nicht die Möglichkeit den Roboter mit dem Code zu "füttern" - das kommt dann morgen!

    Für den 16-Bit Timer habe ich jetzt einen Bereich von 1 ms (15999) bis 2 ms (31999) für die Stellzeit der Servomotoren. (Das ist mehr als genug)
    Ich hoffe nur, dass mir nie das Interrupt beim Schreiben der 16-Bit-Werte dazwischen funkt. Wie könnte man denn den Timer dafür pausieren?


    Zum Servo: Ich verwende die billigen Mini-Servos Y-3009 von C*** - einer ist mir schon durchgebrannt
    Schließe ich einen größeren (billigen) RS-2 an läuft dieser seidenweich!

    Gruß Erik
    Meine Projekte auf Youtube

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    ... Ich hoffe nur, dass mir nie das Interrupt beim Schreiben der 16-Bit-Werte dazwischen funkt ...
    Hoffe nicht, die Hoffnung stirbt doch immer - zwar zuletzt, aber doch. Lies lieber das Datenblatt für ATmega48A/PA/88A/PA/168A/PA/328/P, 8271E–AVR–07/2012, S 114, "16.3 Accessing 16-bit Registers". Am Besten vorm Schlafen gehen, dann schläfst Du ruhig(er). Ist sozusagen der "atomar"-Trick der Atmel-Leute.

    ... und der Code ist jetzt winzig ...
    Na ja, trotz meiner bescheidenen Cäh-Kenntnisse siehts manchmal ganz gut aus - und ich liebe es beautiful - ähhhh - small!

    Na ja, der RS-2 fährt seidenweich - aber drück mal dagegen. Erst leichter, dann fester - zumindest meiner hat eine lausige Nachgiebigkeit - sieht nach ziemlich wenig Steifigkeit im Regler aus . Ja, den 3009 hab ich auch, aber noch nicht getestet, noch nie betrieben. Hoffentlich halten die bei mir ne Weile.
    Geändert von oberallgeier (09.01.2013 um 22:52 Uhr)
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406
    So war heute fleißig und habe den Code übertragen und angepasst.
    Die 2. Servos fordern mein 15 V 3 A Schaltnetzteil ganzschön... aber es funktioniert - sehr schöne (im Verhältnis zu vorher) Ansteuerung der Servos!!!

    Aber für heute reichts dann auch. Morgen werde ich die Servos noch kallibrieren so, dass kleine Offsets ausgeglichen werden...
    Dann wird eine Laufbewegung geschrieben.

    Danke für den Hinweis mit den 16-Bit Registern, ich habe unter dem Suchbegriff gleich das richtige gefunden - Hauptargument "cli()" mit anschließendem Widerherstellen des SRegisters.

    Wenn der Roboter (hoffentlich) am Wochenende läuft werde ich weiter berichten.
    Meine Projekte auf Youtube

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    ... Die 2. Servos fordern mein 15 V 3 A Schaltnetzteil ganzschön ...
    Servos des Typs *3009 benötigen ca. 150 bis 300 mA. Bei 12 Servos hast Du dann rund 200 mA zur Verfügung - und verheizt ca. 66 % der Energie ab Schaltznetzteil-Ausgang. Aber das ist Dir hoffentlich klar. Übrigens gibts alte Notebook-Netzteile die auch 15V machen und meist 5A. Nur mal so als Tipp.

    ... Hinweis mit den 16-Bit Registern ... Hauptargument "cli()" mit ...
    Hmmmm. Hast Du Dir Deine *.lls durchgelesen? Und das oben genannte Datenblatt - an der genau beschriebenen Stelle?

    Zitat Zitat von 8271E–AVR–07/2012
    ... Accessing the low byte triggers the 16-bit read or write operation ...
    Und der kluge Compiler schickt eben erst das highbyte los - siehe *.lls. Da kann das cli/sei-Pärchen doch entfallen!? Ok, ich drück mich manchmal zu lasch aus . . . .

    Nachtrag:
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Servos des Typs *3009 benötigen ca. 150 bis 300 mA ...
    Wenn man keine Ahnung hat - einfach mal Klappe halten. Die Stromaufnahme war von mir geraten. Eben habe ich nachgesehen - NEIN , im Datenblatt schreibt das wohl kein Hersteller und auch der gute Sven Brandt (klick mal) hatte mit diesem Typ keine Messung gemacht. Ich hatte ihn an ein simples Netzteil gehängt mit ner einstellbaren Strombegrenzung. Der Servo läuft bei Einstellung unter 700..800 mA bei 6V ruckartig . . . erst über 800 mA ist ein glatter Lauf mit meinem Selbstbau-Servotester möglich.
    Geändert von oberallgeier (11.01.2013 um 17:58 Uhr)
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406
    Rückmeldung:

    Heute bin ich fertig geworden, er läuft! Zwar erstmal nur geradeaus, aber mit einem guten Tempo (20 mm/s).
    Die Servos laufen auch unerwartet gut (nachdem mir beim frühzeitigen Testen schon einer durchgebrannt ist).
    Aus diesem Grund gabs bis jetzt auch nur 5 V bei einem durchschnittlichen Strom von knapp 1 A für alle 12 Servos.

    Der Code zum Ansteuern der Servos ist jetzt sehr übersichtlich, leider muss ich den restlichen Code noch "aufarbeiten" - das Vorzeichen-wirrwarr ist sehr unübersichtlich.

    Der Aufbau ist, wie auf dem Foto zu sehen sehr provisorisch. Die Beine sowie der Rahmen sind aus Acrylglas CNC-gefräst. Eigentlich hatte ich eine eigene Steuerung/Platine geätzt - leider mit Layout-Fehler. Die Masse der Servos ging zu dicht am Microcontroller vorbei und hatt diesen bei größeren Strömen resetet. Deshalb habe ich mir provisorisch einen Adapter für die RNMini-Control gefräst. Dem entsprechend sieht die Verkabelung aus...
    Leider habe ich keinen passenden Akku - darum hängt der Roboter am Kabel...

    Ein kleines (unscharfes) Video gibt es auch:
    http://www.youtube.com/watch?v=S9qdJ...8qQyZw&index=1

    (Alte Handykamera - das Smartphone-Zeitalter hat mich noch nicht erreicht)

    Gruß Erik
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Quad4.jpg  
    Meine Projekte auf Youtube

Ähnliche Themen

  1. LED an und aus schalten
    Von Lightstorm im Forum C - Programmierung (GCC u.a.)
    Antworten: 23
    Letzter Beitrag: 12.03.2010, 10:49
  2. Timer 2 als PWM bei Atmega168
    Von timmy83 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 23.03.2008, 16:49
  3. Über USB einfach ein und aus schalten
    Von Forchtenauer im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 8
    Letzter Beitrag: 10.03.2008, 23:59
  4. Timer und PWM im Tiny25 initialisieren ?
    Von grumpf im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 27.01.2008, 19:58
  5. Problem mit Timer und Atmega168
    Von applican im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 26.07.2007, 01:25

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests