Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Lüfter-Drehzahlmessung


von Lüfter (Gast)


Lesenswert?

Hallo,

ich habe einen 80mm Lüfter mit PWM-Eingang und Tachoausgang. Um mich in 
die Regelungstechnik wieder etwas einzuarbeiten will ich die 
Lüfterdrehzahl regeln. Verwendet wird ein Atmega32 bei 16MHz.

Ich habe mit der Drehzahlmessung angefangen. Der Lüfter hat eine 
Drehzahlbereich von ca. 600 bis ca. 2000 1/min. Pro Umdrehung gibt er 2 
Impulse am Tachoausgang aus.

f_max = 2000 1/min  /  60 s/min  *  2 Impulse/1 = 66,66 Hz ~ 70 Hz

f_min = 600 1/min  / 60 s/min  *  2 Impulse/1 = 20 Hz


Den Tachoausgang habe ich am INT0-Eingang angeschlossen.
Timer2 läuft mit einer Frequenz von 10kHz (T = 100µs) und inkrementiert 
bei jedem Aufrufen der ISR die Variable timer2_100miksec.

Wird INT0 (positive Flanke vom Eingang) ausgelöst wird in seiner ISR der 
Inhalt von timer2_100miksec in einen Speicher (timer2_speicher) gelegt 
und timer2_100miksec auf 0 zurückgesetzt. Der Inhalt der Variable 
entspricht dann folglich der Anzahl der "100µs-Schritte" zwischen zwei 
positiven Flanken vom Tachosignal.

In der while-Schleife in der Main wird geprüft ob timer2_speicher 
ungleich 0 ist und ruft dann die Funktion 'drehzahl_berechnen' auf.
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include "lcd.h"
6
7
volatile uint16_t timer2_100miksec = 0;
8
volatile uint16_t timer2_speicher = 0;
9
volatile uint16_t n = 0;
10
11
ISR(INT0_vect)
12
{
13
  if(timer2_speicher == 0)
14
    timer2_speicher = timer2_100miksec;    
15
  
16
  timer2_100miksec = 0;
17
}
18
ISR(TIMER2_COMP_vect)
19
{
20
  if(timer2_100miksec < 0xffff)  //Abfrage damit bei n = 0 kein Überlauf stattfindet
21
    timer2_100miksec++;
22
}
23
void int0_init(void)
24
{
25
  DDRD &= ~(1<<PD2);
26
  PORTD |= (1<<PD2);
27
28
  //Init extern INT0
29
  MCUCR |= (1<<ISC00) | (1<<ISC01);
30
  GICR |= (1<<INT0);
31
}
32
void timer2_init(void)
33
{
34
  // Timer 2 konfigurieren: 10kHz
35
  TCCR2 = (1<<WGM01); // CTC Modus
36
  TCCR2 |= (1<<CS00) | (1<<CS01); // Prescaler 64
37
  // ((16000000/64)/10000) = 25
38
  OCR2 = 25-1;
39
  
40
  // Compare Interrupt erlauben
41
  TIMSK |= (1<<OCIE2);
42
}
43
void init_lcd(void)
44
{
45
  lcd_init(LCD_DISP_ON);
46
  lcd_clrscr();
47
}
48
uint16_t drehzahl_berechnen(uint16_t timerwert)
49
{
50
  // Plausibilitätsprüfung für Drehzahlbereich 600...2000 1/min (mit Reserven)
51
  if(timerwert < 130)    //entspricht 13ms, n~ 2300 1/min
52
    return -1;
53
  else if(timerwert > 1200)  //entspricht 120ms, n~ 500 1/min
54
    return 0;
55
  else        // Wert plausibel, n berechnen
56
    return 600000 / timerwert;
57
}
58
int main(void)
59
{
60
  init_lcd();
61
  int0_init();
62
  timer2_init();
63
  
64
  char buffer[10];
65
  uint32_t zaehler = 0;  // Laufvariable, damit LCD nicht ständig neu beschrieben wird
66
67
  sei();
68
  
69
  while(1)
70
  {
71
    if(timer2_speicher != 0)
72
    {
73
      n = drehzahl_berechnen(timer2_speicher);
74
      timer2_speicher = 0;
75
    }
76
        
77
    if(zaehler == 0)
78
    {
79
      lcd_clrscr();
80
      itoa(n, buffer, 10);
81
      lcd_puts(buffer);
82
      zaehler = 0xffff0;
83
    }
84
    zaehler--;
85
  }
86
}

