PC-Lüfter Umdrehungen ohne Interrupt ermitteln

Hallo!
Mal wieder bin ich in einer äußerst misslichen Lage und ich habe leider keine Ahnung, was ich noch versuchen/probieren könnte.
Ich möchte gerne, mit meinem Arduino Nano V3.0 die Drehzahl von 3 Lüftern lesen. Da der Nano nur 2 Interrupt Pins hat, bin ich leider gezwungen auf Interrupts zu verzichten.
Aber es funktioniert nicht mal mit Interrupts. bzw habe ich es nicht geschafft und es kamen un-plausible Werte raus. Dabei habe ich mit einberechnet, dass der Lüfter mehrere Signale pro Umdrehung sendet! Un-plausible Werte meine ich mit entweder 500 Umdrehungen über der Nenngeschwindigkeit oder drunter, obwohl ich bereits an den Grenzen der Belastbarkeit bin.

Ich habe mir das Signal auch mal auf einem Oszilloskop angesehen. Komischerweise wurde, wenn ich Signal und + Pol des Lüfters verbunden habe, das Signal sehr viel schöner gemessen. Hier wären wir auch bereits bei Frage 1. Wieso? Wenn ich Signal und - Pol verbunden habe, kam ein komplett verzerrtes Signal an. ? Auch ist mir aufgefallen, dass ein Impuls ca 2.5ms lange ist und die Eingangsspannung aufweißt (12V im Optimalfall). Die Drehzahl des Motors steuere ich über einen Mosfet und einem PWM - Signal des Arduinos(Funktioniert). Die Spannung des Signals reduziere ich durch 2 x 1MOhm Wiederstände.

Wie bekomme ich nun das Signal des Lüfters so "umgewandelt" / "angeschlossen", dass ich es mit dem Arduino auswerten kann ? Theoretisch müsste es ja möglich sein, die Flanken zu "ertasten"? Schnell genug sollter der Arduino doch sein ?

Vielen Dank bereits im voraus :slight_smile:

Ich hoffe, die Schaltung ist nur falsch gezeichnet, denn so würde der PWM-Ausgang mit Masse kurzgeschlossen.

Da der Nano nur 2 Interrupt Pins hat, bin ich leider gezwungen auf Interrupts zu verzichten.

Du könntest die 2 externen Interrupts nehmen und zusätzlich den Pin Change Interrupt oder gleich den Pin Change Interrupt für 3 Pins auf dem gleichen Port schalten und dann im Handler durch Auslesen des Ports eruieren, welcher eine Flanke hatte. Das ist also durchaus mit Interrupts machbar.

Theoretisch müsste es ja möglich sein, die Flanken zu "ertasten"? Schnell genug sollter der Arduino doch sein ?

Mit "ertasten" meinst Du ein Auswerten der Analogdaten? Könnte eng werden, hängt aber von der Lüftergeschwindigkeit ab.

Die Spannung des Signals reduziere ich durch 2 x 1MOhm Wiederstände.

Die Widerstände sind viel zu gross, die kleinste Kapazität an den Eingängen würde jede Flanke ruinieren. Versuch's mal mit 4.7k?, das braucht sehr wenig Strom, gibt aber akzeptable Geschwindigkeiten.

Der Tachoanschluss ist ein Open Collector, daher musst du ihn mit einem Widerstand gegen den Pluspol schalten. Zweimal pro Umdrehung wird das Signak auf Masse gezogen - wenn Masse anliegt! Das ist bei dir aber nicht immer der Fall, weil du über Masse die Geschwindigkeit regeln willst.
Das nehme ich zuumindest an, die Schaltung ist aber Murks. Da sind bspw. gGND mit dem Digitalpin direkt verbunden.

Hallo,

ich glaube Du solltest nochmal zu den Basics zurück und Dich mit der Flankenerkennung beschäftigen.
z.Bsp. http://arduino.cc/en/Tutorial/ButtonStateChange
Da lernt man die steigende und die fallende Flanke und den High und Low Pegel zu erkennen.

Dein Mosfet macht laut Schaltplan nichts. Beschalten mit 2x Masse und einmal Plus.
Deinen Spannungsteiler solltest Du auch nochmal überdenken. Die Hälfte von 12V sind 6V. Maximal sollten jedoch nur 5V am Eingang anliegen.

Wenn Dein Lüfter auch mit konstanten 5V läuft (kein PWM), dann wäre es vielleicht erstmal besser ihn mit externen 5V drehen zu lassen und das Tachosignal am Arduino versuchen zu erfassen. Wenn das läuft, kannste Dich steigern.

Pin Change Interrupt für 3 Pins auf dem gleichen Port schalten und dann im Handler durch Auslesen des Ports eruieren, welcher eine Flanke hatte. Das ist also durchaus mit Interrupts machbar.

Welchen Port auslesen im Handler?

Zu meinem Spannungsteiler:
Der Arduino hat doch auch noch einen inneren Wiederstand? Ist dieser vernachlässigbar?

