Drehzahlmessung mit Atmega 128

Gast #1144569
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
1
volatile u32 seconds;
2
volatile u08 rounds;
3
volatile u16 rpm;
4

5
void timer1 (void)
6
{
7
  // Timer1 settings: ~ 8000000 ticks (2 sec)
8
  TCCR1B = (1<<CS12); // prescaler = 256
9
  // init counter
10
  TCNT1H = 11;
11
  TCNT1L = 220;
12
  //TIMSK = (1<<TOIE1); // Timer1 Overflow Interrupt Enable
13
  TIMSK = (1<<OCIE1A);// enable irq: compa
14
}
15

16
void extInt (void)
17
{
18
  EICRB =  (1 << ISC41);
19
  EIMSK =  (1 << INT4);
20
}
21

22
// Timer1 Compare A
23
ISR(TIMER1_COMPA_vect)
24
{
25
  TCNT1H = 11;
26
  TCNT1L = 220;
27
  seconds += 2;
28
  if(seconds%6==0)
29
  {
30
    rpm = rounds * 10;
31
    rounds = 0;
32
  }
33
}
34

35
ISR(INT4_vect)
36
{
37
  rounds++;
38
}
39

40
timer1();
41
extInt();
42
sei();

am PIN4 werden die Impulse gezählt.
Alle 2 Sekunden tritt der Timerinterrupt auf und berechnet die Drehzahl.
Gast
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
Angehängte Dateien:
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.