No edit summary |
|||
Line 79: | Line 79: | ||
nicht mehr die 5V-Versorgungsspannung aufrecht zu halten. Die Zeiten sind als Best-Case anzunehmen. | nicht mehr die 5V-Versorgungsspannung aufrecht zu halten. Die Zeiten sind als Best-Case anzunehmen. | ||
Den größten Anteil am Stromverbrauch hat sicherlich die LCD-Hintergrundbeleuchtung<ref>[ | Den größten Anteil am Stromverbrauch hat sicherlich die LCD-Hintergrundbeleuchtung<ref>[http://www.abacom-online.de/div/LCD20x4.pdf''Datenblatt LCD 20x4 (PCM2004A)'']</ref> mit aktuelle 80 mA. Dieser kann natürlich | ||
noch über den Vorwiderstand R17 gesenkt werden. | noch über den Vorwiderstand R17 gesenkt werden. | ||
Line 150: | Line 150: | ||
extern zu Programmieren. Im Layout gibt es die Möglichkeit den Mikrocontroller über einen Bootloader zu Flashen (nur Flash kein EEPROM) allerdings muss dafür auch zunächst der Bootloader über einen ISP-Programmer in den Chip geschrieben werden. | extern zu Programmieren. Im Layout gibt es die Möglichkeit den Mikrocontroller über einen Bootloader zu Flashen (nur Flash kein EEPROM) allerdings muss dafür auch zunächst der Bootloader über einen ISP-Programmer in den Chip geschrieben werden. | ||
Im grunde kann dafür jeder Bootloader benutzt werden, ich benutze zurzeit den Bootloader FastBoot von Peter Dannegger.<ref>[ | Im grunde kann dafür jeder Bootloader benutzt werden, ich benutze zurzeit den Bootloader FastBoot von Peter Dannegger.<ref>[http://www.mikrocontroller.net/articles/AVR_Bootloader_FastBoot_von_Peter_Dannegger ''AVR Bootloader FastBoot von Peter Dannegger'']</ref> | ||
Das Flashen geschieht mittels eines Bootloader über die serielle Schnittstelle (UART) des Atmega8 (Pins PD0 und PD1). Nutzt man diese Möglichkeit sollte man darauf achten, dass der Mikrocontroller auch keinen Fall direkt mit der seriellen Schnittstelle des PCs verbunden werden darf. Beachtet man das nicht zerschießt man sich die entsprechenden Eingangspins des Atmega. | Das Flashen geschieht mittels eines Bootloader über die serielle Schnittstelle (UART) des Atmega8 (Pins PD0 und PD1). Nutzt man diese Möglichkeit sollte man darauf achten, dass der Mikrocontroller auch keinen Fall direkt mit der seriellen Schnittstelle des PCs verbunden werden darf. Beachtet man das nicht zerschießt man sich die entsprechenden Eingangspins des Atmega. |
Revision as of 16:10, 24 February 2014
In diesen Artikel stelle ich vor, wie ein einfacher Laptimer realisiert werden kann. Ich habe ihn Primär dafür eingesetzt die Rundenzeit meines Rennkarts zu erfassen. Er kann aber auch individuell für diverse Einsatzzwecke adaptiert werden. Für den Einsatzbereich im Kart gibt es schon einige fertige Lösungen (MyChron, Alfano, etc..), diese sind aber recht teuer wesegen ich zu einem Selbstbau übergegangen bin. Außerdem ist bei einem Selbstbau der Lerneffekt um einiges größer.
Hardware
Die Grundlage bildet der 8-Bit Mikrocontroller ATmega8 der Firma ATMEL. Dieser übernimmt alle Aufgaben der Steuerung und Berechnung. Das sind im großen und ganzen die Erfassung von:
- Drehzahl
- Geschwindigkeit
- Rundenzeit
sowie die Steuerung der
- LCD-Anzeige
- Hintergrundbeleuchtung
- Bestzeit-LED
Zur Anzeige wird ein alphanummerisches 4x20 Zeilen LCD verwendet (HD44780 kompatibel). Die Stromversorgung wird noch über einen 9V-Block realisiert der über einen Schaltregler die 5V erzeugt. Im Schaltplan ist noch die Möglichkeit vorgesehen über eine Z-Diode die für den Mikroconroller notwendigen 5V zu erzeugen. Davon sollte aber in der Praxis abgesehen werden. In Zukunft gedenke ich den 9V Block durch einen alten Handy-Akku zu ersetzen. Mittels eines NPN-Transistors besteht die Möglichkeit die Hintergrundbeleuchtung des LCD's über den Mikrocontroller einzuschalten. Das sollte beim Batteriebetrieb aber nur für kurze Zeit, z.B. beim beenden einer Runde geschehen. Weiterhin wird über eine LED angezeigt ob eine neue Bestzeit gefahren wurde.
Pinbelegung
Pin Description Connected with ----------------------------------------- 1 PC6(RESET) RC-Network 2 PD0(RXD) Connector (Bootloader) 3 PD1(TXD) Connector (Bootloader) 4 PD2(INT0) Drehzahl 5 PD3(INT1) Geschwindigkeit 6 PD4(XCK/T0) - 7 VCC +5V 8 GND GND 9 PB6(XTAL1) 4Mhz Quarz 10 PB7(XTAL2) 4Mhz Quarz 11 PD5(T1) - 12 PD6(AIN0) - 13 PD7(AIN1) Bestzeit-LED 14 PB0(ICP) Rundenzeit (Reed-Kontakt) 15 PB1(OC1A) Transistor(LCD_BACKGRND) 16 PB2(SS) Taster "Hoch" 17 PB3(MOSI) Taster "Runter" 18 PB4(MISO) Taster "OK/EXIT" 19 PB5(SCK) - 20 AVCC +5V 21 AREF RC-Network 22 AGND GND 23 PC0(ADC0) LCD(DB7) 24 PC1(ADC1) LCD(DB6) 25 PC2(ADC2) LCD(DB5) 26 PC3(ADC3) LCD(DB4) 27 PC4(ADC4) LCD(Enable) 28 PC5(ADC5) LCD(RS)
Stromverbrauch
Aktuell betreibe ich den Laptimer mit einem Wald-und-Wiesen 9V-Block, der Kapazität von ungefähr 600 mAh haben müsste. Dabei ergeben sich für verschiedene Zustände in denen sich der Laptimer befindet auch verschiedene Laufzeiten die ich nachfolgend in einer Tabelle aufgeführt habe (für einen 9V-Block a 600mAh):
Zustand | Stromaufnahme (mA) | Laufzeit (std) |
---|---|---|
Standardanzeige (*) + LCD-Hintergrundbeleuchtung an | 44 mA | 13 std (**) |
Standardanzeige (*) + LCD-Hintergrundbeleuchtung aus | 16 mA | 37 std (**) |
Rundenzeitmessung läuft | 44 mA | 13 std (**) |
Standby | 16 mA | 37 std (**) |
(*) Anzeige der Messwerte nach dem Einschalten des Laptimers (keine Messung läuft)
(**) Die Berechnung gehen von einer vollständigen Entladung aus. Mitunter schafft es der Schaltregler aber nicht mehr die 5V-Versorgungsspannung aufrecht zu halten. Die Zeiten sind als Best-Case anzunehmen.
Den größten Anteil am Stromverbrauch hat sicherlich die LCD-Hintergrundbeleuchtung[1] mit aktuelle 80 mA. Dieser kann natürlich noch über den Vorwiderstand R17 gesenkt werden.
Bedenken sollte man allerdings das dann mitunter die Erkennbarkeit des Displays, bei starker Sonneneinstrahlung, darunter leidet.
Software
Parameter
Über Software defines können eine fülle von Einstellungen an dem Laptimer vorgenommen werden ohne Teile im Code ändern zu müssen. Zurzeit habe ich die folgenden Parameter implementiert
SEC_LOCK_ICP 1 // Zeit die der ICP nach auslösen gesperrt bleibt, in Sekunden.
STANDBY_AFTER_MIN 6 // Zurücksetzen der Rundenzeitmessung und Standby (Runde nach x Minuten noch nicht beendet)
MAX_INTERIM_TICKS 12000 // Schwelle für Differenz zu Best-Zwischenzeiten (ganze Minuten!!)
AVERAGE_VALUE 4 // Zeitkonstante für die Mittelwertberechnung
AMOUNT_MAGNETIC_LOOPS 3 // Anzahl der Magnetschleifen auf der Rennstrecke
KPH_TO_MPS 3.6 // Umrechnung km/h <-> m/s
PERIMETER_TYRE 0.86 // Reifenumfang in Meter
FRONT_SPROCKET 11 // Zähnezahl Ritzel
REAR_SPROCKET 86 // Zähnezahl Kettenrad
SEC_SHOW_LAPTIME 5 // Zeit in Sekunden, bei der die alte Rundenzeit angezeigt wird
Zeiten
Die Berechnung der Zeiten gestaltet sich im ganzen Programm nach dem selben Schema. Ausgehend von den "ticks" die über den internen Timer des Atmegas alle 10ms erhöht wird, werden die daraus folgenden Zeiten abgeleitet.
void splitTicks(uint16_t ticks, volatile struct myTime* result)
{
uint16_t centiSec = 0;
uint16_t seconds = 0;
centiSec = ticks; // Zenti-Sekunden (10ms)
seconds = centiSec / 100; // Sekunden berechnen
result->ticks = ticks;
result->csec = centiSec % 100; // Rest bei der Berechnung der Sekunden --> Zenti-Sekunden
result->min = seconds / 60; // Minuten berechnen
result->sec = seconds % 60; // Rest bei der Berechnung der Minuten -- > Sekunden
}
Dabei wird eine eigens angelegte Struktur "myTime" genutzt, die wie folgt definiert ist:
// Struktur für die diversen Zeiten
struct myTime
{
uint8_t min;
uint8_t sec;
uint8_t csec;
uint16_t ticks;
uint16_t interim[AMOUNT_MAGNETIC_LOOPS];
};
Flashen
Um das Programm auf den Mikrocontroller zu bekommen gibt es mehrere möglichkeiten, aber für alle wird zunächst einmal ein ISP-Programmer benötigt. Da es diese recht günstig (~10€) in der Bucht gibt gehe ich im weiteren nicht mehr darauf ein.
Zum Flashen muss der entsprechende ISP-Programmer mit den Pins Reset, MISO, MOSI sowie SCK verbunden werden. Diese Möglichkeit habe ich in meinem Layout allerdings nicht vorgesehen, deswegen bietet es sich an den Mikrocontroller extern zu Programmieren. Im Layout gibt es die Möglichkeit den Mikrocontroller über einen Bootloader zu Flashen (nur Flash kein EEPROM) allerdings muss dafür auch zunächst der Bootloader über einen ISP-Programmer in den Chip geschrieben werden.
Im grunde kann dafür jeder Bootloader benutzt werden, ich benutze zurzeit den Bootloader FastBoot von Peter Dannegger.[2]
Das Flashen geschieht mittels eines Bootloader über die serielle Schnittstelle (UART) des Atmega8 (Pins PD0 und PD1). Nutzt man diese Möglichkeit sollte man darauf achten, dass der Mikrocontroller auch keinen Fall direkt mit der seriellen Schnittstelle des PCs verbunden werden darf. Beachtet man das nicht zerschießt man sich die entsprechenden Eingangspins des Atmega. Es muss also zwingend eine Pegelwandlung (± 12V PC <> 0-5V µC) z.B. mit einem MAX232 (es gibt in der Bucht auch schon fertige Schaltungen direkt mit USB/Seriell-Wandler für ~2€) durchgeführt werden.
Diese funktioniert im groben. Allerdings gibt es noch einige Funktionen die ich
umsetzen würde bevor ich die version 1.0 veröffentliche.
TODO:
Zwischenzeiten unterstützenBestzeit im EEPROM sichernNach gewisser Zeit Rundenzeitmessung beenden (Kontakt länger nicht belegt)Taster unterstützung (Reset aktuelle Runde, Bestzeit löschen)LCD Hintergrundbeleuchtung dimmenLCD Menüsteuerung (Anzahl Magnetschleifen, Geschwindigkeit / Drehzahl erfaasen?, ...)
Genauigkeit
Da alle alle Zeiten aus dem externen Quarz abgeleitet werden, hängt die Genauigkeit (Rundenzeiten, ...) maßgeblich von der Genauigkeit des verwendeten Quarz ab. Dieser ist natürlichen Schwankungen aufgrund von Temperatureinflüssen und Alterung unterlegen. Der von mir eingesetzte 4 MHz Quarz im HC-49/US Gehäuse weist einen Temperaturkoeffizient von ± 30 ppm und eine Frequenztoleranz von ebendfalls ± 30 ppm auf. Bei der Verschaltung des Quarz ist außerdem auf die richtige Lastkapazität zu achten entspricht diese nicht genau der vom Hersteller angebenen Kapazität kommt eine weitere Fehlerquelle hinzu. Dabei gilt: Bei kleinere Last schwingt der Quarz schneller und bei größerer Last langsamer. Ausgehend von
umgestelt nach
ergibt sich für einen 4 Mhz Quarz eine Gangabweichung von 120 Hz bei einer Frequenztoleranz von ± 30 ppm.
Quarz-Typ | Frequenzfehler (25°C) | Abweichung (min/jahr) | Abweichung (s/tag) | Abweichung (s/h) | Abweichung (ms/min) | Frequenabw. bei 4 MHz |
---|---|---|---|---|---|---|
Standardquarz (Grundtton) | 30 ppm | 16 min/jahr | 2,6 s/tag | 108 ms/h | 1,8 ms/s | 120 Hz |
Das bedeutet konkret das man bei einer Rundenzeit von ca. 10 min mit einen Fehler von 18 ms rechnen muss. Lässt man auch noch Temperatureinflüsse mit in die Rechnung einfließen kann sich das ganze im Worst-Case noch verdoppeln. Alterungseffekte wurden dabei außer acht gelassen.
Abstimmen des Quarz
Möchte man diese einflüsse so gut es geht kompensieren bietet es sich an zunächst einmal zu schauen mit welcher Frequenz der Quarz den tatsächlich schwingt. Das gestaltet sich allerdings nicht so einfach wie es auf den ersten Blick aussieht. Da der Quarz schon durch geringe Kapazitäten von einigen pF messbar verstimmt wird, würde ein direktes Messen den Quarz messbar verstimmen. Um das Problem zu umgehen kann man den Takt über den Vorteiler eines Timers auf einen IO-Pin ausgeben und dann dort messen.[3]
Zum Abstimmen erstzt man einen Lastkondensator durch einen Trimmkondensator (0-47pF). Dieser wird dann so lange verdreht bis die gewünschte Frequenz auf dem Display des Frequenzzählers angezeigt wird.[4]
Funktionsweise
In den nachfolgenden Kapiteln wird ausführlich auf einzelnen Komponenten des Laptimers eingegangen.
Magnetstreifen
In die Kartbahn sind in der Regel an bestimmten stellen Magnetstreifen eingelassen. Dazu werden einfache Permanent-Magneten genutzt (siehe Quelle Patenschrift). Ein Magnetstreifen sollte sich auf jedenfall auf der Start-/Ziellinie befinden. Je nach Kartbahn gibt es aber auch mehrere Magnetstreifen auf der Strecke die es ermöglichen Zwischenzeiten zu erfassen. Die Magnetstreifen sind i.d.R. ca. 1,8cm breit und umfassen die ganze Länge der Kartbahn. Ein Reed-Kontakt schaltet in ca. 2cm Abstand, von den Permanent-Magneten wobei dieser Wert stark von der Empfindlichkeit des Reed-Kontaktes abhängt.
Rundenzeit erfassen
Um die Rundenzeit zu erfassen, muss zunächst einmal das Magnetfeld des Magnetstreifens beim überfahren erfasst werden. Dazu kann man einen Hallsensor oder Hallschalter einsetzen. Es sollte aber auch eine Reed-Kontakt reichen. Beim überfahren des Magnetstreifens wird der Reed-Kontakt für kurze Zeit geschlossen. Der dadurch entstehende Pegelwechsel wird über den Mikrocontroller über den ICP-Pin (Input Capture) erfasst.
Drehzahl erfassen
Die Drehzahl wird Potentialfrei gemessen was kapazitiv über einen Draht geschieht der um das Zündkabel (Verbindung Zündkerze <> Zündspule) gewickelt wird.
Geschwindigkeit erfassen
Bei der Erfassung der Geschwindigkeit gibt es zwei möglichkeiten. Die Drehzahl der hinteren Achse kann direkt erfasst werden, was z.B. ebendfalls mittels eines Reed-Kontaktes und Magnet (wie beim Fahrrad) geschehen kann. Es besteht aber auch die Option die Geschwindigkeit aus der Drehzahl und dem Übersetzungsverhältnis (Ritzel <> Kettenrad) zu berechnen.
Berechnungen
Rundenzeit
Zunächst berechne ich wielange der Reed-Kontakt Zeit hat um im "Worst-Case" zu schließen. Dazu nehme ich eine Geschwindigkeit von an beim überfahren der Magnetschleife.
Der Reed-Kontakt hat also ca. 0.65 ms Zeit um zu schließen. Bei 50 km/h dementsprechend doppelt so viel (1,3 ms).
Drehzahl / Geschwindigkeit
Das ermitteln der Drehzahl bzw. der Geschwindigkeit gestaltet sich ähnlich. Es wird bei beiden zu messenden Größen die Zeitdifferenz die zwischen zwei Impulsen gemessen und daraus dann die entsprechende Geschwindkeit bzw. Drehzahl berechnet. Da sich Drehzahl und Geschwindigkeit grob nur in dem Übersetzungsverhältnis zwischen Ritzel und Kettenrad unterscheiden, kann mitunter von einer expliziten zusätzlichen Erfassung der Geschwindigkeit oder Drehzahl abgesehen werden.
Berechnungen die ich dazu angestellt habe befinden sich im nachfolgenden Bild oder in dem dazugehörigen PDF im Anhang.
Anmerkung: Nach jedem "Tick" sind 100µs vergangen.
Steuerung
Die (Menü-)Steuerung des Laptimers geschieht über drei auf der Vorderseite angebrachte Taster (Ok/Exit, Hoch, Runter). Die Taster dienen zum einem dazu das Navigieren durch das Menü zu ermöglichen zum anderen aber auch zum zurücksetzen von gespeicherten Rundenzeiten oder zum zurücksetzen des Laptimers.
...
Bilder
Schaltplan
Quelltext
Kommt sobald ich den Code noch ein wenig schön gemacht habe.
Quellen
Schaltplan Drehzahlteil
Patentschrift Alfano E.P.0632350
File:Laptimer Drehzahl Geschwindigkeit.pdf
Einzelnachweise
<references>