Also ich hatte beschlossen, den Timer1 auf 20KHz bzw. 10.000 PWM Impulse laufen zu lassen. Das ergibt ein Wert von 400 für das 16 Bit Register ICR1 bei Precaler 1 und eine Auflösung von 100 μs für die ISR (TIMER1_OVF_vect), wo ich da dann alles 1:1 rein setzen kann was vorher in der ISR (TIMER0_COMP_vect) stand. Damit ist der Timer0 frei für RTOS. Die Pole des Motorankers dürften so genügend Pulse Pro Sek. bekommen um sauber zu arbeiten auch wenn er dann etwas fiept und alle anderen Abläufe müssten gleich sein. Sogar die Stopwatches tuen es dann noch. Für die Anpassung der Sollgeschwindigkeit aus RP6 Lib Funktionen (passend zum ICR1 Dutycycle Wert) reicht zum testen eine Multiplikation / bitshift *2 welche einfach in die ISR Motorsteuerung einzubringen ist.
Dann noch ein RTOS Task der die RP6Tasks aufruft und alles müsste eigentlich passen... Eigentlich... denn es passt nicht!
Zunächst was ich noch nicht ganz verstehe, TCCR1A und TCCR1B sind ja die Timerconfigurationsregister. Die werden zu Anfang durch Hardwareinit gesetzt. Ok. Und teilweise später auf 0 gesetzt... Warum?
U.a. in emergencyShutdown, bei task_motionControl im Abschnitt CHANGE_DIRECTION_FAST wobei unter CHANGE_DIRECTION_MEDIUM nur geprüft wird, in der ISR (TIMER0_COMP_vect) ... allerdings auch wieder gesetzt..
Würde es nicht ausreichen TCCR1A in Ruhe zu lassen und nur einfach OCR1AL und OCR1BL mit 0 zu beschreiben damit der Bot stehen bleibt?
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.
Eine bessere Lösung wäre vielelicht auch die Directionbits im Port zu ändern da die PWM nur nach ausßen gelangt wenn die Portbits auf Ausgang stehen bzw. die Bits COM1A1:0 and COM1B1:0 in TCCR1A zu löschen.
vergl. S.107 im cpu-pdf
"The COM1A1:0 and COM1B1:0 control the Output Compare pins (OC1A and OC1B respectively)
behavior. If one or both of the COM1A1:0 bits are written to one, the OC1A output
overrides the normal port functionality of the I/O pin it is connected to. If one or both of the
COM1B1:0 bit are written to one, the OC1B output overrides the normal port functionality of the
I/O pin it is connected to. However, note that the Data Direction Register (DDR) bit corresponding
to the OC1A or OC1B pin must be set in order to enable the output driver."
Ok... also passend umschreiben.
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?
Praktisch ruckelt der Bot jedenfalls als würde jemand ständig Gas und Bremse vertauschen... Karnickelhüpfen quasi...
Ich will das Ganze noch mal mit Timer Mode 8, also "PWM, Phase and Frequency Correct" versuchen, ansonsten war das Ganze ein informativer Ausflug in die Timerprogrammierung und die RP6Lib aber leider ist so kein Blumenpott zu gewinnen...
LG Rolf
Lesezeichen