Drehzahlmesser (bis ca. 20000 Upm) - Reicht ein mega8(8) ?
Hallo
Ich planen den Bau eines Drehzahlmesser für ein Kart. Dies baue ich für einen Freund. Er schätzt die Motorumdrehung auf 15k - 20k die bei Vollgas azuftreten.
Ich möchte somit eine 5 stelliges Display aus 7-Segment LED-Anzeigen verwenden um den gesamten Bereich draufzubekommen.
Bisher habe ich noch keinerlei Erfahrung mit zeitkritischen Schaltungen wie es hier der Fall ist. Programmiert wird dann in C.
Ein paar Probleme die mir spontan eingefallen sind:
- Reicht die Leistung des ATmega8 aus um die Drehzahl damit zu messen und gleichzeitig 5 7-Segmentdisplays im Multiplex verfahren anzusteuern und das flimmerfrei?
- Welche besondere Vorkehrungen bzw Schutzmaßnahemn sind notwendig wenn ich den Microcontroler am 12V Boardnetz betreibe?
- Reicht da ein einfach 7805 Festspannungsregler und ein zwei Schutzdioden oder benötigt es da mehr?
- Sollte ich besser den ATmega88 nehmen? Einen ganz anderen?
- Wäre es ratsam ein, zwei oder mehr Toggle-Flipflop vorzuschalten um nur die halbe bzw viertel Frequenz auswerten zu müssen (große Recheneinsparung bzw Timerauflösung nicht ausreichend!). Pro Zündung wird ein Impuls ausgelöst, d.h. bei 15k Upm 30k mal Interruptaufruf/min (2-Takter) - viel zu viel für den ATmega oder?
- Wie muss ich den Eingang filter um den AVR / Transistor nicht zu beschädigen?
12V liegen dauernd an, wenn Zündung kommt dann ist 0V. Signal wandel ich vorher mittles Transistors in 5V bzw 0V um, aber:
In der Zündspule findet ja eine Gegeninduktion statt, sobald der Unterbecherkontakt öffnet d.h. mehre tausend Volt werden auf die Basis des Transistors geleitet. Wie sicher ich das ab? Freilaufdiode oder einfach großer Widerstand?
Hier hab ich was schönes gefunden http://www.fda-technology.de/downloa...ltplan_1_5.gif
(links oben) das is getestet und funktioneirt also Übernehm ich diesen Teil einfach ;-)
Andere Vorschläge werden gerne angenommen, außer einfach was fertiges zu kaufen!
Hab ich mich mit meinem 1. Projet zu weit aus dem Fenster gelehnt oder ist sowas (für mich) machbar. Ich mache schon seit einigen Jahren mit PICs rum und löten kann ich auch. Außerdem bin ich im. 3. Lehrjahr in einer Ausbildung zum Elektroniker für Geräte und Systeme. Elektronik selbst hab ich schon seit dem ich klein bin als Hobby angefangen.
Vielen Dank für die Mühe sichdas ganze durchzulesen und für die hoffe nun bald folgenden Antworten :-)
Ich fang solange mal an einen Schaltplan zu entwerfen.
mfg
Benny
Re: Drehzahlmesser (bis ca. 20000 Upm) - Reicht ein mega8(8)
Zitat:
Zitat von HF SHOOTER
... planen den Bau eines Drehzahlmesser für ein Kart. ... 15k - 20k die bei Vollgas azuftreten. ... 5 stelliges Display aus 7-Segment LED-Anzeigen verwenden um den gesamten Bereich draufzubekommen. ...
Und wer soll das beim Vollgasstress dann ablesen? Ich bin der Meinung, dass es ergonomisch viel sinnvoller wäre für jeden Tausender, oder jeden zweiten, eine LED anzuzünden. Vielleicht für die unteren 10000 fünf in Orange (nicht rot, das würde die folgenden stören), danach 4 Stück für alle 2000 (oder acht für die interessanten 8000 - die beiden letzten dann BESONDERS hell) in Grün - also bis 18000 - und darüber in Rot !? Aber die Aufteilung ist sicher wurscht, blos - bei Vollgas will doch keiner ein 5stelliges 7-Segment-Display lesen - es gibt ja Gründe für Vollgas - und die liegen bei Kartbahnen vermutlich nicht in einer endlos langen Geraden, oder?
Und denk daran, die letzten zwei oder drei Stellen werden so unruhig hin und her zappeln, dass man Schädelweh bekommen wird - ablesen wird man da doch nix können, denke ich.
Das Display wird nicht unnütz sein - das bau irgendwo neben dem Motor ein, für Einstellzwecke.
Liste der Anhänge anzeigen (Anzahl: 1)
So in der Zwichenzeit habe ich mich ein wenig mit der Programmierumgebung etc. vertraut gemacht. Und habe auch schon erste Ergebnisse laufen.
Im Moment zählt der mega8 von 0 -9 und gibt die Zahl auf dem 7-Segment Display aus. Davon hab ich auch mal ein Bild gemacht.
Jetzt würde ich gerne noch eine LED an PB0 blinken lassen, über den Timer0.
Folgender Code funktioniert nicht, die ISR vom Timer0 wird einfach nicht aufgerufen.
Code:
/* Projekt: Drehzahlmesser
Anzeige der Drehzahl auf 5 7-Segment-Anzeigen.
Anzeigen werden im Multiplexverfahren angesteuert,
die Drehzahl alle 100ms aktualisiert.
Später sollen noch max. Drehzahlspeicherung sowie eine
Begrüßung beim Einschalten hinzukommen.
AUTOR: Benjamin Ruppert
DATUM: 01.11.2007 - gute Frage */
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/interrupt.h>
/* Variablendeklaration */
uint8_t SEGMENT; // Bit0 = Seg. a ... Bit6 = Seg. g
uint8_t Zahl;
/* Prototypendeklaration */
void ZahlInSegment(uint8_t);
// Konvertierung Zahl -> Segmentanzeige
void ZahlInSegment(uint8_t Zahl) {
switch(Zahl) {
// Segment: gfedcba
case 0: SEGMENT = 0b00111111; break;
case 1: SEGMENT = 0b00000110; break;
case 2: SEGMENT = 0b01011011; break;
case 3: SEGMENT = 0b01001111; break;
case 4: SEGMENT = 0b01100110; break;
case 5: SEGMENT = 0b01101101; break;
case 6: SEGMENT = 0b01111100; break;
case 7: SEGMENT = 0b00000111; break;
case 8: SEGMENT = 0b01111111; break;
case 9: SEGMENT = 0b01100111; break;
// Segment: gfedcba
}
PORTC = 0x00; // PC0 - PC5 auf 0
PORTB &= ~(1 << 1); // PB1 auf 0
// Ausgänge setzen, wie 7-Segment angeschlossen ist
if (SEGMENT & (1 << 0)) { PORTC |= 0b00001000; } //a an PC3
if (SEGMENT & (1 << 1)) { PORTC |= 0b00010000; } //b an PC4
if (SEGMENT & (1 << 2)) { PORTC |= 0b00000001; } //c an PC0
if (SEGMENT & (1 << 3)) { PORTC |= 0b00000010; } //d an PC1
if (SEGMENT & (1 << 4)) { PORTB |= 0b00000010; } //e an PB1
if (SEGMENT & (1 << 5)) { PORTC |= 0b00000100; } //f an PC2
if (SEGMENT & (1 << 6)) { PORTC |= 0b00100000; } //g an PC5
}
// LED blinken lassen
ISR(TIMER0_OVF_vect)
{
if (PINB & (1 << 0)) { PORTB |= 0b00000000; }
else { PORTB |= 0b00000001; }
}
int main(void)
{
DDRC = 0b00111111; // PC0 - PC5 als Ausgang
DDRB = 0b00000011; // PB0 - PB1 als Ausgang
Zahl = 0;
// Timer konfigurieren und GIE-Flag setzen
TCCR0 |= (1 << CS01); // Vorteiler 8
sei();
while(1)
{
// Auf dem 7-Segment Display die Zahlen 0 - 9 anzeigen
ZahlInSegment(Zahl);
Zahl++;
if (Zahl > 9) { Zahl = 0; }
_delay_ms (250);
}
}
Über Tipps wäre ich dankbar.
EDIT: Habe vergessen den Timer0 Interrupt freizuschalten. Jetzt klappts.
mfg
Benny