![]() ![]() | Kontaktlose Drehzahlmessung mit ESP32![]() Diese Schaltung macht es möglich, ohne die rotierenden Teile eines Motors, einer Achse oder einer Maschine zu berühren, ihre Drehzahl
zu ermitteln. Die Drehzahlmessung basiert auf dem Prinzip eines Stroboskops. Je nach Begebenheit wird an der rotierenden Einrichtung ein Element
gewählt oder eine Markierung angebracht und mit kurzen, regelmäßigen Lichtblitzen beleuchtet. Wenn die Frequenz der Blitze genau der Rotationsgeschwindigkeit
des Objekts oder der Markierung entspricht, scheint es für das menschliche Auge stillzustehen. Es handelt sich dabei um eine Illusion, die suggeriert,
dass sich das drehende Objekt nicht bewegt und einfach stillsteht. Sobald der angebliche „Stillstand“ des Objektes oder Markierung erreicht ist, entspricht
die Frequenz der Blitze der gesuchten Drehzahl.
Spannungsregler![]() Die Hauptversorgungsspannung der Schaltung, die von extern geliefert wird, beträgt 12 VDC. Diese Spannung wird mit dem Spannungsregler A2 auf 5
VDC heruntergeregelt. Mit dieser Spannung werden der Mikrocontroller und die 7-Segmentanzeige versorgt. Mit dem Spannungsregler A1 wird eine passende
Spannung für die präparierte Taschenlampe zur Verfügung gestellt.
Bei den Spannungsreglern handelt es sich um
fertige Module, die auf dem IC-Bauteil LM2596 basieren. Im Handel sind diese Module weit verbreitet. Grundsätzlich können sie in zwei Versionen geliefert
werden: mit und ohne Spannungsanzeige. Unter anderem verfügen die Module über einen Trimmer, mit dem die Ausgangsspannung eingestellt werden kann. Die
Spannungsregler arbeiten in einem Spannungsbereich von 3-40V. Anzeige![]() Für die Anzeige der aktuell ermittelten Drehzahl ist eine aus vier Digits bestehende 7-Segmentanzeige zuständig. Auch hier handelt es sich um
ein fertiges Modul, das auf dem Anzeigetreiber TM1637 basiert. Der Treiber übernimmt alle notwendigen Funktionen der Steuerung der Anzeige. Die benötigten
Informationen von dem Mikrocontroller werden über zwei Leitungen übermittelt. Der Aufsatz des Moduls trägt die Bezeichnung 3642BH. Die Versorgungsspannung
des Moduls beträgt 3,3 V bis 5 VDC, die Stromaufnahme pendelt zwischen 30 und 80 mA.
Touchsensoren![]() Die Einstellung der aktuellen Frequenz wird mit drei Touchsensoren (Berührungsschaltern) realisiert. Mit den Sensoren S4 und S5 wird die
gesuchte Frequenz im Schnellverfahren eingestellt, mit dem Sensor S3 wird die Feineinstellung der Frequenz aktiviert. Bei der Feineinstellung wird die
Frequenz bei jeder Betätigung um 0,1 Hz erhöht. In diesem Modus wird der Touchsensor auf positive Flanke abgefragt. Weitere Änderung der Frequenz ist in
diesem Fall nur dann möglich, wenn der Taster losgelassen und anschließend wieder betätigt wird.
Transistor![]() Je nachdem, welche Leistung das Leuchtmittel für die Stroboskopblitze benötigt, muss eine Leistungsanpassung am Mikrocontrollerausgang erfolgen.
Ein zu hoher Strom kann den Mikrocontroller beschädigen. Diese Aufgabe übernimmt in der Schaltung ein Transistor. Der zwischen dem Mikrocontroller und dem
Verbraucher geschaltete Transistor BD437 kann einen Strom bis zu 6 A schalten. BD437 ist ein NPN-Transistor und verträgt Spannungen
bis zu 45V. Mikrocontroller![]() Der ESP32 übernimmt in der Schaltung die Bildung der Signale, die anschließend die aktuell gemessene Drehzahl verraten sollen. Bei den Signalen
handelt es sich um die PWM-Signale, die sich für die Bildung von Stroboskopblitzen sehr gut eignen. Zwei Größen bei einem PWM-Signal haben entscheidende
Bedeutung: Frequenz und Impulsdauer. Die Frequenz, die mit Touchsensoren eingestellt wird, pendelt in unserem Beispiel im Bereich von 0 bis 160 Hz. Damit
können Drehzahlen bis zu 9600 U/min untersucht werden. Bei höheren Drehzahlen müsste die aus vier Digits bestehende 7-Segmentanzeige mit einer anderen ersetzt
werden. Bei der Bildung des Impulsdauer (Pulsweite), die oft durch das Tastverhältnis ausgedrückt wird und für die Dauer des Blitzes zuständig ist, müssen wir
darauf achten, dass sie bei verändernder Frequenz konstant bleibt. So muss das Tastverhältnis für jede Frequenz neu berechnet werden. Z. B.
Schaltplan![]() Testschaltung![]() ![]() Umgebaute LED-Taschenlampe mit untersuchtem Lüfter Programm// **************************************************************************************// Kontaktlose Drehzahlmessung mit ESP32 // Stroboskopische Methode mit PWM-Signal und einstellbaren Pulsbreite // Mit Microcontroller ESP32 // Arduino IDE v2.3.10 // ************************************************************************************** #include <TM1637Display.h> // Bibliothek für Anzeige einbinden #define CLK 27 // CLK Pin Nr. 26 #define DIO 26 // DIO Pin Nr. 25 TM1637Display display(CLK, DIO); // Erstellt Objekt display const int PWM_Kanal = 0; // PWM Kanal const int PWM_Aufloesung = 10; // PWM Auflösung (1024) double PWM_Soll_Frequenz = 10; // PWM Soll Frequenz double PWM_Alte_Frequenz; // PWM alte Frequenz int PWM_Pulse_Pin = 4; // PWM Ausgang long int Tastverhaeltnis; // PWM Tastverhältnis Soll long int Tastverhaeltnis_Alt; // PWM Tastverhältnis altwert int Taster_F_Plus = 25; // Taster Frequenzeinstellung erhöhen int Taster_F_Minus = 33; // Taster Frequenzeinstellung reduzieren int Taster_F_Feineinstellung = 32; // Taster Feineinstellung aktivieren int Taster_T_Plus = 35; // Taster Tastverhältnis erhöhen int Taster_T_Minus = 34; // Taster Tastverhältnis reduzieren int Eingabe_Tastverhaeltnis = 500; bool Taster_Positive_Flanke; unsigned long Millis_Alt; int Eingabe_min_Zeit = 35; // Eingabe Verzögerung in Millisekunden // ************************************************************************************** void setup() { display.setBrightness(10); // Anzeige Helligkeit display.clear(); // Anzeige löschen pinMode(Taster_F_Plus, INPUT); // Touchsensor Frequenz rauf pinMode(Taster_F_Minus, INPUT); // Touchsensor Frequenz runter pinMode(Taster_F_Feineinstellung, INPUT); // Touchsensor Feineinstellung aktivieren ledcSetup(PWM_Kanal, PWM_Soll_Frequenz, PWM_Aufloesung); // PWM Ausgabe Startwerte pinMode(Taster_T_Plus, INPUT); // Touchsensor Tastverhältnis rauf pinMode(Taster_T_Minus, INPUT); // Touchsensor Tastverhältnis runter ledcAttachPin(PWM_Pulse_Pin, PWM_Kanal); // PWM Ausgabe Start } // ************************************************************************************** void loop() { unsigned long Millis_Aktuell = millis(); if (Millis_Aktuell > (Millis_Alt + Eingabe_min_Zeit)) { Millis_Alt = Millis_Aktuell; Sollfrequenz_festlegen (); Tastverhaeltnis_festlegen (); } if (PWM_Soll_Frequenz != PWM_Alte_Frequenz) { // PWM Ausgabe nur bei Änderung PWM_Alte_Frequenz = PWM_Soll_Frequenz; ledcChangeFrequency(PWM_Kanal, PWM_Soll_Frequenz, PWM_Aufloesung); int Drehzahl = PWM_Soll_Frequenz * 60; // Drehzahl in U / Min String Ausgabe = String (Drehzahl); display.showNumberDecEx(Ausgabe.toInt(), 0b00000000, false, 4, 4); } if (Tastverhaeltnis != Tastverhaeltnis_Alt) { // Tastverhältnis nur bei Änderung Tastverhaeltnis_Alt = Tastverhaeltnis; ledcWrite(PWM_Kanal, Tastverhaeltnis); } if ((digitalRead (Taster_F_Plus) == LOW) && (digitalRead (Taster_F_Minus) == LOW)) { Taster_Positive_Flanke = LOW; } } // ************************************************************************************** void Sollfrequenz_festlegen () { if (digitalRead (Taster_F_Plus) == HIGH) { // Sollfrequenz erhöhen if (digitalRead (Taster_F_Feineinstellung) == LOW) { PWM_Soll_Frequenz = PWM_Soll_Frequenz + 0.2; } if (Taster_Positive_Flanke == LOW) { // Feinabstimmung PWM_Soll_Frequenz = PWM_Soll_Frequenz + 0.1; Taster_Positive_Flanke = HIGH; } } if (digitalRead (Taster_F_Minus) == HIGH) { // Sollfrequenz erniedrigen if (digitalRead (Taster_F_Feineinstellung) == LOW) { PWM_Soll_Frequenz = PWM_Soll_Frequenz - 0.2; } if (Taster_Positive_Flanke == LOW) { // Feinabstimmung PWM_Soll_Frequenz = PWM_Soll_Frequenz - 0.1; Taster_Positive_Flanke = HIGH; } } if (PWM_Soll_Frequenz > 160) { // Grenzwerte prüfen PWM_Soll_Frequenz = 160; } if (PWM_Soll_Frequenz < 1) { PWM_Soll_Frequenz = 1; } } // ************************************************************************************** void Tastverhaeltnis_festlegen () { if (digitalRead (Taster_T_Plus) == HIGH) { // Tastverhältnis erhöhen Eingabe_Tastverhaeltnis++; } if (digitalRead (Taster_T_Minus) == HIGH) { // Tastverhältnis erniedrigen Eingabe_Tastverhaeltnis--; } if (Eingabe_Tastverhaeltnis > 512) { // Grenzwerte prüfen Eingabe_Tastverhaeltnis = 512; // Taster können mit Poti } // ersetzt werden. if (Eingabe_Tastverhaeltnis < 1) { Eingabe_Tastverhaeltnis = 1; } Tastverhaeltnis = (PWM_Soll_Frequenz * Eingabe_Tastverhaeltnis) / 160; // Tastverhältnis } // ************************************************************************************** Nachdem die Startsequenz setup() durchlaufen ist und alle Voreinstellungen abgearbeitet wurden, beginnt mit loop() das Hauptprogramm, das man
als eine endlose Schleife, die immer wieder wiederholt wird, verstehen kann.
KurzvideoKurzvideo Weitere Themen:
|