www.mikrocontroller.net

Forum: Compiler & IDEs Drehzahlmessung mit Atmega 128


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte die Drehzahleines Motor messen.
Folgenden Code habe ich geschrieben, irgendwo ist noch ein Fehler da die 
Drehzahl nicht stimmt.
Ist das die richtige Vorgehensweise?
Atmega128 mit 8Mhz
volatile u32 seconds;
volatile u08 rounds;
volatile u16 rpm;

void timer1 (void)
{
  // Timer1 settings: ~ 8000000 ticks (2 sec)
  TCCR1B = (1<<CS12); // prescaler = 256
  // init counter
  TCNT1H = 11;
  TCNT1L = 220;
  //TIMSK = (1<<TOIE1); // Timer1 Overflow Interrupt Enable
  TIMSK = (1<<OCIE1A);// enable irq: compa
}

void extInt (void)
{
  EICRB =  (1 << ISC41);
  EIMSK =  (1 << INT4);
}

// Timer1 Compare A
ISR(TIMER1_COMPA_vect)
{
  TCNT1H = 11;
  TCNT1L = 220;
  seconds += 2;
  if(seconds%6==0)
  {
    rpm = rounds * 10;
    rounds = 0;
  }
}

ISR(INT4_vect)
{
  rounds++;
}

timer1();
extInt();
sei();

am PIN4 werden die Impulse gezählt.
Alle 2 Sekunden tritt der Timerinterrupt auf und berechnet die Drehzahl.

Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ISR(INT4_vect)
{
  rounds++;
}

was ist wenn der Motor so schnell dreht, dass rounds überläuft...

miss lieber die Zeit zwischen z.B 10 Impulsen und berechne daraus die 
Frequenz

d.h. du bauchst die Startzeit, die Endzeit und die eventuellen 
Timerüberläufe

schau die mal den angehängten Code an, der funktioniert bei mir tadellos

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
den code schau ich mir an. DANKE

Der Motor läuft nicht so schnell dass rounds überläuft.

Max Drehzahl ist 2000U/min.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: deine Variante (impulse über fetse Zeit messen) ist für 
schnelle Signale gut, hat bei langsamen aber einen zu großen Fehler (je 
schneller die zu messende Frequenz, dest geringer ist hier der Fehler)

meine Variante zählt feste Impule über die entsprechende Zeit, hat den 
Nachteil, dass die Messzeit bei sehr langsamen Signalen steigt (ist 
dafür aber sehr genau)
bei schnellen Signalen kommt man dann an die Grenzen des µC, da ja nur 
diskrete Zeitabstände gemessen werden können (Takt begrenzt Messung). Da 
würde man dann zu deiner Variante wechseln.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in Deinem Code zählst Du die Ueberläufe.

In der Hauptschleife multiplizierst Du dann mit 65635.
Sollte da nicht 65535 stehen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.