-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Motor PWM 19KHz?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414

    Motor PWM 19KHz?

    Anzeige

    Hallo,
    nach einem tieferen Blick in die Motorsteuerung vom RP6 komme ich ins stutzen...
    Dort wird FastPWM mit Vorteiler 1 und einem ICR1 von 210 aufgesetzt, OCR1xL legt dann das Pulsverhältnis fest.
    Das soll dann eine PWM Frequenz von 19KHz ergeben denn ICR1 legt zusammen mit dem Vorteiler 1 ja die komplette Impulslänge fest.

    Für Dummies wie mich wird das hier: http://www.avrfreaks.net/index.php?n...=78780&start=0 auch noch mal genau beschrieben.

    Code:
    1. Look at table "Waveform Generation Mode Bit Description" in Timer1  section of the datasheet. Pwm mode is chosen with bits WGM13:10. Let us  set mode 14, fast pwm. 
     Code:
    
     TCCR1A.WGM10 = 1 
    TCCR1A.WGM11 = 1 
    TCCR1B.WGM12 = 1 
    TCCR1B.WGM13 = 0 
     
     In the same table you can see TOP=ICRn. We use timer1, so Top will be ICR1. 
     
    2. Set frequency. 
    Timer with no prescaler inrements in every period of the oscillator frequency (20 MHz here).  
    40 kHz is 500 times less than 20 MHz. So we need 500 steps of timer for 1 period of 40 kHz signal. 
     Code:
     ICR1 = 500 
    
     . 
    3. Set duty cycle 25%.  
    See table "Compare Output Mode, Fast PWM". 
    Here we set levels of the output.  
    Use "Clear OCnA/OCnB on Compare Match, set OCnA/OCnB at BOTTOM". 
    Duty cycle is set with output compare register OCR1A. 
     Code:
     TCCR1A.COM1A1 = 1 
    TCCR1A.COM1A0 = 0 
    OCR1A = 125         ( = 25% of ICR1) 
     
     The frequency output is on the pin OC1A. 
     
    4. Set OC1A as output and start timer1. 
     Code:
    
     DDRD.5 = 1 
    TCCR1B.CS10 = 1 
    
      
     
    Function: 
    Timer1 starts counting from 0. OC1A is high. 
    After timer reaches value of OCR1A, OC1A goes low. 
    After timer reaches value of ICR1 (Top), timer resets and OC1A goes high.
    Berechne ich aber die üblichen 8MHz und ICR1 = 210 mit diesem Beispiel, komme ich auf ca. 38 khz .. und nicht 19 Khz.
    Für 19 KHz bzw. 19000 pwm Zyklen/sec müsste ICR1 = 421 haben denn 421x19KHz ergibt 7999000... nicht 210x19KHz

    Meine Frage daher.. ist das Beispiel da falsch, hab ich mich wo verrechnet... oder läuft unsere MotorPWM tatsächlich mit 38KHz statt mit 19 KHz wie in der Docu beschrieben?

    Irgendwie sieht mir das eher nach einer Steuerung zum dimmen von LEDs aus, muss die Frequenz tatsächlich so hoch sein?
    Werden die Motoren dadurch nicht zu Ultraschallquellen? Reichen PWM Frequenzen von 50-400 Hz nicht auch aus? (selbst auf die Gefahr hin, das die Motoren dann "brummen" oder "singen" wie z.B. moderne Eloks es auch tuen)

    Für Motoren mit kleinen Induktivitäten wie unsere braucht man grundsätzlich hohe Frequenzen? Das ist so die Schlußfolgerung, die ich aus diversen Beiträgen rauslese.. dort spricht man aber üblicherweise von 8-16 und max 32 khz.

    Ich wüsste halt gerne, ob man die Motor PWM Taktung runter setzen und dann ggf. durch eine SoftwarePWM laufen lassen kann.
    http://www.mikrocontroller.net/articles/Soft-PWM
    Für so hohe Frequenzen ist das jedoch recht ineffizient.

    LG Rolf
    Geändert von RolfD (15.08.2012 um 15:44 Uhr)
    Sind Sie auch ambivalent?

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    Das ist das Setup des Timers beim RP6:

    Mode 10, Phase Correct mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz

    Hier betreibe ich damit eine Servoansteuerung:
    http://www.roboternetz.de/community/...l=1#post447000

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Hm..

    Zitat Zitat von radbruch Beitrag anzeigen
    8MHz/420=19047,6Hz
    Wieso 420 wenn doch 210 ins Register geschrieben werden? Das genau verstand ich eben nicht... weil 8MHz/210=38095,2Hz

    Aber ich habs...
    Das hat mit Unterschieden im Mode 10 (PWM, Phase Correct) und Mode 14 (Fast PWM) (vergleiche Seite 109 im Dataheet) zu tun.

    Demnach berechnet sich der Wert für das ICR bei FastPWM mit 8MHz/ICR1=Zyklus und bei PWM zu 8MHz/(ICR1*2)=Zyklus.
    So les ich jedenfalls die Formeln auf Seite 100 und 101 im PDF... würde dann auch erklären warum "halber" ICR1 Wert und doch 19 Khz.

    Vielelicht kann noch jemand was zum Thema "Frequenz runter setzen" was sagen?

    Danke und Gruß
    Sind Sie auch ambivalent?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    Hallo,

    die Treiberstufen sind so dimensioniert, dass die hohe Frequenz kein Problem darstellt.
    19kHz weil das gerade ausserhalb des menschlichen Hörbereichs liegt.


    > FastPWM

    Wie mic schon sagt und auch in den Kommentaren der Lib steht, ist es phase correct PWM.


    > Ich wüsste halt gerne, ob man die Motor PWM Taktung runter setzen

    Du darfst gerne mit den Motoren Musik machen wenn Du magst
    Das hat auch soweit ich mich erinnere mal wer für den RP6 gemacht, find ich aber auf die schnelle nicht mehr.
    Beim ASURO klingt das jedenfalls so:
    http://www.youtube.com/watch?v=FNPMCI5b8Ys




    > und dann ggf. durch eine SoftwarePWM laufen lassen kann.


    Wozu denn?


    MfG,
    SlyD

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Zu "Frequenz runter setzen": Ein einfacher Ansatz wäre der Prescaler, 19kHz/8 ergibt 2,4kHz und 19kHz/64 sind ca. 300Hz.

    Neuen Prescaler in TCCR1B setzen:
    Code:
    	TCCR1B =  (1 << WGM13) | (0 << WGM12) | (1 << CS11) | (1 << CS10); // prescaler /64, 300Hz
    FAST PWM zählt von bottom zu top, Phase Correct zählt jedoch von bottom zu top zu bottom. Deshalb dauert ein Zyklus doppelt so lange.
    Geändert von radbruch (15.08.2012 um 18:51 Uhr) Grund: "Neuen Prescaler in TCCR1B setzen" eingefügt

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Hallo,
    der singende Asuro.. wie süß
    Ich kannte nur das hier http://www.youtube.com/watch?v=yHJOz_y9rZE

    Neee es geht mir darum, wie im FreeRTos Thread beschrieben den Timer1 frei zu kriegen bzw. die Motor-PWM evtl. anders zu generieren...
    Das ist in der RP6 Lib alles schon gut so gelöst... hilft mir aber nur bedingt.

    Das mit dem prescaler 8 versuch ich glaub ich mal. Danke

    Noch ne Frage... kann man im PWM Mode zusätzlich ein Timerinterrupt auslösen lassen wenn die bottom ond/oder top werte erreicht werden? Da könnte ich ja den Tasksheduller dann reinhängen.

    Gruß Rolf
    Sind Sie auch ambivalent?

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    ... kann man ... zusätzlich ein Timerinterrupt auslösen lassen, wenn die bottom ond/oder top werte erreicht werden?
    Na, genau das mache ich hier:
    Code:
       TIMSK |= (1 << TOIE1); 		// Die Timer1 Overflow-ISR zur Servoansteuerung
    (Aus http://www.roboternetz.de/community/...l=1#post447000)

    Jedesmal, wenn bottom erreicht ist, wird ein Overflow-Interrupt ausgelöst und die dazugehörige ISR ausgeführt:

    Code:
    ISR (TIMER1_OVF_vect)
    {
    ...
    }


    btw.: http://www.roboternetz.de/community/...eeRTos-auf-RP6

    Und das noch:

    http://www.roboternetz.de/community/...l=1#post459189
    Geändert von radbruch (15.08.2012 um 20:20 Uhr) Grund: btw

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Danke!

    Edit: Ach Radbruch.. ich seh grad dein BTW Edit... ja wir haben schon mal hin und her überlegt... ich habs nicht aus den Augen verloren.
    Na ich denke, die Chancen stehen nun recht gut für RP6RTOS

    Und noch nen Edit:
    Wer wissen möchte wie das mit den Laufwerken geht....
    http://georgewhiteside.net/projects/diskette-organ/

    LG Rolf
    Geändert von RolfD (16.08.2012 um 16:45 Uhr) Grund: radbruchs btw edit & Link
    Sind Sie auch ambivalent?

  9. #9
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Hallo,
    also ich hab das mal ausprobiert mit prescaler 64 im Example_05_Move_01 und komme zu etwas unerwarteten Ergebnissen.
    Der Bot neigt nun im Leerlauf aufgebockt dazu, "zu schwingen" .. das heist die Drehzahl beider Ketten steigt... sinkt.. steigt sinkt.. etwa im 2 Sekundentakt und unabhängig von einander, manchmal bleiben sie kurz ganz stehen und schwingen dann auch nach "oben" in der Drehzahl aus. Es gibt aber auch Phasen, wo sich die Drehzahlen auf einen kontinuierlichen Wert einpendeln. Bremst man eine Kette mit dem Finger, neigt sie beim loslassen zum heftigen überschwingen als wenn ein Gummizug darin verbaut wäre. Lässt man den Bot auf dem Boden fahren, ist von Spurtreue bzw. "gradeausfahren" keine Rede... er zieht einen recht engen Kreis von ca. 1 m Durchmesser.
    Is schon witzig alles... und nur weil das PWM Timing verändert ist. Man hört auch tatsächlich einen leisen PWM Ton bei ca. 300 Hz.
    Mir ist klar das dies alles letztlich von vielen Aspekten abhängt... das ganze RP6 Motorsystem ist ja ein (eigentlich 2 unabhängige) klassisch rückgekoppeltes Regelsystem mit Lautzeiteigenschaften usw..
    Aber das es wegen Timings so drastisch aus der Bahn kommt, hätte ich nicht für möglich gehalten und Suche noch nach einer sinnvollen Erklärung.
    Denn es werden hier genau so viele ISRs aufgerufen wie in der 19KHz Version den die sind abhänig von den Achsdrehungen bzw. Lichtschranken dort...
    Es müssten auch sonst alle Timings gleich sein... bis auf die PWM Frequenz halt. Da die TIMER1_OVF_vect derzeit keinen Code enthält, sollte dies auch kein Einfluß haben.
    Ich kann mir jedoch beim besten Willen nicht vorstellen, das es nur wegen der 19Khz->300Hz Umstellung zu solch massivem Nachlaufen der Reglerstellglieder kommt, das sogar das System zu schwingen beginnt. Der Vergleich hinkt etwas aber Phasenanschnittsteuerungen arbeiten ja üblicher Weise bei weit geringeren Frequenzen auch noch stabil.
    So ist das jedenfalls nicht zu gebrauchen... auch wenn das Einhängen der ISR (TIMER1_OVF_vect) damit nun wunderbar klappt.
    Vielleicht hat ja jemand eine Idee?

    Ich hab eben was interssantes im c'T-Bot Projekt unter http://www.heise.de/ct/projekte/ct-b...8c-source.html gefunden...

    00094 #ifdef SPEED_CONTROL_AVAILABLE
    00095 _BV(CS10); // Prescaler = 1 => 31.2 kHz
    00096 #else
    00097 _BV(CS12); // Prescaler = 256 => 122 Hz
    00098 #endif // SPEED_CONTROL_AVAILABLE

    Dazu http://www.heise.de/ct/projekte/mach...are-Aktuatoren
    und http://www.roboternetz.de/community/...-PI-PID-Regler

    Also über das Thema auf dem RP6 basierend kann man wohl sicherlich noch einige Doktorarbeiten schreiben...
    LG Rolf
    Geändert von RolfD (23.08.2012 um 02:46 Uhr)
    Sind Sie auch ambivalent?

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    Hallo,

    ich war davon ausgegangen das Dir der Grund "die Motoren trällern ein Lied" schon ausreicht um von dem Plan abzusehen die PWM Frequenz runterzuschrauben

    Das sich das Verhalten der Motoren dadurch ändert, kommt natürlich noch dazu.
    Mit der Software hat das nicht viel zu tun, aber mit dem Motor ansich.
    Der Motor hat eine Zeitkonstante die sich aus der Induktivität und dem Innenwiderstand ergibt. Das ist ein Tiefpass Filter, der glättet den Strom - Frequenzabhängig. Der Ripplestrom wird also bei niedriger Frequenz höher, der Wirkungsgrad sinkt und das Drehmoment schwankt stärker!
    Die starken Vibrationen sind mechanisch auch nicht gerade hilfreich. Und noch andere Dinge...


    Egal - ich versteh nicht wo das Problem ist statt Timer1 einfach den Timer0 zu nehmen, der wird in der RP6 Lib ja auch für die Stopwatches benutzt. Die brauchst Du aber mit FreeRTOS wohl nicht?
    Die Stopwatches sind Software Timer.
    Du kannst mit dem einen Timer beliebig viele Softwaretimer erzeugen - solange die Rechenleistung ausreicht.

    MfG,
    SlyD

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. RN-Motor I2C Kommunikation klappt, am Motor tut sich nichts
    Von hspecht74 im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 1
    Letzter Beitrag: 24.11.2008, 14:04
  2. Antworten: 0
    Letzter Beitrag: 15.03.2008, 18:28
  3. 19khz-einstellung für motortreiber l293d auf dem rp6
    Von roboterheld im Forum Robby RP6
    Antworten: 0
    Letzter Beitrag: 05.10.2007, 18:50

Berechtigungen

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