Mit diesem Code läuft die Messung soweit ganz gut. Der Messwert schwankt 
bei voller Drehzahl nur um ca. 60 1/min, was mir völlig ausreicht.

Steuere ich die Lüfterdrehzahl jedoch mittels PWM an, so kommt es sehr 
häufig zu Messungen, die bei der Plausibilitätsprüfung in der Funktion 
"drehzahl_berechnen" ausgefiltert werden. Zudem wird teilweise eine 
Drehzahl von 2000 1/min berechnet, obwohl diese durch die 
PWM-Ansteuerung im Bereich von 1000 1/min liegen muss. Der Messwert 
springt manchmal um 1000 1/min, was der Lüfter mit Sicherheit nicht 
macht.

Leider habe ich im Moment nur die Möglichkeit das PWM-Signal zur 
Drehzahlsteuerung vom selben µC zu erzeugen. Dabei macht es jedoch 
keinen Unterschied, ob das PWM-Signal mit Timer0 oder in der 
While-Schleife (ich weiss, unschön) erzeuge. Hardware-PWM ist bei dem 
Evaluationsboard wegen der sonstigen Beschaltung nicht möglich.

Was kann ich übersehen haben, dass die Drehzahlmessung nicht 
funktioniert wenn ich die Lüfterdrehzahl steuere?

Danke

von Michael K. (Gast)


Lesenswert?

Mal das PWM Signal gemessen was da am MCU Eingang liegt ?
Sind das saubere Rechtecksignale von 0 - VCC ?

von Udo S. (urschmitt)


Lesenswert?

Sicher daß der Lüfter auch dann saubere Tachosignale ausgibt wenn er mit 
PWM angesteuert wird.
Ich kenne das so, daß man beim Messen der Drehzahl in der Messzeit 
Spannung an den Lüfter haben muss damit der Tachogenerator kein Mist 
ausgibt.

Wenn der Tachogenerator nur bei Spannung an funktioniert:
Du musst die PWM so langsam machen, daß du in dem High Zeitfenster die 
Drehzahl erfasst, oder du musst zum Messen kurz ein durchgehendes High 
auf den Lüfter geben.

von MaWin (Gast)


Lesenswert?

Bei Lüftern mit 4 Anschlüssen funktioniert der Tachoausgang auch wenn 
der PWM EINgang gerade 0 ist.

Bei Lüftern, deren Versorgungsspannung per PWM ein- und ausgeschaltet 
wird, funktioniert der Tachoausgang natürlich nicht wenn der Motor 
gerade aus ist.

Im Programm sehe ich kein Problem,
nur ein par Hinweise:
Nach return ist kein else notwendig.
Eine while-Schleife ohne definierte Laufzeit (delay) kann sehr schnell 
laufen (daher auch ein 32 bit Zähler) aber zeitlich sehr instabil.
Es wäre besser, den Moment, in dem man die Ausgabe macht, an den 100us 
Timertick zu hängen, beispielsweise 4 Ausgaben pro Sekunde damit zu 
synchronisieren.
Bei geringer Drehzahl sollte vielleicht nicht die Anzeige stehen 
bleiben, sondern die Berechnung bis runter auf 0 funktionieren.

