Drehzahlmesser mit Arduino

Bernd Langner

Moderator
Teammitglied
Hallo
Hat jemand schon mal ein Sketch geschrieben zur Drehzahlmessung
von Luftschrauben.
Mir würde die einfache Variante mit LDR reichen wobei sollte umschaltbar sein
zwischen 2/3 Blatt.

Mir fehlt dazu irgendwie der Ansatz wo ich da anfangen soll.
Wäre dann auch mein erstes eigenständige Projekt.

Ja es gibt fertige Kauflösungen aber da sind mir immer die Displays zu klein.

Gruß Bernd
 

BOcnc

User
Ich habe das mal vor ganz langer Zeit gemacht. Problem war der Sensor um saubere Pulse zu bekommen. War für den Heli.
Das Programm finde ich so schnell nicht. Arduino gab es noch nicht.
Das Programm ist dann ein Frequenzzähler.
 

Anhänge

  • drehzahl.pdf
    23 KB · Aufrufe: 615

kalle123

User
Hallo Bernd.

So was in der Art hatte ich hier schon mal mit den Sketch eingestellt.

https://www.rc-network.de/threads/bl-motor-drehzahlmessung-mit-arduino.690848/#post-690848

War ein Frequenzmesser (bis 5 MHz), den ich mir zur Drehzahlmessung erweitert habe.

Umstellung Frequenz <> Drehzahl mittels Jumper. Polzahl (hab den für BL Motore vorgesehen) über Taster 2 . 4 . 6 ...

Kannst da natürlich auch statt Polzahl die Blattzahl vorgeben. Dann halt 2 oder 3 oder 4 ...

Frage ist der Sensor. Optisch oder per Hallsensor?

Optisch hab ich eigentlich im Versuch nur mit einer Laserlichtschranke bzw. mit Fototransitor gearbeitet. Bei Hallsensor halt mit Magnet und Hallgeber. Aber immer nur mit BL Motoren.

Hier sind ein paar Bilder drin, wie João das bei nen Verbrenner mit Hallsensor gemacht hat.

Einfach dort mal durch scrollen.

https://openrcforums.com/forum/viewtopic.php?f=86&t=12169

Etwas weiter dort hab ich meinen Oszi und den Frequenz/RPM Anzeiger dann dran, nur in Modus Frequenz.

Gruß KH
 

wkrug

User
Ich hatte schon mal vor längerem einen C-Code für einen Drehzahlmesser geschrieben.
Allerdings nicht für einen Arduino.
Grundsätzlich gibt es da 2 Möglichkeiten der Messung.
1. Impulse innerhalb einer festgelegten Zeit zählen. = Einfach, aber eher für höhere Drehzahlen bzw. Blattzahlen geeignet.
2. Impulse generieren ( Timer laufen lassen ) und die Impulse von der Drehzahlmessung als Torzeit nehmen.
Somit misst damit die Zeitdauer zwischen 2 Impulsen - Daraus kann dann die Drehzahl berechnet werden. =
Schnelle relativ genaue Ergebnisse bei niedrigen Drehzahlen - Etwas schwieriger zu proggen, weil hier irgendwann der Timer überläuft und das muss das Programm abfangen. Ab einer bestimmten Schwelle wird die Messung bei höheren Drehzahlen ungenau.

Beispiel bei 1000 U/min und Einblatt Luftschraube bekommt man zwischen 16 und 17 Pulse pro Sekunde ( Bei einer Sekunde Messzyklus ).
Bei Methode 1 schwankt der Drehzahlmesser dann zwischen 960 und 1020 hin und her.

IMHO ist es am Besten ab einer bestimmten Drehzahlschwelle von einem auf das andere Verfahren umzuschalten.
 

Bernd Langner

Moderator
Teammitglied
Hallo

Ja der Sensor ist das problem meine beiden alten DZM messen mit LDR
ganz so genau brauche ich es nicht. Aber du mußt schon genügend Helligkeit haben sonst
zählt er nur Müll.

Eventuel geht ja auch eien Reflexinfrarot Lichtschranke CNY 70

Habe jetzt noch ein altes Projekt gefunden das war ein Servotester mit Impulsmessung
den habe ich mal gebaut mit Atmega 16
der hat sogar Drehzahlmessung mit drinne habe ich aber nie getestet.

Hallo Willi für die Atmega habe ich auch ein Programmer das wäre nicht das Problem.
Habe ja damals auch das Prog in den Atmega 8 bekommen für den Feuerwerksschalter.
Begrüße dich damit auch hier in diesem Forum . Ja das sind schon Jahrzehnte her mit dem Feuerwerksschalter.

Gruß Bernd
 

BOcnc

User
Hier mal ein Beispiel wie man es machen kann wenn man einen Puls hat.

#include <Arduino.h>

byte DZM_InputPin = 2;
volatile unsigned long RPM_T2, RPM_Count;
unsigned long RPM , RPM_T1;

