Forum: Compiler & IDEs Drehzahlmessung mit Atmega 128


von Michael (Gast)


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
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.

von gast (Gast)


Angehängte Dateien:

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

von Michael (Gast)


Lesenswert?

den code schau ich mir an. DANKE

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

Max Drehzahl ist 2000U/min.

von gast (Gast)


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.

von Michael (Gast)


Lesenswert?

in Deinem Code zählst Du die Ueberläufe.

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.