TT - ATtiny861A + Quadratursignal in CLOCK und UP/DOWN Signal
von
am 25.03.2016 um 10:36 (2983 Hits)
Um den TT zum Laufen zu bekommen, hatte ich auf die Schnelle viel vom Programm des Quadenc übernommen und selbst den gleichen µC (ATtiny44A) verwendet. Jetzt bin ich mittendrin im Umsteigen auf auf den ATtiny861A, den ich hiermit zum ersten Mal benutze. Der ist ein bißchen zickig bei den Pinchange Interrupts. Irgendwie verhalten die sich nicht so, wie im Datenblatt angegeben. Hab ich erstmal umgangen und die INT0/1 Interrupts zum Testen benutzt.
BASCOM-DEMO 2.0.7.5 scheint mir auch nicht ausreichend den 10-Bit Timer1 und den 16-Bit Timer0 zu unterstützen. Grundfunktionen der Timer sind per Bascomfunktionen ansprechbar aber sonst mußte ich über die direkte Registerkonfiguration gehen. Der Timer1 läuft defaultmäßig im 8-Bit Mode und hat drei Compareregister, die alle einen Interrupt auslösen können und auch einen HW-PWM Ausgang mit Komplementärausgang und Deadtimer haben. Hinzu kommt das OCR1C-Register, dessen Inhalt als TOP Wert auch noch einen vierten Interrupt auslösen kann (TOV1) aber keinen HW-PWM Ausgang besitzt.
Für meine spezielle H-Brücke (Im Foto auf dem großen Steckbrett noch mit LEDs ersatzbestückt) nutze ich zwei HW-PWM Ausgänge (OC1A und OC1B) für die Vorwärtsrichtung der beiden Motore und eine SW-PWM für die Rückwärtsrichtung. Die Pulse der SW-PWM werden über COMPARE1A und COMPARE1B Interrupts ausgeschaltet und über die COMPARE1D (OCR1D ist auch auf den TOP Wert eingestellt) und TOV1 Interrupts eingeschaltet - sozusagen nicht invertierte SW Fast PWM. Bißchen umständlich aber exclusiv Vielleicht fällt mir außer einer HW-Lösung noch eine andere SW-Lösung ein.
Bild hier
Dafür versuche ich das Quadratursignal der Encoder über HW aufzubereiten. Klappt gut. Innerhalb der gelben Linie im Foto gibt es einen 74HC14 Inverter IC mit Schmitttriggereingängen und einen 74HC86 XOR IC. Für zwei Encoder ausreichend aber zur Zeit nur einer vom TT herüber verdrahtet. Verschaltet wie im Kommentar zum vorletzten Blogeintrag angedeutet und hier nochmal verlinkten Thread.
Der 74HC14 macht mit einem 12kOhm und 22nF RC-Glied eine gemessene Verzögerung von 200 bis 250µs. Das bedeutet, daß nach Auftreten des Clock-Interrupts das UP-DOWN Signal spätestens nach 200µs ausgewertert sein muß. Mal sehen, ob ich das restliche Programm entsprechend hingedeichselt bekomme. Vom Encoder können gegenwärtig aufgrund der Getriebeübersetzung, Batteriespannung und Motortyps maximal 60 Flanken pro 20ms auftreten (entspricht 60 Clock Interrupts pro Encoder in 20ms). Zusammen werden die Encoderauswerteinterruptserviceroutinen also mit maximal 6kHz aufgerufen. Eine benötigt aber nur noch 2,5µs da in ASM geschrieben und Zeit durch "manuelle" Registersicherung auf Stack gemacht wird (Parameter nosave). Die SW-PWM läuft beim Rückwärtsgang mit 4kHz (pro Seite) und braucht pro Schaltinterrupt für eine PWM-Flanke 1,125µs. Von daher sollte ich keine Timingprobleme bekommen und genügend Zeit für andere Funktionen zur Verfügung haben.