- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 25

Thema: Motor PWM 19KHz?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Aber was mir noch aufgefallen ist... Radbruchs Tip TIMER1_OVF_vect zu nutzen scheint mir inzwischen nicht mehr die beste Idee wie dort Figure 47. Phase Correct PWM Mode, Timing Diagram etwa mitte des Bildes zeigt.
    Die Interrupts fallen bei Mode 10 _nicht_ Zeitsyncron an, sondern je nach dem wie das PWM Verhältnis eingestellt ist. Deren Frequenz kann sich bis zu einem mehrfachen der ursprünglich erwarteten Frequenz steigern. Mit anderen Worten, die Rechnung oben zum Thema TimerISR umsetzen wäre für die Katz! Sehe ich das richtig so?
    In der Mitte von Bild 47 wird TOP verändert, deshalb ändert sich die Frequenz. Etwas weiter unten steht folgendes:

    When using a static TOP value there are practically no differences between the two modes of operation.
    Gruß

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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    "When using a static TOP value there are practically no differences between the two modes of operation."

    Diese Aussage bezieht sich auf den Unterschied von "PWM, Phase and Frequency Correct" und "PWM, Phase Correct".
    Da wir mit ICR1 ein static TOP haben, verhält sich Mode 8 wie Mode 10... also dürfte Mode 8 auch nichts gegenüber Mode 10 verbessern. ok. Aber..

    "The Timer/Counter Overflow Flag (TOV1) is set each time the counter reaches BOTTOM. When
    either OCR1A or ICR1 is used for defining the TOP value, the OC1A or ICF1 Flag is set accordingly
    at the same timer clock cycle as the OCR1x Registers are updated with the double buffer
    value (at TOP). The Interrupt Flags can be used to generate an interrupt each time the counter
    reaches the TOP or BOTTOM value."

    Da Top = ICR1 und Bottom = 0 nicht verändert werden, müsste es so gehen.. nur warum "hüppelt" der Bot dann aber so?
    Ich sehe schon ein das du theoretisch recht hast mit dem TIMER1_OVF_vect, Radbruch... praktisch tuts das aber so nicht.
    Ob das an den noch nicht umgeschriebenen Registern TCCR1A = 0 (s.o.) liegen kann? Ich mach mich mal dran das zu ändern.
    Denn das würde den Zeitgeber Timer1 beeinflussen und so ggf. Störungen in den 100uS Messschleifen verursachen.

    Hier meine Änderungen bisher:
    Init:
    // Initialize Timer 0 - 2ms cycle or 500Hz RTOS
    TCCR0 = (0 << WGM00) | (1 << WGM01)
    | (0 << COM00) | (0 << COM01)
    | (0 << CS02) | (1 << CS01) | (1 << CS00);
    OCR0 = 250; // 500 Hz

    // Initialize Timer1 - PWM and exTimer0 Funktions:
    // PWM, phase correct with ICR1 as top value.
    TCCR1A = (0 << WGM10) | (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
    TCCR1B = (1 << WGM13) | (0 << WGM12) | (1 << CS10); // prescaler /1

    // 20000 Hz = ICR1 400, bzw. pwm von 10000 Hz -> 0,0001 S bzw. 100 μs bei prescaler /1

    ICR1 = 400; // New Phase corret PWM top value, 400 = 10 KHz 100uS
    Dann die ISR für Timer:
    ISR (TIMER0_COMP_vect) in ISR (TIMER1_OVF_vect) geändert. Aufruf alle 100uS

    ISR für den nun freien Timer0:

    #if configUSE_PREEMPTION == 1
    // ISR (TIMER0_COMP_vect, ISR_NAKED)
    ISR (TIMER0_COMP_vect)
    {
    // vPortYieldFromTick();
    // asm volatile ( "reti" );
    }
    #else
    // ISR (TIMER0_COMP_vect, ISR_NAKED)
    ISR (TIMER0_COMP_vect)
    {
    // vTaskIncrementTick();
    }
    #endif // portUSE_PREEMPTION
    Um aktuell Komplikationen zu verhindern ist die nun zum RTOS gehörende ISR (TIMER0_COMP_vect)
    so geändert, das sie als normale ISR ohne ins RTOS zu wechseln 500 mal /sec nichts macht. Da das RTOS
    nicht angesprungen wird liegt es nur als toter Code im Hexfile - es geht also immer noch nur um die RP6Lib.

    Is also alles keine Zauberei... und trotzdem ruckelt der Bot vor sich hin statt normal zu fahren.
    LG Rolf
    Geändert von RolfD (29.08.2012 um 14:52 Uhr)
    Sind Sie auch ambivalent?

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Hallo,

    Irgendwie wird da das TCCR1A in der RP6Lib als 2.ter Ein/Aus Schalter fürs PWM benutzt - was aber zu Problemen führt wenn TIMER1_OVF_vect (s.o.) auch systemrelevante Funktionen steuert und daher weiter laufen soll.
    Nun mit der normalen Lib war das natürlich nicht vorgesehen und daher nicht nötig das anders zu machen.
    Mit TCCR1A = 0 ist die PWM halt sicher aus und die Ports wieder normale I/Os.
    Und man kann einfach mit if(!TCCR1A) testen ob beide PWM Werte schon bei 0 angekommen sind (bei change direction).
    Kannst Du natürlich ändern oder nur die passenden Bits (COM1x1) in dem Register setzen.

    Warum es ruckelt kann ich auf Anhieb nicht sagen ohne mir das genauer anzuschauen.

    MfG,
    SlyD

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Ich habe nun mal alle TCCR1A=0 entfernt und durch OCR1AL = 0; OCR1BL = 0; ersetzt und siehe da - der Bot bewegt sich - oh Wunder - sanft und ruhig.

    Nun frag ich mich.... warum rief der denn vorher überhaupt in dem Beispiel Example_05_Move_01 das TCCR1A=0 auf?
    Da steht ja nur drin: "Beweg dich langsam vorwärts (wobei er {beide RP6, die ich hab} da bei mir schon immer rückwärts anfuhr)".. also kein Richtungswechsel.. keine Speedänderung, kein Halten ...

    Und man kann einfach mit if(!TCCR1A) testen ob beide PWM Werte schon bei 0 angekommen sind (bei change direction).
    Das halte ich aber für ein dickes Gerücht.... ein gelesenes TCCR1A gibt aus was man als Config Bits reinschreibt - und keine Istwerte des Zählers. Im TCCR1A steht z.B. das Verhalten für COM1A1 und COM1B1 drin, also die Portpins bei Timerüber/unterlauf. Ferner steht da auch der PWM Mode drin....welcher sich zur Laufzeit niemals ändert. Ein TCCR1A kann also niemals 0 werden - egal wie der Status der PWM Counter ist. Ein OCR1AL = 0; OCR1BL = 0; sorgt eh dafür, das keine Impulse mehr rausgehen. Es ist nun wirklich nicht nötig, Änderungen im Dutycycle bei 10 bzw. 19 KHz PWM auf den aktuellen PWM Counter zu timen - wie du andeutest, Slyd. Der Code da in der ISR mit if(!TCCR1A) ist einfach nicht sinnvoll.
    Siehe Seite 107-109 im CPU-PDF.
    Ich vermute, da haben sich nur einfach ein paar Denkfehler in die bisherige Motorsteuerung eingeschlichen. Dies betrifft zumindest die lesende Nutzung des TCCR1A, sowie auch das mitten im Rollbetrieb scheinbar Konditionen entstehen, die dazu führen, das TCCR1A = 0 ausgeführt wird. Beides fällt in der alten Timerconfig halt nur nicht auf.

    Jetzt kann man natürlich mit dem schlagenden Argument kommen "funktioniert doch bisher" ... und ich füge an ... "irgendwie".
    Vielleicht wäre es wirklich mal an der Zeit, die RP6Lib zu überarbeiten. Nach TWI schon der 2. Problemkreis, der sich für mich auftut.
    Aber da ich ja eh das RTOS portieren will... *seufz
    Jedenfalls tuts jetzt die Idee mit TIMER1_OVF_vect, Timer0 ist frei und es kann los gehen mit RTOS, Danke noch mal an Radbruch für den Tip und alle beteiligten Leser fürs Mitdenken.
    LG Rolf
    Geändert von RolfD (29.08.2012 um 19:50 Uhr)
    Sind Sie auch ambivalent?

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Ne ne hier verstehst Du nur was an dem Programmablauf nicht ganz

    ein gelesenes TCCR1A gibt aus was man als Config Bits reinschreibt
    Ja genau, und was wird im Timerinterrupt reingeschrieben wenn beide OCRs 0 sind?
    --> 0
    Was steht also drin wenn die PWM Werte auf 0 runtergeregelt wurden?
    --> 0

    Passt also.

    MfG,
    SlyD

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Hi Slyd,
    du benutzt das TCCR1A bewust als Statusvariable für die PWM ... ok.. ja vermutet hatte ich den Zusammenhang ja oben schon mit dem ein/aus Schalter.
    Ok kann man so machen...
    Als Regelkreislauf kommt es aber offensichtlich dazu, das diese Kondition auch im Fahrbetrieb des Beispiels Example_05_Move_01 aufkommt - was hier dann zu ruckeln führte. Ok das ruckeln liegt an meiner Bastelei am Timer1...
    Nur darf der Regelkreislauf so exorbitant ausschlagen das der Motorcontroller meint, im Rollbetrieb zwischendrin mal eben so die PWM Generierung abschalten zu müssen? Da ist doch was im argen...
    Gruß Rolf
    Sind Sie auch ambivalent?

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Der PWM Wert ist 0 wenn TCCR1A auf 0 gesetzt wird.
    Sobald in den PWM Variablen im Programm was anderes als 0 drinsteht, wird TCCR1A wieder auf den normalen Wert gesetzt (natürlich mit Verzögerung wegen Software Timer).
    Das macht also keinen Unterschied!


    Das bei Dir das Programm so seltsam reagiert wenn TCCR1A auf 0 gesetzt ist, liegt evtl. daran, dass der Overflow Interrupt dann etwas anders auftritt. Der wird ja nicht deaktiviert (weil er in der RP6Lib nicht genutzt wird).
    TCCR1A auf 0 setzen trennt den Timer von den I/O Ports ab und der Timer wird in den
    (EDIT: Natürlich nicht normal Modus sondern einer der anderen ich hatte vergessen das WGM13 ja im TCCR1B gesetzt ist)
    konfiguriert.
    Da in der RP6Lib diese Interruptvektoren nicht genutzt werden und auch nie geplant war diese jemals zu nutzen, hatte das da natürlich keine Relevanz.
    EDIT:
    Der Timer0 ist ja unabhängig vom Timer1, da TCCR1A zu setzten wirkt sich auf Timer0 natürlich nicht aus der läuft ungestört weiter. Wenn Du aber im Timer1 Interrupt das TCCR1A Register setzt wirkt sich das wohl anders aus.

    Der Regler kann den Sollwert nur soweit senken wenn die Regelabweichung stark genug wird.
    Der Stellwert sollte eigentlich nicht bis auf 0 runter gehen, aber da das Fahrzeug eine recht große Masse hat und auch erstmal abgebremst werden will wenn es gerade kurz beschleunigt hatte (plus Verzögerung wegen langsamer Änderung der PWM)... funktioniert im Fahrbetrieb aber gut genug. Kann man aber durchaus nochmal genauer untersuchen und optimieren.

    Wenn das bei *Deinem* Programm aber auch nur einmal kurz auftritt kommt alles durcheinander wegen der Verzögerung / Änderung der Timereinstellung die dann dazwischen funkt.

    Aber egal, einfach so anpassen wie Du schon gesagt hast dann sollte es laufen.

    MfG,
    SlyD
    Geändert von SlyD (29.08.2012 um 21:10 Uhr)

Ä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
  •  

12V Akku bauen