Die ersten Beschleunigungsmessungen. ..
von
am 03.06.2011 um 14:52 (4561 Hits)
Das Schreiben des Meßprogramms hat mich doch ganz schön mitgenommen und belasse es nun bei einer Version. Eigentlich hatte es schon recht schnell in den ersten Versionen funktioniert. Es waren jedoch in der Umsetzung der Meßergebnisse in einen Chart seltsame Zacken in der Kurve zu sehen, die von einem Strich zum anderen größere Geschwindigkeitsunterschiede darstellten. Da die Zacken immer an der gleichen Stelle waren, dachte ich weniger an Meßungenauigkeiten als an einen Fehler bei Timings im Programm und versuchte diese durch verschiedene Strukturierungen auszumerzen.
Gelang nicht und weitere Versuche zeigten dann, daß es an winzigen, mit bloßem Auge kaum zu sehenden Unterschieden der Striche im ausgedruckten Zebrastreifen liegt. Ist einfach zu testen, wenn man das Ergebnis kennt, indem man die Meßfahrt einfach nochmal in entgegengesetzter Richtung auf dem Streifen wiederholt. Das Streifenmuster wurde auf zwei verschiedenen DIN A4 Blättern ausgedruckt und zusammengeklebt. Sieht so aus, als wenn der Tintenstrahldruckervorschub beim zweiten Blatt ungleichmäßiger als beim ersten war. Vielleicht setzt auch nur der CNY70 ab der Klebestelle rythmisch auf - Muß ich sowieso nochmal umbauen.
Als Herausforderung beim Meßprogramm empfand ich folgende, mir selbst abgenötigte Voraussetzungen:
1. Die Meßmethode: TT fährt als Linienfolger über eine Linie und tastet zum Messen Streckenmarken auf der Linie ab.
2. Durch schon vorhandenen Aufbau gab es nur noch einen freien PIN am ATtiny45, nämlich den PB0 zum Anschluß des Streckenmarkensensors, bestehend aus CNY70 mit nachgeschaltetem Schmitttrigger. Wenn ich das Datenblatt richtig intepretiert habe, läßt sich auf PB0 weder ADC noch Analog Comparator noch flankengetriggerter Interrupt wie INT0 so einfach für diese Aufgabe im TT nutzen. Also Pollen oder Pin Change Interrupt.
3. Die Meßdaten sollten im EEPROM gespeichert werden. Ein Schreibzugriff dauert lt. Datenblatt 1,8ms und könnte Messungen stärker verfälschen. (Hier bin ich mir unsicher und hab sicherheitshalber das Schreiben in den eeprom während der Messfahrt in den letzten Programmversionen vermieden).
4. Der Tiny45 besitzt nur zwei 8bit Timer. Davon wird Timer0 in BASCOM von GetRC5, also IR Fernbedienungsempfang, der unbedingt beibehalten werden sollte, benutzt. Durch die BASCOM Funktion ist der Timer0 für mich unkalkulierbar und wird nicht weiter verwendet. Die Meßfahrt wird mit der FB gestartet und während der Fahrt der FB Empfang nicht verwendet. Gestoppt wird nach Erfassung aller Streckenmarken; 100 Stck, jeweils im Abstand von 0,5cm.
5. Ungelöst: Dis erste Messung bei Start aus dem Stand bis erste Streckenmarke ist zur Beschleunigungsmessung aus dem Stand unbrauchbar weil ich den TT nie gleichmäßig genau auf einen Startpunkt von Meßfahrt zu Meßfahrt ausgerichtet bekomme. Da sollte ich mir noch eine Startbox basteln.
Der grobe Ablauf des Programms ist in etwa:
1. Initialisierungen wie Timer- und ADC-Einstellungen.
2. Schleife zur Abfrage für Fernbedienungsstartbefehl.
3. ISR Zeiteinheiten hochzählen: Ist Startbefehl gekommen, der die Fahrtgeschwindigkeit beinhaltet, wird Timer1 Overflow Interrupt eingeschaltet.Timer1 wurde bei Initialisierung für PWM Freq. von 8kHz konfiguriert und erzeugt somit alle 125µs einen OVF Interrupt.Die ISR zu diesem Interrupt zählt eine Word Variable (0..65535) als Time_Tick hoch(hab leider keinen 16bit Timer auf'm Tiny45 gefunden).
4. ISR Linienfolgen: Außerdem wird in der Time_tick ISR die ADC Messung der Liniensensoren gestartet. Ist die ADC Messung beendet, erzeugt der ADC einen Interrupt und in der ADC ISR werden dann die Motore mit der PWM eingestellt. Der ADC braucht 13 ADC-Takt Takte für eine Messung. Durch den Prescaler ist der ADC-Takt auf 62500Hz eingestellt. Somit ist eine Messung nach 208µs beendet, also länger als bis zum nächsten Messung startenden Timer1 Overflow Interrupt. Dadurch wird eine ADC Messung nur bei jedem zweiten Timer1 Overflow gestartet, also mit 4kHz. Das ist ausreichend schnell um auf der Meßstrecke zu bleiben und ist auch mit der Time_Tick-ISR synchronisiert, um dort möglichst wenig Verfälschung wg. "gleichzeitig" auftretenden Interrupts zu bekommen. Die ADC Messung ist also nach 208µs beendet und bis zum Start einer neuen Messung bei 250µs (Periodendauer bei 4kHz) verbleiben rund 42µs für Rücksprung und die PWM ISR. Bei 8MHz Systemtakt und den paar Instruktionen sollte das kein Problem sein? Den Haupteil dieser ISR könnte man auch in der Hauptschleife laufen lassen, da er nicht so zeitkritisch ist - denke ich. Werd das vielleicht nochmal im Simulator überprüfen.
5. ISR Meßwertaufnahme: Kriegen die Motore PWM können dann Impulse vom Streckenmeßsensor eintreffen. Die ISR vom PCINT des Streckensensors schreibt den ersten und jeden weiteren zweiten Time_Tick als Meßwert in ein array. Nur jedes zweite Mal, da bei Überfahren einer Linie beide Helligkeitsübergänge/Flanken einen Interrupt auslösen (der schwarze Strich ist schmaler als der weiße Zwischenraum).
6. Meßwerte sichern: Wenn 100 Meßwerte aufgenommen wurden, werden die Motore gestoppt und die Meßwerte noch ins eeprom übertragen.
Code im 1. Kommentar, da der Blogeintragplatz mal wieder zu klein geworden ist
Zur Nachbereitung der Messungen lese ich den eeprom mit der BASCOM IDE aus, speichere sie in eine .eep Datei. Setze die Werte mit einem kleinen Hilfsprogramm für EXCEL lesbar in eine .csv Datei um und brüte dann über den dargestellbaren Charts.
Wofür das gut ist? Weis noch nicht. Vielleicht als Druckerblattvorschubtester
Einige Meßergebnisse mit Chart als EXCEL sheet im ZIP Anhang.
Bitte Fehlschlüsse, Verirrungen kommentieren oder einfach nur Anmerkungen dalassen. Vielen Dank.