void setup() {
pinMode(DZM_InputPin, INPUT_PULLUP);
RPM_T1 = 0;
RPM_T2 = 0;
RPM_Count = 0;

attachInterrupt(0, RPM_Meter, FALLING); // Interrupt0 wird bei fallender Flanke auf Pin2
}

void loop() {
if (RPM_T2 > RPM_T1) {
RPM = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 - RPM_T1));
RPM_T1 = RPM_T2;
RPM_Count = 0;
}
else {
RPM = 0;
}
sprintf(RPMStr, "%4u", RPM);
}

void RPM_Meter ()
{
RPM_Count++;
RPM_T2 = millis();
}
 

BOcnc

User
Ich habe mich mal damit beschäftigt weil mich das interessiert hat wie man das mit Reflexionen und IR Diode machen kann.
Ein ESP8266 mit OLE-Display lag noch in der Bastelkiste.
Datenblätter von fertigen Modulen habe ich nur gefunden die zu langsam sind oder die Reichweite nicht ausreicht. Ein paar Zentimeter Abstand sollte man schon haben. In meinem Nachtflugheli habe ich einen 38KHz IR Empfänger um die Bilder zu synchronisieren.
Damit habe ich mal experimentiert. Das hat aber nicht wirklich gut funktioniert.
Die Helligkeit habe ich so weit reduziert das ich auf einen Abstand bis 5 cm gekommen bin. LED in einer Hülse mit 0,8 mm Loch eingebaut.
Funktioniert nicht besonders gut.
Als nächstes habe ich dann nur einen Zeit Bereich gemessen in dem die Pulse zum erwarteten Bereich 100 bis 30 000 U/min gekommen sind. Alle wo ein Puls gekommen ist der außerhalb vom Bereich war wurden verworfen.
Da konnte man zumindest abschätzen wie die Drehzahl sein könnte. Immer wieder Werte die dann bis ca. 150 zu hoch sind.

Da das bei allen Lichtverhältnissen funktionieren sollte will ich noch weiter machen.
Ich sehe noch zwei Möglichkeiten.
Werte die zu weit von den vorherigen abweichen nicht verwenden
oder eine Fourier Transformation. Mit der 80MHz CPU sollte das gehen.
 

Bernd Langner

Moderator
Teammitglied
Hallo Werner

Ich werde mir mal so eine Lichtschranke besorgen ob es damit geht
Deine IR Dioden aus dem Fernbedienungsbereich habe ich auch noch.

Wenn ich mal wieder Zeit habe gehe ich wieder ans probieren. Habe jetzt aber Überraschenderweise
Balsaholz bei Thoma bekommen und muß jetzt Flächensätze fräsen.

Gruß Bernd
 

BOcnc

User
Versuch macht klug. Aber laut Datenblatt 5mm Abstand.
millis() in meinem Programm ist auch viel zu ungenau. Da braucht es einen Timer.
 

Bernd Langner

Moderator
Teammitglied
Hallo Werner

Hatte ich hier gesehen aber mit 5mm Abstand vom Prop nicht realisierbar.

Gruß Bernd
 

BOcnc

User
Ich habe heute noch mal weiter probiert. Erstmal das Loch der LED auf 2,4 mm aufgebohrt. Sonst ist das bei höheren Drehzahlen zu wenig Licht.
millis() durch micros() ersetzt. 1000 mal genauer.
Bis ca. 4000 U/min kann man dann die Drehzahl gut schätzen. Höhere wird nicht mehr angezeigt. Das muss ich noch erforschen.
Ob das 4000 sind weis ich auch nicht. Muss ich auch noch mal prüfen.
 

wkrug

User
Optische Drehzahlsensoren haben immer ein Problem.

Im Haus hat man das Geflacker der 50Hz Wechselstromes ( neuerdings auch von der PWM Ansteuerung der LED Lampen ), da werden dann schon Drehzahlwerte ohne Prop angezeigt.
Ausserhalb ist die Sonne oft so stark, das der Sensor geblendet wird.

Im Haus nehm Ich einfach eine alte Glühfaden Taschenlampe, die durch die Luftschraubenblätter auf die Fotodiode leuchtet ( Garantiert kein Flackern ).
Alle anderen Lichtquellen sind aus.

Ausserhalb gings nur mit einer Auskopplung des Fotodioden Signals via Kondensator, massiver Verstärkung, nachgeschaltetem Trigger und auch das nicht 100% zuverlässig.

Eventuell bringt ja auch eine Linse vor der Fotodiode eine Verbesserung ?!
 
Zuletzt bearbeitet:

BOcnc

User
Mein selbstgebauter optischer Drehzahlmesser funktioniert draußen problemlos so lange Wolken da sind. Bei blauem Himmel versagt der. Ich stelle den nach oben um die Drehzahl vom Rotor zu messen. Eine kleine Wolke oberhalb reicht dann schon. Die 38KHz IR Empfänger sind nicht schnell genug. Ich habe zwei verschiedene probiert. Geht nur im unteren Drehzahlbereich. Ich werde da noch weiter experimentieren. Aber erst muss ich mich um meinen Nachtflugheli kümmern. SAT1 Fernsehen will kommen.
 