von Lüfter (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe das PWM-Signal und das Tachosignal gerade mal mit dem Oszi 
angeschaut. Das PWM-Signal sieht sauber aus.

Wird das PWM-Signal zur Drehzahlsteuerung verwendet, wird das 
Tachosignal unsauber. Neben den eigentlichen Impulsen sind willkürlich 
Peaks auf dem Signal.

Auf dem Bild im Anhang ist beides zu erkennen. Der obere Graph zeigt das 
PWM-Signal vom Controller. Unten wird das Tachosignal dargestellt. Am 
linken Rand des Bildschirms ist gerade noch die fallende Flanke des 
Signals zu erkennen, gefolgt von einem Peak.

Hat jemand damit Erfahrung?

von Udo S. (urschmitt)


Lesenswert?

Lüfter schrieb:
> Ich habe das PWM-Signal und das Tachosignal gerade mal mit dem Oszi
> angeschaut.

Steht die Triggerung auch auf "chopped mode", so daß ein eindeutiger 
zeitlicher Zusammenhang zwischen den Kanälen besteht?
Oder steht sie auf "alternate"?

Ist das ein 3 oder 4 poliger Lüfter? (Richtiger Einwand von MaWin, ich 
war aber von einem 3 pol. ausgegangen.

Wenn ich mir das Bild so anschaue denke ich, Triggerung steht auf 
alternate und es ist genau das von mir beschriebene Verhalten beim 3 
pol. Lüfter.
Wir sehen mehrere verschiedene überlagerte Verläufe, deshalb de 
unterschiedlichen Helligkeiten

von Lüfter (Gast)


Lesenswert?

Das Oszi war im "chopped mode". Die Signale hängen zeitlich also 
zusammen.
Der Lüfter hat einen 4 poligen Stecker (Masse, +12V, Tacho, PWM). Die 
Leistungselektronik ist also im Lüfter integriert.

Um ein passendes Bild aufnehmen zu können habe ich mit meinem Handy ein 
kleines Filmchen erstellt und am Rechner dann ein passendes Standbild 
herauskopiert. Vielleicht stammen davon die unterschiedlichen 
Helligkeiten.

von Lüfter (Gast)


Lesenswert?

Aus eine Spec habe ich, dass die PWM-Frequenz 25kHz (21 ... 28 kHz) 
betragen sollte. Kann mir jemand bestätigen, dass das richtig ist?

von L. P. (lpg)


Lesenswert?

Jep. Stimmt soweit. Die Intel Spez. schreibt 22 bis 28 kHz vor.

Lg

von Amateur (Gast)


Lesenswert?

Hast Du mal eine andere Messmethode versucht?
Du gibst das Tachosignal auf einen Zählereingang - keine Unterbrechungen 
- und "schaust" timergesteutert, regenmäßig nach, wie viel Ticks 
aufgelaufen sind.

Zugegeben, es ist meine persönliche Meinung, aber ich halte nicht viel 
von unnötigen Unterbrechungen.

von Lüfter (Gast)


Lesenswert?

Die Messung der Flanken innerhalb eines bestimmten Zeitfensters habe ich 
auch schon mal versucht. Allerdings nicht mit einem Zählereingang 
sondern auch mit einem externen Interrupt. In der ISR wurde dann eine 
Variable inkrementiert. Funktionierte, allerdings betrug die Dauer einer 
Messung deutlich länger (z.B. 1 Sekunde).
Das Problem mit den Peaks würde aber auch bei so einer Messung 
auftreten.

Um Fehlerquellen auszuschließen werde ich mit einem anderen Controller 
mal ein PWM-Signal mit genau 25kHz erzeugen. Der Controller macht sonst 
nichts anderes.

Dann schaue ich mir das Tachosignal nochmal mit dem Oszi an.

Sollte das Signal dann nicht besser sein, können die Peaks eigentlich 
nur von der Lüfterelektronik stammen...!?

von Christian B. (chbalnuweit)


Lesenswert?

Ich habe sowas auch mal gemacht.
Ich hab den Lüfter nicht direkt über PWM angesteuert, sondern das 
PWM-Signal mit einem RC-Glied geglättet und den Lüfter dann "analog" 
angesteuert.
Das Tachosignal habe ich mit einem 1K Pullup gegen 5V geschaltet und 
einem kleinen Kondensator gegen GND. Danach war das Signal sauber.

Für die Drehzahlmessung würde ich nicht die Flanken pro Zeit zählen, 
sondern die Zeit zwischen den Flanken messen. Damit bekommst du die 
aktuelle Drehzahl schneller und genauer.

Viele Grüße

Christian

von Lüfter (Gast)


Lesenswert?

Hallo Christian,

bist du mit der analogen Spannung an den pwm-eingang des Lüfters oder 
hast du ihn über die Versorgungsspannung gesteuert?

von Christian B. (chbalnuweit)


Lesenswert?

Lüfter schrieb:
> Hallo Christian,
>
> bist du mit der analogen Spannung an den pwm-eingang des Lüfters oder
> hast du ihn über die Versorgungsspannung gesteuert?

Achso, ich hätte erwähnen sollen, dass es ein 3-poliger Lüfter war. Der 
hat also keinen PWM-Eingang.
Demzufolge: Ja, über die Versorgungsspannung.

Gruß

Christian

von MaWin (Gast)


Lesenswert?

> ich hätte erwähnen sollen, dass es ein 3-poliger Lüfter war

Ich liebe die Beiträge die NICHTS mit dem Thread zu tun haben.

von Christian B. (chbalnuweit)


Lesenswert?

MaWin schrieb:
>> ich hätte erwähnen sollen, dass es ein 3-poliger Lüfter war
>
> Ich liebe die Beiträge die NICHTS mit dem Thread zu tun haben.

Also so wie dein Beitrag, richtig?

von Lüfter (Gast)


Lesenswert?

Um mal wieder zum Thema zu kommen:

Gestern habe ich den Lüfter anstelle des PWM-Signals mit einer Variablen 
Spannung vom Labornetzteil manuell gesteuert. Bis runter auf 2,5V 
liefert der Tachoausgang ein wunderschönes Recktecksignal.

Also prinzipiell funktioniert der Tachoausgang auch bei Drehzahlen != 
Maximaldrehzahl.

Wie würdet ihr weiter vorgehen? Welche Ursachen sind möglich?

Die Tacholeitung des Lüfters ziehe ich mit dem µC-internen Pull-Ups hoch 
auf 5V. Laut Datenblatt liegen die im Bereich zwischen 20 und 50 kOhm. 
Ist das zu hoch? Sind dadurch kapazitive Einkopplungen von der 
PWM-Leitung stärker? Die PWM-Leitung und das Tachosignal liegen auf rund 
20 cm Flachbandkabel direkt nebeneinander...

von Christian B. (chbalnuweit)


Lesenswert?

Hast du mal versucht, das Tachosignal mit einem Kondensator gegen GND zu 
entstören?
20-50kOhm kommt mir jetzt auch recht hoch vor...

Versuch es doch mal mit einem kürzeren Kabel, dann wirst du sehen ob es 
einen Einfluss hat oder nicht. Vorstellen könnt ich es mir.

von Konrad S. (maybee)


Lesenswert?

MaWin schrieb:
> Bei Lüftern mit 4 Anschlüssen funktioniert der Tachoausgang auch wenn
> der PWM EINgang gerade 0 ist.

Sollte man meinen!

Ich habe hier "Arctic F12 PWM"-Lüfter, die sich wie erwartet verhalten.

Und dann habe ich noch "Arctic F14 PWM"-Lüfter, bei denen sich das 
Tacho-Signal wie bei einem 3-Pin-Lüfter verhält. Bei kleiner Drehzahl 
bricht zudem der Pegel des Tachosignals ein und man bräuchte schon einen 
ziemlich hochohmigen Pullup, um das noch auswerten zu können. Was sich 
der Entwickler dabei wohl gedacht hat?

von Christian (Gast)


Lesenswert?

Konrad S. schrieb:
> Bei kleiner Drehzahl
> bricht zudem der Pegel des Tachosignals ein

Verstehe ich nicht. Wieso sollte das Signal einbrechen? Es kommt einfach 
seltener eine Flanke.
Oder hast du das Drehzahlsignal mit einem Pullup gegen an das PWM-Signal 
geschaltet?

von Lüfter (Gast)


Lesenswert?

Christian schrieb:
> Verstehe ich nicht. Wieso sollte das Signal einbrechen? Es kommt einfach
> seltener eine Flanke.
> Oder hast du das Drehzahlsignal mit einem Pullup gegen an das PWM-Signal
> geschaltet?

Als ich meinen Lüfter mit dem Labornetzteil betrieben habe, konnte ich 
sehen, dass das Tachosignal erst ab eine VCC-Spannung von ca. 2,5V 
ausgegeben wird.

Die Tacholeitung wurde von einem anderen Netzteil über einen Pull Up auf 
+5V gezogen.

Konrads aussage kann ich also nachvollziehen.

von Konrad S. (maybee)


Lesenswert?

Christian schrieb:
> Verstehe ich nicht. Wieso sollte das Signal einbrechen?

Hab ich wohl nicht klar genug ausgedrückt, sorry.
Der Lüfter ist bei kleinen Drehzahlen nicht mehr in der Lage, das 
Tachosignal auf GND zu ziehen, selbst bei einem Pullup mit 220k gegen 
+5V. Bei höheren Drehzahlen klappt es auch mit 10k als Pullup. Da der 
Effekt bei zwei "F14 PWM"-Lüftern gleichermaßen Auftritt, schließe ich 
auf ein konstruktives Problem. Der "F14 PWM" hat hat offenbar eine 
komplett andere Elektronik als der "F12 PWM", bei dem das Tachosignal 
jederzeit sauber arbeitet.

Lüfter schrieb:
> dass das Tachosignal erst ab eine VCC-Spannung von ca. 2,5V
> ausgegeben wird.

Das ist nochmal ein anderer Sachverhalt. Ich habe bei meinen Tests mit 
12V Versorgungsspannung gearbeitet.

von Lüfter (Gast)


Lesenswert?

Du sagtest doch aber "bei geringen Drehzahlen", also leite ich davon ab, 
dass du deinen 3 poligen Lüfter über PWM gesteuert hast...
In dem Fall wäre der Effektivwert von VCC nicht mehr 12V.

von Lüfter (Gast)


Lesenswert?

Folgendes habe ich getestet:
- PWM-Signal über Tiefpass geführt, um die Flankensteilheit etwas zu 
verringern
- Tacho-Signal über Tiefpass geführt um Peaks zu dämpfen
- Austausch des verwendeten Steckernetzteils

Die Tiefpasse habe ich mit einem Trimmer aufgebaut, damit ich die 
Grenzfrequenz variabel einstellen konnte.

Der Graph vom Tachosignal zeigt aber immernoch die Peaks. So langsam bin 
ich wirklich ratlos...

von Udo S. (urschmitt)


Lesenswert?

Lüfter schrieb:
> Du sagtest doch aber "bei geringen Drehzahlen", also leite ich davon ab,
> dass du deinen 3 poligen Lüfter über PWM gesteuert hast...

Auf was bezieht sich diese Aussage? Auf Konrads Beitrag? Der hat aber 
4pol. Lüfter verwendet!

von Lüfter (Gast)


Lesenswert?

Ach entschuldige, hab ihn mit Christian verwechselt.

von Konrad S. (maybee)


Lesenswert?

Nein, der "Arctic F14 PWM" ist ein 4-Pin-PWM-Lüfter. Der wird mit 12V 
versorgt und über seinen PWM-Eingang angesteuert. Das Verhalten des 
Tachosignals passt aber eher zu einem 3-Pin-Lüfter. Ich fürchte, der 
Entwickler hat einfach eingangsseitig einen MOSFET vor die Elektronik 
des "Arctic F14" (ohne "PWM") geklatscht und dann bricht bei kleinen 
Drehzahlen eben die Versorgungsspannung der Elektronik ein. 
Infolgedessen tut das Tachosignal nicht mehr richtig.

von Lüfter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe Updates:

Das Tachosignal habe ich mittlerweile sauber bekommen (Bild: 
Tachosignal.jpg, 2V/div ). Die Peaks habe ich mir anscheinend selbst 
über die Software-PWM erzeugt. Deswegen verwende ich jetzt die 
Hardware-PWM.

Mit diesem Signal gehe ich auf INT1. Darin lasse ich zum Test lediglich 
einen Ausgang toggeln, welche ich auf Channel 2 am Oszi betrachte. 
Bislang habe ich noch kein vernünftiges Bild hin bekommen.

Allerdings wird der INT1 nicht wie in der Initialisierung definiert bei 
den steigenden Flanken ausgelöst, sondern willkürlich. Dementsprechend 
willkürlich ist das Ergebnis meiner Drehzahlmessung.

Kennt jemand das Phänomen, dass der Interrupt nicht passend zum Signal 
an INT1 ausgelöst wird?

Danke

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.