-
        

Ergebnis 1 bis 10 von 10

Thema: 24Servos per PWM mit einem Pic16F690 ansteurn

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.12.2007
    Beiträge
    10

    24Servos per PWM mit einem Pic16F690 ansteurn

    Anzeige

    Hallo,

    ich hab da ein Problem. Ich habe 24 Servos an meinem Bot und will alle durch einen uC ansteuern.

    Ich habe einige 8bit Schieberegister geholt und will das damit realisieren. Der Pic müsste auf höchstgeschwindigkeit laufen, daher ich 20Hz(24*50Hz=700Hz). Ich habe vor die 8Schieberegister an Port A zu verwenden und per Computer oder anderen Pic die Befehle zu übertragen.

    Um diesen Treiberbaustein zu realisieren muss ich wohl oder übel mit Assembler arbeiten(unter C wirds sonst ungenau).


    Jetzt kommt die eigendliche Fragestellung:
    Um ein PWM per Pollin zu erzeugen(was auch nötig wäre), bräuchte ich die Information, wie viele us ein NOP hat(uC hat einen 20MHz Quarz).
    Und gibt es vielleicht eine Liste von Befehlen(wo der Takt dabei ist)?
    Tutorials und bei spurt.de habe ich schon ne Liste gefunden, aber es enthält nicht den Takt.

    Ich hoffe das mir jemand da weiterhelfen kann, da es bis Weihnachten einigermaßen laufen muss.

    MfG

    El_Salvador

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Bei den PICern ist es, so, daß die Quartz frequenz durch 4 zu teilen ist, das ist dann 1 Cycle.
    Ein NOP braucht haarscharf 1 Cycle.
    Mit 20 MegaHerzen braucht ein NOP also 0,2 µS
    Was ein Befehl verbrät, steht auf jeden Fall in der "InstructionSet" Doku.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.12.2007
    Beiträge
    10
    Erstmal danke für die info mit den Nops.

    Ich habe nun ein 74HC595(Scieberegister), die für mein projekt verwenden will. Ich hab den mal zu Testzwecken mal proversorisch mal angeschlossen(ATX Netzteil) und bemerkt, dass er nicht will, wie ich es haben will.

    Bei "www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister" gabs zwar eine Schöne beschreibung, aber ahnscheinend mach ich immer noch was falsch. Wenn ich SCK mit den Finger berühre(gibt ja auch ein impuls und bei 5V reagiert er gar nicht), sind alle pins auf High(Auch wenn ich es gerade eben unter strom setze). Problematisch ist auch, dass ab und zu mal der SCK 3V hat.

    Mal sehen wie ich das angeschlossen habe,...:
    pin 1 bis 7 -> LEDs
    pin 8 -> masse
    pin 16 -> 5V
    pin 15 -> LED
    pin 14 -> ist mein Signal
    pin 13 -> masse
    pin 12 -> ist mein Clock
    pin 11 -> ist mein pin um das Signal auf das Register zu übernehmen
    pin 10 -> 5V
    pin 9 -> Not Connected

    So wie ich das verstanden habe, ist es so dass ich mit pin 14 und pin 12 Das Signal produziere und nach den 8bit(die ich so eingebe), gebe ich kurz 5V auf pin 11.

    Theroretisch müsste es ja genau so laufen^^.
    Kann mir da einer weiter helfen? Die Bauteile habe ich schonmal alle für das Projekt(Platine, 2x Pic16F690, 4x Schieberegister).

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    10.12.2007
    Beiträge
    10
    nach vielen Stunden des ausprobieren, hab ich endlich herrausgefunden woran es gelegen hat,... Oh man das Problem war, dass ich den Clock bzw meine Daten nicht auf masse gebracht habe. Ich bin doch nen Depp. So was einfaches, da hätte ich früher drauf kommen können. Jetzt löte ich mal alles zusammen. jetzt bin ich optimistisch, dass es klappt. obwohl mir nur noch zwei Tage bleiben^^. da muss ich mich eben rann halten.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.09.2007
    Beiträge
    162
    Ich will nicht unken... Ich habe vor einigen Wochen mehrere Varianten von 32-Kanal-PWM Treibern für den Parallax Propeller geschrieben (-> ewig langer Propeller Thread hier irgendwo)
    Das ist nicht ganz so trivial.. Ein COG im Propeller läuft etwa 10x so schnell wie ein 20 MHz PIC; ich brauche aber für die Organisation (umsortieren der Kanäle, um sie in der richtigen Reihenfolge zu schalten) einen großen Teil der 10 ms Periode....

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    53
    Beiträge
    114
    Also 24 PWMs gehen bei mir mit einem PIC 18F452 @ 20 MHz.

    Aber bis Weihnachten? Nie und nimmer.
    Hat mich Wochen gekostet, das auszutüfteln.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.09.2007
    Beiträge
    162
    Zitat Zitat von phaidros
    Hat mich Wochen gekostet, das auszutüfteln.
    Genau, darauf wollte ich hinaus Die "Organisation" ist nicht trivial, wenn man so enge Zeitbedingungen hat...

    Eventuell kann man gar nicht alle 20 ms einen "update" der Pulslängen zulassen, die ein Umsortieren der Liste zur Folge hätte, sondern nur der Reihe nach immer nur eines der 24... Dann macht sich eine Änderung aber erst nach 480 ms bemerkbar, das ist eher auch nichts...

    Eben viel Trickserei...

    Oder man muss die Auflösung von 1/256 auf 1/128 reduzieren.. (Mit dem Propeller konnte ich mir allerdings 1/1000 leisten )

    --
    Edit: Oops, Rechenfehler..

  8. #8
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    34
    Beiträge
    4.528
    Blog-Einträge
    1
    Tja man kann auch einfach ein SSC32 Board verwenden das kann locker 24 Servos ansteuern (sogar Synchron)

    Aber für meinen Hexa hab ich auch nen Propeller genommen und damit die 18 Beinservos angesteuert, das funktioniert jetzt wunderbar und auch schnell genug um im 50Hz Rythmus Signale an die Servos zu schicken.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    10.12.2007
    Beiträge
    10
    Hallo an alle, tut mir leid, dass ich solange nichts reingeschrieben habe, aber ich war im programmieren vertieft. Schade, dass ich nicht in diesen Zeitraum geschafft habe, aber ich gebe natürlich nicht auf Ich dachte eben, ich könnte es noch schaffen, wenn ich 48 stunden durscharbeite. Wollte eben nicht sein.


    Also soweit erstmal meine Rechnung:


    1/20MHz = 50us(0,000 000 05 s)
    1/50Hz = 20ms (0,02 s)
    20ms/256 (0,000 078 125s)

    (20ms/256)/50us = 1562,5 Nops ---> PWM Signal

    Bei so wenigen Nops, muss ich wohl ein 10bit PWM machen. 16bit hätte mich gefreut.

    @phaidros kannst du mir vielleicht einen Tip geben wie ich das verwirklichen kann, dass ich alle Servos per einen Schritt aktualiseren könnte, oder wie du das gemacht hast?

    Meine Idee war so, dass ich immer nach mein PORTC gefragt hätte, was ich verändern soll und mit PORTB hätte ich den dazugehörigen Servo ausgewält. Gleich danach würde der PIC den Wert in die Schieberegister speichen und den wert mit einem Schlag per RCK anzeigen lassen. Danach sollte er diese Schritte im while(1) immer wieder wiederholen.

    Die Werte sollten eben Global gespeichert werden und demnach wie viele Nops vergangen sind, sollte der Pic die Pegel auf Low setzen, um ein PWM zu erhalten, nach den 50Hz muss er eben alle wieder auf High bringen.

    Diese Werte müssen Global gespeichert werden, daher ich unter umständen nicht alle Servos verändere. Also PORTC --> Global --> PORTA

    Soweit meine Theorie

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    53
    Beiträge
    114
    War im Urlaub, deshalb die späte Antwort.
    Ich habe keine Schieberegister benutzt, sondern drei komplette Ports. Jedes Portbit hängt direkt an einem Servo.
    Weiter benutze ich einen Timerinterrupt, der die Ports setzt. 16 Bit Auflösung für die PWMs habe ich aber nicht, sondern nur 8 Bit.
    Die einzelnen PWMs werden im Hauptprogramm nach zeitlicher Dauer sortiert und in ein Array geschrieben, welches der Interrupt auswertet.
    Die ganze Steuerung ist zu komplex, um sie hier kurz darzustellen.

Berechtigungen

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