Ja stimmt. In meinem Bild ist der Mosfet falsch angeschlossen. In realität funktioniert er ^^

Der Tachoanschluss ist ein Open Collector, daher musst du ihn mit einem Widerstand gegen den Pluspol schalten. Zweimal pro Umdrehung wird das Signak auf Masse gezogen - wenn Masse anliegt! Das ist bei dir aber nicht immer der Fall, weil du über Masse die Geschwindigkeit regelst.

Das Signal ist aber auf dem Oszilloskop um einiges verzerrter und ungleichmäßiger. Brauche ich einen Schmitttrigger?

Gibts eine Möglichkeit, die Geschwindigkeit nicht über ein PWM Signal zu steuern?

Wenn er wirklich einen P-Kanal hat, dann sollte es auch mit PWM gehen. Damit kann man dann die Versorgungsspannung schalten, statt die Masse wie bei einem N-Kanal. Und nimmt dem Open Collector/Drain Transistor nicht die Masse weg.

Ich würde es aber auch erst mal ohne PWM versuchen. Danach musst du erst mal den Transistor korrekt anschließen.

Dass die 2 MOhm viel zu hoch sind hat vor allem mit dem Sample and Hold Kondensator des ADCs zu tun. Der muss geladen werden und bei schnellen Signalen und einer hohen Impedanz der Schaltung ist der Strom nicht hoch genug im den Kondensator in der Zeit umzuladen.

EDIT:
Einen P-Kanal FET kann man aber nicht mit 12V versorgen und mit 5V ansteuern. Da braucht man noch einen NPN als Treiber.

Und wie gesagt braucht man für das Tachosignal eigentlich einfach einen Widerstand gegen Plus. Keinen Spannungsteiler. Da kommt von selbst keine Spannung raus. Das kann man dann auch an 5V anschließen und digital auswerten.

Welchen Port auslesen im Handler?

Die ATmega IO-Ports (http://www.arduino.cc/en/Reference/PortManipulation), ist fast das selbe with digitalRead() aber viel schneller und alle Eingänge auf einmal. Ein paar boolsche Operatoren und Du hast sofort den richtigen Index, um den Counter zu erhöhen bzw. die Zeit zu stoppen.

Serenifly:
Und wie gesagt braucht man für das Tachosignal eigentlich einfach einen Widerstand gegen Plus. Keinen Spannungsteiler. Da kommt von selbst keine Spannung raus. Das kann man dann auch an 5V anschließen und digital auswerten.

Kann man doch auch einfachst mit Pullup definieren
pinMode(tachopin, INPUT_PULLUP);
Das wechselt dann 4 mal / Umdrehung zwischen HIGH und LOW
Bei 3000 RPM also ein Wechsel alle 5 ms.

@Serenifly: Du schlägst also vor, das ich mit einem N-Kanal Mosfet einen P-Kanal Mosfet zu schalten, welcher wiederum den Lüfter steuert? Auf was ist bei der Auswahl des P-Kanal Mosfets zu achten?

Zwecks des Wiederstandes:

Die Widerstände sind viel zu gross, die kleinste Kapazität an den Eingängen würde jede Flanke ruinieren. Versuch's mal mit 4.7k?, das braucht sehr wenig Strom, gibt aber akzeptable Geschwindigkeiten.

Soll ich die 1M? Wiederstände einfach gegen 4.7k? Wiederstände tauschen und nicht zum + sondern zum - Pol ?

PS: wäre es nicht viel einfacher, einen fertigen Controller Wie den MAX31785(Mixed-signal and digital signal processing ICs | Analog Devices) oder den MAX6551 (http://datasheets.maximintegrated.com/en/ds/MAX6650-MAX6651.pdf) zu verwenden?

Tartaros:
@Serenifly: Du schlägst also vor, das ich mit einem N-Kanal Mosfet einen P-Kanal Mosfet zu schalten, welcher wiederum den Lüfter steuert? Auf was ist bei der Auswahl des P-Kanal Mosfets zu achten?

Es braucht nicht unbedingt einen N-Kanal FET. Dafür reicht ein bipolarer NPN wie der BC337 oder was anderes aus der BC Serie. So (mit 1k für den Basiswiderstand und 10k für den Kollektorwiderstand/Pullup):

Wie du da siehst bleibt die Last da immer an Masse und es wird statt dessen die Betriebsspannung abgeschaltet. Und beachte die Position von Drain und Source.

Der P-Kanal Typ ist eigentlich egal, da hier nicht so viel Strom fließt und es kein Logic Level sein muss.

Soll ich die 1M? Wiederstände einfach gegen 4.7k? Wiederstände tauschen und nicht zum + sondern zum - Pol ?

Wie gesagt, ist der Spannungsteiler sowie falsch. Das Ding sollte einen Open Kollektor Ausgang haben:

Wenn du da mit dem Oszi misst sollte keine Spannung anliegen. Also entweder einen 10k als Pullup gegen 5V hängen, oder die internen Pullups verwenden.