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
volatileuint16_ttimer2_100miksec=0;
8
volatileuint16_ttimer2_speicher=0;
9
volatileuint16_tn=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
voidint0_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
voidtimer2_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
voidinit_lcd(void)
44
{
45
lcd_init(LCD_DISP_ON);
46
lcd_clrscr();
47
}
48
uint16_tdrehzahl_berechnen(uint16_ttimerwert)
49
{
50
// Plausibilitätsprüfung für Drehzahlbereich 600...2000 1/min (mit Reserven)
uint32_tzaehler=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
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.
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.
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?
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
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.
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.
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...!?
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
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
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?
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...
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.
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?
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?
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.
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.
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.
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...
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!
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.
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