Hi,

ich hatte Langeweile und brauche für einen neuen Hubschrauber einen Drehzahlmesser über die Messung einer Motorphase. Also schnell mal eine Drehzahlmessung für Arduino mit M328 zusammengefrickelt.
Die Motorphase wird über einen 10k-Widerstand an D7 angeschlossen. Der Eingang muss mit einer 3,3V oder 5,1V Zenner-Diode gegen GND geschützt werden.
Die Messung erfolgt im ICP-Interrupt über den AC gegen interne Ref-U. Die Messverfahren "Impulse je Zeitfenster" und "Impulslänge" sind vermischt. Es werden innerhalb 250ms Impulse gezählt und die Zeit über der gezählten Impulse gemessen. Dadurch ist eine recht genau Messung von ca. 270-270000 U/min möglich. Zusätzlich ist ein ca. 5kHz Filter zur Unterdrückung der Motor-PWM programmiert.
Bei mir wird das Ganze noch um Frsky-Telemtrie per Soft-UART erweitert und die Berechnung der Rotorkopfdrehzahl fest gecodet...

Viele Grüße Sven

// Drehzahlmesser
// Impuls an D7 = AN1

volatile unsigned int Impulse = 0;
volatile unsigned long Zeit;
unsigned long Naechste;
unsigned long ZeitTemp;
int ImpulseTemp;

void setup() {
Serial.begin(115200);
TCCR1A=0;
TCCR1B=3|(1<<ICES1)|(1<<ICNC1); // CK/64+IC+ICN
ACSR=(1<<ACBG)|(1<<ACIC)|(1<<ACIS1)|(1<<ACIS0); //AC->ICP
TIMSK1=(1<<ICIE1);
Naechste = millis() +250;
}

void loop() {
static unsigned long Drehzahl[4] = {0, 0, 0, 0};
static byte i = 0;

if (Naechste < millis()) {
Naechste += 250;
cli();
ImpulseTemp = Impulse;
Impulse = 0;
ZeitTemp = Zeit;
Zeit = 0;
sei();
Drehzahl = (float)15000000 * ImpulseTemp / ZeitTemp;
i++;
if (i > 3) i = 0;
Serial.print("Drehzahl = ");
Serial.println((Drehzahl[0] + Drehzahl[1] + Drehzahl[2] + Drehzahl[3]) / 4);
}
}

ISR (TIMER1_CAPT_vect) {
static int Pulse = 0;

if ((ICR1 - Pulse) > 50) { // Frequenzgrenze für Motorphasenmessung
Zeit += ICR1;
TCNT1 = 0;
Pulse = 0;
Impulse ++;
}
else
Pulse = ICR1;
}
 
Zuletzt bearbeitet:

charly_a

User
manchmal rentiert sichs einfach nicht, etwas selber zu bauen, und das hier ist so ein Fall. Für 10..15€ gibts sowas bei Amazon oder Hobbyking fertig.
Sicher, einen Arduino zum Zählen zu bewegen und das Ergebnis anzuzeigen ist keine Hexerei. Wos bei den meisten scheitert ist das analoge Frontend. Einen Fotowiderstand an den Analogeingang zu nageln, wird nicht gehen. Ich hab mal vor 30 Jahren sowas gebaut: mit ein paar OPs einen Vorverstärker, Begrenzer, Differenzierer und Signalformer gebaut und dahinter ein Grab von CMOS-Zählern und Decodern und ein LC-Display. Materialkosten wahrscheinlich um die 100€.
dm1.jpgdm2.jpg
 
Hi,

also vor Jahren der LRKs erschien, waren meine Regler-Eigenbauten ca. 1/3 des Preises eines käuflichen Reglers. Jetzt ist es umgekehrt. Aber die Erfahrung die man beim Selberentwickeln sammelt ist unbezahlbar :-)

Meine Drehzahlmessung an der Motorphase funktioniert mit verschiedenen Regler- Motor-Kombinationen. Nicht aber mit dem Regler im Hubschrauber.

Aber BL-Motoren haben ein messbares magnetisches Streufeld. Mit einem Turbinen-Drehzahlsensor, direkt an den Arduino angeschlossen kann ich jetzt die Drehzahl auch am Hubschrauber messen. Natürlich wären auch irgendwelche Lichtschranken oder HAL-Sensoren möglich gewesen, jetzt ist es ein KMZ geworden :-)

Über die rpm-Sensoreinstellungen der OpenTX kann man jede Umrechnung über Multiplikator und Prop-Blätter einstellen. Dadurch war es nicht notwendig eine feste Umrechnung zu kodieren. Bei mir ist Multiplikator 13 und Propblätter 510 ( entspricht 170Zähne * 3 Polpare des Motors)

Gruß Sven

P.S. Die Kosten des Telemetrie-Drehzahlsensors, jetzt mit (Eigenbau)Turbinendrehzahlsensor sind ca. 10€
 
Ansicht hell / dunkel umschalten
Oben Unten