- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Drehzahlmesser (bis ca. 20000 Upm) - Reicht ein mega8(8) ?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    35
    Beiträge
    116

    Drehzahlmesser (bis ca. 20000 Upm) - Reicht ein mega8(8) ?

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    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.
    Wenn man die Drehzahlerfassungsroutine in Assember proggt hab ich schon Drehzahlen bis 800.000 U/min ohne Probleme messen können, mit einem 8MHz Quarz - Also NO PROBLEM

    Reicht die Leistung des ATmega8 aus um die Drehzahl damit zu messen und gleichzeitig 5 7-Segmentdisplays im Multiplex verfahren anzusteuern und das flimmerfrei?
    Auch das sollte machbar sein.

    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?
    Da es im Auto immer wieder zu Spannungsspitzen kommen kann, würd ich vieleicht noch einen Vorwiderstand mit Varistor oder Z-Diode und eine Drossel vorschalten. Erst danach sollte ein 7805 kommen.
    Aber da wissen sicher die Autoelektroniker hier mehr als ich.

    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?
    Nö, kannst Du Dir wirklich sparen und verschlechtert nur die Auflösung in niedrigen Drehzahlbereichen.

    Zu deiner Eingansschaltung würde ich evtl gleich einen Optpkoppler nehmen.
    Da hast Du dann gleich eine galvanische Trennung und eine Pegelwandlung in einem. Die LED des Optokopplers musst Du natürlich vor Überspannungen und hohen negativen Spannungen schützen.

    Der ATMEGA8 sollte deinen Aufgaben gewachsen sein, wenn Du meinst kannst Du aber auch gerne den Pinkompatiblen ATMEGA88 einsetzen.

    Zur Ansteuerung deiner LED's müsstest Du aber noch einen Treiberbaustein einsetzen, da ein ATMEGA 8 nur maximal 20mA gegen Masse schalten kann. Gegen +5V sind es meines Wissens nur 10mA, also zu wenig für deine LED's im Multiplexverfahren.

    Da LED's dann doch einiges an Strom schlucken, wie wärs mit einem DOT Matix Display ? ein 1x16 oder 2x 16 kostet bei Pollin nicht die Welt ?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    35
    Beiträge
    116
    Hallo

    Vielen Dank für die promte ausführliche Antwort.

    Sehr gut das die hier vorkommende Umdrehungszahl problemlos verarbeitet werden kann.

    Die idee mit dem Optokopller ist sehr gut, ein CNY17 sollte das auch problemlos bewältigen können.
    Wie schütz ich denn diese LED vor diesen negativen Spannungsspitzen die ja sehr häufig auftreten? Einfach durch eine Shotky-Diode kurzschließen?

    das ich einen Treiber benötige ist mir eigentlisch schon klar - aber trotzdem danke für den aufmerksamen Hinweis. Ich denke ich nehm den Standart-Treiber ULN2803.

    Ich möchte gerne 7-Segment Displays verwenden damit man es gut ablesen kann. Außerdem finde ich in diesem Fall passt es einfach besser und ich muss endlich mal ein Projekt mit Multiplexin machen, das wollt ich sowieso schon immer mal

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    44
    Beiträge
    689
    Das ermitteln der Drehzahl sollte nicht das problem sein wenn mann die Drehzahlen auf nen Counter-Eingang legt und nach 100ms auswertet. Damit sollte das auch in Hochsprachen möglich sein und der µC hat genug Zeit zum Multiplexen. Das könnte man sich aber auch noch ersparen wenn man für die Anzeige Schieberegister einsetzt.

    Das Projekt sollte also machbar sein mit nem Mega8

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    35
    Beiträge
    116
    Also wenn die Leistung ausreicht dann würde ich gerne dieses Projekt mit Multilexing machen weil ich wie oben bereits geschrieben das gerne schon immer mal machen möchte und auch mein Wissenstand durch praktische Erfahrung dann erweitern kann - theoretisch kann ichs, zumindest mehr oder weniger .

    Mit Counter-Eingang meinst Du doch für jede Flanke eine Variable um eins hochzuzählen.
    Dann kann cih ja beim Überlauf eines Timers (z.B. nach 100ms) den Zählstand auswerten und mit ner Formel die Umdrehunszahl berechnen.

    mfg
    Benny
    cooming soon...

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    Mit Counter-Eingang meinst Du doch für jede Flanke eine Variable um eins hochzuzählen.
    Dann kann cih ja beim Überlauf eines Timers (z.B. nach 100ms) den Zählstand auswerten und mit ner Formel die Umdrehunszahl berechnen.
    Nun ich denke das Rofo88 meint einen T Eingang zu benutzen.
    Der ist eigentlich dafür gedacht um die Timer mit externen Takten zu versorgen. Allerdings könntest Du diesen Eingang in deiner Applikation auch als Taktzähler missbrauchen.
    Ein zweiter Timer gibt dann die Torzeit vor und liest den Zähler aus um ihn anschließend wieder auf 0 zu setzen. Das verbraucht sehr wenig Rechenzeit, da fast die komplette Drehzahlerfassung mit Hardware realisiert ist.

    Mit einer Torzeit von 100ms und Impulszählung würde ich den Drehzahlmesser nicht realisieren. Da bekommst Du eine Auflösung von 600U/min was gerade bei niedrigen Drehzahlen mehr als dürftig ist.

    Bei niedrigen Drehzahlen ist meiner Meinung nach die Impulsdauermethode die beste Variante. Das bedeutet ein Timer läuft frei mit dem heruntergeteilten Quarztakt und wird bei jeder Umdrehung (= Impuls vom Geber) ausgelesen. Die Der Zählerstand dieses Zählers ist das Maß für die Drehzahl. Den Zählerstand durch eine Formel gejagt und man kriegt die Drehzahl raus. Dadurch bekommt man gerade bei niedrigen Drehzahlen eine sehr gute Auflösung. Je höher allerdings die Drehzahl wird umso höher wird der Fehler und umso größer ist die Prozessorbelastung.
    Mit einem 16MHz getakteten ATMEGA8 sollten aber Drehzahlen bis 30.000 U/min mit einem maximalen Fehler von 60 U/min bei dieser Methode kein Problem sein. Schau mal im Datenblatt unter ICP nach. Dieser Eingang würde sich vorzüglich dafür eignen.
    Noch eine kleine Krux bei dieser Variante ist, das die letzte gemessene Drehzahl bei Stillstand des Motors "stehen" bleibt. Aber das kann man ja durch ein Timeout detektieren und die Drehzahl dann auf 0 setzten.

    Ich bastel schon ein wenig länger an Modellbau Drehzahlmessern rum und hab deshalb schon so einiges ausprobiert.
    In meiner letzten Drehzahlmesser Variante benutze ich beide Methoden zur Drehzahlerfassung und schalte ab einer bestimmten Drehzahl zwischen den beiden Methoden um. Allerdings nehm ich dabei eine Torzeit von 1 sek, was für dich dann wohl zu langsam ist - Auch deshalb würd ich die Impulsdauermethode vorziehen, da dabei bei jeder Umdrehung ein neues Ergebnis zustande kommt.

    Für die Ansteuerung deines Displays würd ich mir eine Look Up Table machen in der dann je nach anzuzeigender Zahl die entsprechenden Segmente aktiviert werden.

    Die Umschaltung zwischen den einzelnen Stellen des Displays würd ich in einem Timer Overflow Interrupt ansiedeln.
    Dein Hauptprogramm berechnet dabei dann die einzelnen Digits und speichert Sie in einer Tabelle ab. Der Timer Interrupt gibt dann einfach eine Stelle nach der anderen aus.
    Ein wirklich kleines Problemchen dürfte noch das Unterdrücken der führenden Nullen sein, aber auch das ist mit ein klein wenig Hirnschmalz sicher ein lösbares Problem.

    Evtl. würd ich mir noch einen Speicher für die maximal vorgekommene Drehzahl in den Drehzalmesser mit einbauen. Du willst ja schließlich wissen, wann es deinen Motor zerlegt hat

    Na, dann kann ich Dir wohl nur noch viel Glück und Spaß bei der Realisierung deines Projektes wünschen.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    35
    Beiträge
    116
    Uiuiui...

    Mit so ner großen Resonaz in der Zeit habe ich wirklich nicht gerechnet. Großes Lob! Mir is klar das es sowohl mit einem ATmega8 und mit einem ATmega88 geht allerdings würd ich gerne den Rat eines Profis hören welchen ich lieber benutzen sollte.
    Ode rmals anders gefragt: Wird der "Nachfolger" bei den neuen Entwicklungen bevorzugt eingesetzt oder bringt er keine Vorteile. Da er Pincompatibel ist ist ein Programm normalerweise auch relativ einfach für den anderen Controler umzuschreiben, oder?


    Ich habe mich nunmal ein wenig genauer mit den Timern befasst, mit denen kann man ja doch ganz schön viele unterschiedliche Dinge machen, wie das beim PIC ist kann ich nicht beurteilen da ich mich da kaum mit anderen Anwendungen des Timers als den klassischen Overflow-Interrupt auseinander setzen musste. Also noch ein paar nähere Details bitte zu folgendes:

    Mit einem T-Eingang, z.B. T0 (Pin 6) lege ich den Takt des Timers fest, dieser darf also auch nicht höher sein als die Taktfrequenz des Prozessors, richtig?
    Aufwändiger kann ich es machen (hat aber im Endeffekt den selben Effekt)
    indem ich eine Flanke an einem Interuppt-Eingang (z.B. Pin 4) erkenne und dann eine Variable um 1 inkrementier, oder?

    Im Hintergrund lass ich nen weiteren Timer laufen damit ich dann bei einem festen Wert, wie z.B. alle 25 ms nachschaue wie viel Impulse aufgetreten sind und daraus dann die Drehzahl berechne.
    Ist es möglich beim ersten Timer zusätzlich noch einen Interrupt auszuführen, z.B. nach 100 Impulsen.

    Idee:
    Sobald einer der beiden Timer überläuft bzw. den Soll-Wert erreicht hat (100 Impulse oder 25ms) setz ich beide auf 0.
    Grund ist folgender:
    - langsame Drehzahl (Timer 2 schlägt zuerst zu -> Impulsdauermethode)
    - hohe Drehzahl (Timer 1 schlägt zuerst zu -> Impulsanzahlmethode?)

    Setz ich nun beide Timer auf 0 sobald nur einer ausgelöst wird kommen sie sich nicht mehr in die Quere, denn z.B. folgender fall könnte das Ergebnis total verfälschen:
    Timer 1 hat einen Zählstand von 80, Timer 2 erreicht 25ms -> korrekte Drehzahlbestimmung.
    Timer 1 erreicht 100, Timer 2 z.B. erst bei 2ms -> oha 100 Impulse in nur 2 ms -> gigantische Drehzahl.

    So wie Du das beschreibst mit der Ansteuerung der Segmentanzeige habe ich es auch schon vorgehabt.
    Mittels Tabelle schauen welches Segment angesteuert werden muss und der restliche Schnickschnack wie führende Null wegbekommen ist denk ich kein Problem, aber da kann ich mich erst genaueres sagen wenn ich die Hardware habe und dann acuh anfange mit dem Multiplex Verfahren.
    Genausowenig dürfte es ein Kinderspiel sein die Upm max abzuspeichern (EEPROM).
    Schön wäre z.B. noch ein Blinken der Anzeige bei neuem Rekord ode rbei zu hoher Drehzahl.
    Man kann ja wenn es dann funktioniert das ganze noch durch ein zwei Tastern erweitern.
    Interesant wär auch noch ne Anzeige der Betriebsstunden bzw. -minuten des Motors auf Knopfdruck oder beim einschalten. Aber das alles nachdem die Grundfunktion funktioniert.


    Sehe ich das richtig das ich 3 Timer benötige?
    2 für Impulsdauer bzw Impulsanzahl
    1 für Multiplex-Ausgabe


    Wichtig wär mir noch einen Tipp zur Schutzbeschaltung für die auftretende Gegeninduktion beim Öffnen des Unterbrecher Kontakts. Normalerweiße müsste es doch wie bei einem Relai eine Freilaufdiode tun die die Sperrspannung an der LED auf 0,7V bzw 0,3V begrenzt.
    Nur ist diese Didoe evtl. für diese Frequenzen zu langsam?


    mfg
    Benny

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    Mit einem T-Eingang, z.B. T0 (Pin 6) lege ich den Takt des Timers fest, dieser darf also auch nicht höher sein als die Taktfrequenz des Prozessors, richtig?
    Ich denk mal das die Frequenz nicht höher sein darf als 16MHz ansonsten dürfte es egal sein.
    Du kannst den Timer über den T0 Eingang ansteuern, den internen Prozessortakt verwenden und ich glaub sogar den Watchdog Timer als Taktquelle verwenden.
    Egal welchen dieser Eingänge du nimmst kannst Du mit dem Prescaler diesen Takt für den Timer nochmal runterteilen.
    Die Timer des ATMEGA8 sind wirklich sehr vielseitig.

    Im Hintergrund lass ich nen weiteren Timer laufen damit ich dann bei einem festen Wert, wie z.B. alle 25 ms nachschaue wie viel Impulse aufgetreten sind und daraus dann die Drehzahl berechne.
    Ist es möglich beim ersten Timer zusätzlich noch einen Interrupt auszuführen, z.B. nach 100 Impulsen.
    Das geht mit Timern die eine Comparematch Möglichkeit haben, aber was soll das bringen ?
    Sobald einer der beiden Timer überläuft bzw. den Soll-Wert erreicht hat (100 Impulse oder 25ms) setz ich beide auf 0.
    Ich würd nicht den INT0 für die Drehzahlerfassung verwenden, sondern den ICP des Timers 1. Bei dem wird nämlich der aktuelle Zählerstand gleich ins Input Capture Register des Zählers 1 abgespeichert.
    Den Timer1 würde ich mit dem internen Prozessortakt 16MHz laufen lassen.
    Er scafft dann 244 komplette durchläufe in einer Sekunde.
    Wenn Du nun bei jedem Timer1 Overflow Interrupt ein Register mit hochzählst (Timer1 ist ein 16Bit Timer) bekommst Du einen Timer mit 24 Bit Auflösung. In diesem Timer1 Overflow Interrupt zählst Du dann noch ein zweites Register mit hoch. Dieses Register wird nach einem neuen Drehzahlimpuls wieder auf 0 gesetzt, ebenso wird das Flag "Drehzahl 0" eventuell gelöscht. Hat dieses Register einen Zählerstand höher als 244 (z.B.) wird ein Flag gesetzt das die Drehzahl 0 ist. Dieses Register fungiert also als Indikator für einen stehenden Motor.
    Der Timer 1 und das zugehörige Überlauf Register wird niemals von Dir auf 0 gesetzt, sondern läuft frei durch.
    Die Drehzahlermittlung wird durch abziehen des Timerwertes (24 Bit) des vorherigen ICP Interrupts ermittelt.
    Die Berechnung der Drehzahl würd ich in der Hauptroutine erledigen, da dabei auch Divisionen oder ähnliches auftreten können.

    Beispiel:
    Ein ICP Interrupt bei 1234, der nächste bei 2345;
    2345 - 1234 = 1111.
    Die 1111 gehen in die Drehzahlberechnung ein die 2345 werden auf dem Speicherplatz der 1234 gespeichert - vorbereitung für die nächste Messung.

    Somit erhältst Du bei jedem Impuls deines Drehzahlsensors eine neue Drehzahlausgabe.
    Bei dieser Methode wird nur der Timer 1 verbraten, die beiden anderen Timer 0 und 2 bleiben für andere zwecke frei.

    Im Timer1 Overflow Interrupt kannst Du dann auch gleich dein Multiplexing erledigen, wobei dann aber bei 5 Digits eine Refreshrate von unter 50Hz zustande kommt.

    Also dann doch lieber einen eigenen Timer dafür verwenden z.B. Timer0 mit Prescaler 64 ( bin mir jetzt gerade nicht sicher ob das geht ) auf internen Takt. Dann komm ich auf eine Refresh Rate von 195Hz und da sollte nichts mehr flackern.

    Da in deinen Interruptroutinen dann nur Speicherzugriffe, Additionen Subtraktionen und Inkremente auftreten ließe sich das wunderbar in Assembler proggen - wenn Du das willst.

    Normalerweiße müsste es doch wie bei einem Relai eine Freilaufdiode tun die die Sperrspannung an der LED auf 0,7V bzw 0,3V begrenzt.
    Hätte ich auch so gemacht.
    Ich meine aber das Du für die LED im Optokoppler noch einen Vorwiderstand brauchst.
    Wenn Du nun diesen Vorwiderstand aus 2 Widerständen aufbaust und am Mittelpunkt dieser 2 Widerstände nochmal eine Z-Diode einbaust sollten auch hohe induktionsspitzen deiner LED nichts anhaben können.
    Wenn Du Angst hast die Freilaufdiode wäre zu lansam kannst Du eine Schottky Diode verwenden.

    Übrigens hohe Frequenzen - bei einer Drehzahl von 20000 U/min liegt bei einem Impuls pro U/min eine Frequenz von 333Hz an. Das ist dann gerade mal ein wenig mehr als Gleichstrom

    Zu ATMEGA88 kann ich leider nicht viel sagen, hab damit noch nichts damit gemacht.

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Ein ATmega 8 reicht leicht aus. Einem Anfänger würde ich diesen auch eher empfehlen als einen ATmega 88, da der 88'er ein paar kleine fiese Fallen hat.

    Das Projekt selbst dürfte auch ein ziemlich guter Einstieg in die Mikrocontrollerprogrammierung sein, da eigentlich alles wichtige zumindest angerissen wird.

    Grüße,
    Hanni
    Grundregeln des Forenpostings:
    1. Nutze niemals die Suchfunktion!
    2. Überprüfe niemals die Topics nach Ähnlichkeiten!
    3. Schreibe alles in hellgelb!

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der takt am T0 / T1 Einang darf aller höchstens so schnell wie der CPU takt sein, eventuell sogar nur halb so hoch, aber das ist hier eher uninteressant, denn hier liegt die Frequenz ja viel niedriger.

    Eine normale Diode ist als Freilaufdiode immer schnell genug, denn beim "Einschalten" sind alle Dioden schnell (nur durch die Induktivität der Zuleitungen begrenzt). Die schnellen Dioden sind nur beim Ausschalten schneller. Wegen der eher niedrigen Frequenz kann man auch gleich einen Kondensator Prallel zu Sendeseite des Optokopplers schalten um kurze Spitzen zu vermeiden.

    Da die Optokoppler immer etwas kappatzitive Kopplung haben, sollte auch an die Ausgangsseite ein Kondensator um kurze Spitzen und damit Fehltrigger zu vermeiden.

    Es sollte sogar ein Mega48 reichen. In Assembler tuts auch ein Tiny2313, da werden aber die Portpins schon knapp. Ich habe z.B. einen Frequenzzähler mit einem Tiny2313 und gemultiplexten 7 Stellen LED Anzeige aufgebaut.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus