Musst du nicht anstelle von
Icp_neu = Capture1
dies schreiben:
Icp_neu = Timer1
Der Timer enthält doch den Wert, den du lesen willst.
Gruß
Rolf
Hallo, ich möchte die Drehzahl eines 12V Lüfters anzeigen und stecke da mit der auswertung fest. Der Lüfter ist wie gesagt an 12V angeschloßen, wobei das Tachosignal mit einem 10K Pullup an den ICP-Pin des Mega16 geht.
Mein Code ist folgender ...
Ich beckomme bei langsam laufendem Lüfter eine Drehzahl von ca. 13000 angezeigt, die ab und an auf ca. 800 springt. Könnte mir bitte jemand helfen ?
Code:Config Timer1 = Timer , Capture Edge = Falling , Noise Cancel = 1 , Prescale = 256 On Capture1 Timer_icp Enable Timer1 Enable Capture1 Enable Interrupts . . . . . . . Timer_icp: Dim Icp_neu As Word , Periode As Word Icp_neu = Capture1 If Icp_neu > Icp_alt Then Periode = Icp_neu - Icp_alt Else Periode = Icp_alt - Icp_neu Periode = 65536 - Periode End If Icp_alt = Icp_neu 'Debug_lcd = Periode Fan = 1875000 / Periode Fan_active = 1 Return
Musst du nicht anstelle von
Icp_neu = Capture1
dies schreiben:
Icp_neu = Timer1
Der Timer enthält doch den Wert, den du lesen willst.
Gruß
Rolf
Das ändert auch nix......
Hast du tatsächlich einen Lüfter mit Drehzahlsensor? Ich hab kürzlich gewaltig danebengetreten als ich angenommen hatte, dass meine Lüfter mit dritter Strippe einen Drehzahlsensor haben.
Es war nämlich nur ein "Lüfter läuft"/"Lüfter steht"-Signal, dass sich dann in einem dauerhaften High bzw. Low-Pegel ab einer gewissen Mindestdrehzahl niedergeschlagen hat.
mfG
Markus
Edit: Wenn du den Lüfter über PWM regelst und dabei die Masse ein-/ausschaltest, kannst du das Drehzahlsignal ebenfalls in die Tonne treten, nur wenn du einen High-Side Transistor/FET verwendest funktioniert die Drehzahlmessung noch.
erm du meinst nen pulldown oder ? wenn da 12V in den controller reinpulsen nimmt der dir das bestimmt irgendwann sehr übel! ich würd das signal erstmal nachmessen (mit oszi wenn geht)Der Lüfter ist wie gesagt an 12V angeschloßen, wobei das Tachosignal mit einem 10K Pullup an den ICP-Pin des Mega16 geht.
nein, wenn der ICP ne flanke detektiert, schreibt er sofort den aktuellen timerwert in das capture register, also vollkommen richtigMusst du nicht anstelle von
Icp_neu = Capture1
dies schreiben:
Icp_neu = Timer1
wie gesagt ich würde restmal das signal überprüfen, ihc kenn das von billig-einschub-tachometern für lüfter, dass die werte manchmal heftig schwanken, liegt aber meist daran dass die das signal ungepuffert auswerten, ich würd n schmitttrigger vorschalten, so bekommste das signal schonmal auf definitiv 5V runter(n spannungsteiler birgt das risiko einer spannungsspitze) und es wird ein sauberes rechtecksignal draus!
EDIT: ich muss glatt aml nachschauen, aber theoretisch müsste man über einen OPV auch ne gewisse potentialtrennung erreichen
Also der Lüfter wird wie folgt angesteuert:
Der AVR steuert über I2C einen DAC an, der entsprechend 0-5V an einen OPV weiter gibt. Der OPV steuert einen BD135 an, der an 12V angeschloßen ist, und den Lüfter treibt. Das Tachosignal ist ein Opencollector und an den ICP-Pin des AVR angeschloßen.Der pullup geht vom Tacjosignal an +5V.
Ab ca. 950u/min bis 1600u/min wird es richtig angezeigt. Dafor und dahinter spinnt er wieder .........
Die Division
Fan = 1875000 / Periode
hat in der ISR nichts verloren, dauert zu lange.
Deshalb im Hauptprogramm:
do
if fan_aktive=1 then
reset fan_aktive
disable interrupts
Fan = 1875000 / Periode 'Atomarer Zugriff auf Periode
enable interrupts
endif
print fan
loop
Übrigens, wenn Du den Overflow-Interrupt nicht benötigts lösche bitte die Zeile
enable Timer1
ich geb´s auf. Ist es möglich einfach nur zu erkennen, ob der lüfter läuft oder nicht ? Ohne Timer, einfach nur durch den Portpin ?
Man gibt nicht auf!!! [-( [-(
Hast du ein Datenblatt vom Lüfteroder Typenbezeichnung vom Lüfter? Dort sollte es drinnenstehen, ob du ein Frequenzsignal oder eine Stillstandsanzeige hast.
Das ist ein ausgedienter CPU-Lüfter.
Lesezeichen