-         
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Drehzahlmessung mit ATmega16

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72

    Drehzahlmessung mit ATmega16

    Hallo,

    ich habe vor mir einen Drehzahlmesser mit dem ATmega16 zu bauen. Ich hab auch schon etwas experimentiert, aber leider müsste ich wissen wie das mit dem Counter und Timer funktioniert.
    Also ich hab mir das so vorgestellt:
    Sobald eine Zündung erfolgt wird per Interrupt der Timer ausgelöst und beginnt zu zählen. Kommt wieder eine Zündung stopt der Timer und der µC kann dann die Drehzahl ausrechnen und auf einem Display ausgeben.

    Was die Hardwäre betrifft, das ist erstmal egal. Es geht mir einfach nur um den Timer bzw. Counter.
    Ich programmiere in Assembler, also nur zur Info.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Hi,

    du hast das doch schon alles richtig beschrieben wie man es machen muss. Der Rest ( wie man genau welche Register setzen muss usw. ) steht im Datenblatt.

    Wo ist denn jetzt genau das Problem ??
    Für Timer1:
    In der Interruptroutine die durch deine "Zündung" ausgelöst wird fragst du ab ob der Timer schon läuft. Wenn nicht startest du ihn ( Prescalerbits in TCCR1B setzen ). Wenn er schon lief, dann liest du den Wert aus den TCNT1L und TCNT1H aus, berechnest daraus irgendwie deine Geschwindigkeit, löscht das Timer Register wieder und startest den Timer evntl. wieder ...

    Ich hoffe das war verständlich ??

    MfG Kjion

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Hallo,
    das Problem liegt daran das ich beim Dattenbaltt nicht richtig durchblicke. Die tausend Abkürzungen für Register usw.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.05.2004
    Ort
    Schönaich
    Alter
    40
    Beiträge
    315
    Schau mal hier:

    Ist zwar ein AVR Einstiegskurs in C, aber dort sind auch die Register für die Timer aufgelistet (ZIP-Datei mit HTML Seiten):
    http://www.mypage.bluewin.ch/ch_schifferle/Atmel.zip

    Könnte Dir weiterhelfen.
    Spinoza sagt (epist.62), daß der durch einen Stoß in die Luft fliegende Stein, wenn er Bewußtseyn hätte, meinen würde, aus seinem eigenen Willen zu fliegen. Schopenhauer

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    @matren
    ja es hat mir weitergeholfen. Ich habe soweit alles auf die Reihe bekommen.

    Aber jetzt kommt der schwierigere Teil: Die Rechnung!
    Von Zündzeitpunkt zu Zündzeitpunkt bedeutet eine Umdrehung. Der Timer erfasst die Zeitzyklen die der Motor für eine Umdrehung braucht. Demnach komme ich auf diese Formel wenn ich das Ergebnis in 1/min haben will.

    60/[Zyklen*(CPU Takt/1024)]

    Der Term in der () entspricht dem Prescaler der auf 1/1024 eingestellt ist.
    Wie führe ich diese Rechnung aus? Es handelt sich dabei um einen 16Bit Timer.
    Wie kann ich ein Registerpaar (16Bit) mit einer Zahl multiplizieren oder dividieren?

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Wie kann ich ein Registerpaar (16Bit) mit einer Zahl multiplizieren oder dividieren?
    Such mal im Internet nach den entsprechenden Algorythmen ( multiplizieren gibts bei den ATmega's teilweise sogar als Befehl -> siehe Datenblatt : Hardware Multiplier bzw. "mul"-Befehl ). Da sollte sich auf jeden Fall was finden lassen. Selber schreiben würde ich nicht machen, da es sowas wie gesagt schon gibt ...

    MfG Kjion

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Ich hab hier im Forum was gefunden, leider verstehe ich es nicht.

    Ich weiss das durch rotieren nach links die Zahl mit zwei multipliziert und beim schieben nach rechts dividiert wird
    Kann es sein das der µC nur mit 2 multiplizieren bzw. dividieren kann?

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Oh ich hab einen Fehler in der Formel

    60/[Zyklen*(1/CPU Takt/1024)]

    Man braucht ja die Zeit und nicht die Frequenz

  9. #9
    RN-Premium User Begeisterter Techniker
    Registriert seit
    30.04.2004
    Alter
    39
    Beiträge
    245
    hm, je nach dem wie genau du messen willst, und was der mega noch alles machen soll, kannst du das einfacher lösen. Stell doch den Timer 1 auf eine 16tel Sekunde (oder sonst irgendein vielfaches von 2) ein (kann man gut über den Takt ausrechnen). Den Timer 0 nimmst du als Counter. Immer wenn Timer1 abläuft, schau nach wieviele Pulse Counter 0 gezählt hat, 4 mal schieben und schon hast du /min. Counter rücksetzen und wieder von vorne.

    lg
    Alex

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Das verstehe ich nicht so ganz. Wenn ich 1/16Sekunde 4mal schiebe komme ich doch auf eine Sekunde oder?

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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