Arduino Rührwerk mit BLDC Motor
Arduino Rührwerk mit BLDC Motor
Hallo liebes Forum,
ich arbeite aktuell an einem kleinen Rührwerk mit BLDC Motor fürs Bierbrauen. Die Bauteile hatte ich größtenteils noch im Keller und es funktioniert prinzipiell ganz gut. Angeschlossen am Arduino Uno sind ein DS18b20 Sensor, der die Temperatur über das TM1637 Display ausgibt. Ich habe nun allerdings zwei Probleme, bei denen ihr mir vielleicht helfen könnt (vielleicht sind ja hier ein paar Experten im Forum). Zum einen funktioniert der Betrieb mit 9V Netzteil nicht. Es funktioniert nur mit dem USB Kabel am Laptop. Ich verwende ein 9v Gitarrenpedal Netzteil mit 120mA.
Außerdem möchte ich später in einem Phyton Programm einige Daten auswerten (Temperatur, Drehzahl usw…). Aus diesem Grund habe ich den SPEED Ausgang ebenfalls an dem Arduino verbunden (und den GND). Im seriellen Monitor zeigt er aber keine korrekten Werte für die Drehzahl an. Wenn der Motor läuft (egal bei welcher Drehzahl) zeigt er manchmal 0 U/min oder manchmal 30 U/min abwechselnd an. Woran kann das liegen?
Programmcodes und Motortreiber Datenblatt sind im Anhang
Vielen Dank im Voraus!
Liebe Grüße
Code:
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 5 // Pin, an dem der SPEED-Ausgang des Treibers angeschlossen ist
#define MOTOR_POLE_PAIRS 2 // Anzahl der Motorpolpaare
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT); // Den Pin für die Drehzahl als Eingang konfigurieren
}
void loop() {
// Temperatur aktualisieren
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// Drehzahl auslesen
int pulseFrequency = digitalRead(SPEED_PIN);
int motorSpeed = (pulseFrequency * 60) / MOTOR_POLE_PAIRS; // Drehzahl berechnen unter Berücksichtigung der Polpaare
// Temperatur und Drehzahl im Terminal anzeigen
if (tempC != DEVICE_DISCONNECTED_C) {
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
int temp = int(tempC);
display.showNumberDec(temp);
} else {
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888);
}
delay(1000);
}
ich arbeite aktuell an einem kleinen Rührwerk mit BLDC Motor fürs Bierbrauen. Die Bauteile hatte ich größtenteils noch im Keller und es funktioniert prinzipiell ganz gut. Angeschlossen am Arduino Uno sind ein DS18b20 Sensor, der die Temperatur über das TM1637 Display ausgibt. Ich habe nun allerdings zwei Probleme, bei denen ihr mir vielleicht helfen könnt (vielleicht sind ja hier ein paar Experten im Forum). Zum einen funktioniert der Betrieb mit 9V Netzteil nicht. Es funktioniert nur mit dem USB Kabel am Laptop. Ich verwende ein 9v Gitarrenpedal Netzteil mit 120mA.
Außerdem möchte ich später in einem Phyton Programm einige Daten auswerten (Temperatur, Drehzahl usw…). Aus diesem Grund habe ich den SPEED Ausgang ebenfalls an dem Arduino verbunden (und den GND). Im seriellen Monitor zeigt er aber keine korrekten Werte für die Drehzahl an. Wenn der Motor läuft (egal bei welcher Drehzahl) zeigt er manchmal 0 U/min oder manchmal 30 U/min abwechselnd an. Woran kann das liegen?
Programmcodes und Motortreiber Datenblatt sind im Anhang
Vielen Dank im Voraus!
Liebe Grüße
Code:
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 5 // Pin, an dem der SPEED-Ausgang des Treibers angeschlossen ist
#define MOTOR_POLE_PAIRS 2 // Anzahl der Motorpolpaare
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT); // Den Pin für die Drehzahl als Eingang konfigurieren
}
void loop() {
// Temperatur aktualisieren
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// Drehzahl auslesen
int pulseFrequency = digitalRead(SPEED_PIN);
int motorSpeed = (pulseFrequency * 60) / MOTOR_POLE_PAIRS; // Drehzahl berechnen unter Berücksichtigung der Polpaare
// Temperatur und Drehzahl im Terminal anzeigen
if (tempC != DEVICE_DISCONNECTED_C) {
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
int temp = int(tempC);
display.showNumberDec(temp);
} else {
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888);
}
delay(1000);
}
Re: Arduino Rührwerk mit BLDC Motor
Vielleicht RS 232 eingestellt statt RS 485?
Nur so ne Idee....
Nur so ne Idee....
Re: Arduino Rührwerk mit BLDC Motor
Sorry, ich bin noch Neuling in dem Thema, kannst du kurz genauer erläutern was du damit meinst? Danke :-)
Hier auch nochmal kurz skizziert was ich alles verkabelt habe:
Hier auch nochmal kurz skizziert was ich alles verkabelt habe:
Re: Arduino Rührwerk mit BLDC Motor
So kann das nicht funktionieren. Du liest in einem Schleifendurchlauf entweder HIGH oder LOW an PIN 5 aus, mit der Information kannst du nichts anfangen, wie du ja selbst festgestellt hast.
Also z.B.
"letzterZeitpunkt" = millis();
while (("letzterZeitpunkt" + "zeitfenster") > millis())
{
//hier die Impulse zählen
}
Die Breite des Zeitfensters sollte nicht zu groß gewählt werden, da das Programm ja an dieser Stelle verweilt.
Danach kannst du die Motordrehzahl berechnen:
U/"zeitfenster"*60
Dies ist eine Möglichkeit, es gibt sicherlich noch andere!
Gruß Lothar
Du musst die Impulse in einem Zeitfenster lesen und dann hochrechnen.void loop() {
...
// Drehzahl auslesen
int pulseFrequency = digitalRead(SPEED_PIN);
int motorSpeed = (pulseFrequency * 60) / MOTOR_POLE_PAIRS; // Drehzahl berechnen unter Berücksichtigung der Polpaare
}
Also z.B.
"letzterZeitpunkt" = millis();
while (("letzterZeitpunkt" + "zeitfenster") > millis())
{
//hier die Impulse zählen
}
Die Breite des Zeitfensters sollte nicht zu groß gewählt werden, da das Programm ja an dieser Stelle verweilt.
Danach kannst du die Motordrehzahl berechnen:
U/"zeitfenster"*60
Dies ist eine Möglichkeit, es gibt sicherlich noch andere!
Gruß Lothar
Re: Arduino Rührwerk mit BLDC Motor
Vielen Dank für deine Antwort!Bitter hat geschrieben: ↑Samstag 13. April 2024, 08:46 So kann das nicht funktionieren. Du liest in einem Schleifendurchlauf entweder HIGH oder LOW an PIN 5 aus, mit der Information kannst du nichts anfangen, wie du ja selbst festgestellt hast.
Du musst die Impulse in einem Zeitfenster lesen und dann hochrechnen.void loop() {
...
// Drehzahl auslesen
int pulseFrequency = digitalRead(SPEED_PIN);
int motorSpeed = (pulseFrequency * 60) / MOTOR_POLE_PAIRS; // Drehzahl berechnen unter Berücksichtigung der Polpaare
}
Also z.B.
"letzterZeitpunkt" = millis();
while (("letzterZeitpunkt" + "zeitfenster") > millis())
{
//hier die Impulse zählen
}
Die Breite des Zeitfensters sollte nicht zu groß gewählt werden, da das Programm ja an dieser Stelle verweilt.
Danach kannst du die Motordrehzahl berechnen:
U/"zeitfenster"*60
Dies ist eine Möglichkeit, es gibt sicherlich noch andere!
Gruß Lothar
Ich habe mal versucht den Code entsprechend abzuändern… wäre es so korrekt?
Code: Alles auswählen
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 5 // Pin für den SPEED-Ausgang vom Treiber
#define ALARM_PIN 6 // Pin für den ALM-Ausgang vom Treiber
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
#define TIME_WINDOW 1000 // Zeitfenster in Millisekunden
volatile int pulseCount = 0; // Variable für die Anzahl der Pulsen
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT_PULLUP);
pinMode(ALARM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), countPulses, RISING);
}
void loop() {
sensors.requestTemperatures(); // Temperatur aktualisieren
float tempC = sensors.getTempCByIndex(0); // Temperatur in Celsius lesen
if (tempC != DEVICE_DISCONNECTED_C) { // Überprüfen, ob ein gültiger Wert gelesen wurde
// Temperatur im Terminal anzeigen
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
// Temperatur auf dem TM1637-Display anzeigen
int temp = int(tempC); // Temperatur auf ganze Zahl konvertieren
display.showNumberDec(temp); // Temperatur ohne Dezimalstelle auf dem Display anzeigen
} else {
// Fehlerbehandlung, wenn kein gültiger Wert gelesen werden kann
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888); // Anzeige auf "8888" setzen, wenn ein Fehler auftritt
}
// Warten bis das Zeitfenster abgelaufen ist
delay(TIME_WINDOW);
// Anzahl der Impulse im Zeitfenster auslesen
int pulseCountSnapshot = pulseCount;
pulseCount = 0; // Reset pulse count for the next window
// Motordrehzahl basierend auf der Anzahl der Impulse und der Dauer des Zeitfensters berechnen
float motorSpeed = (pulseCountSnapshot * 60.0) / MOTOR_POLE_PAIRS / (TIME_WINDOW / 1000.0); // Drehzahl in U/min
// Anzeige der Motordrehzahl
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
}
void countPulses() {
pulseCount++; // Increment pulse count when a rising edge is detected
}
- PabloNop
- Posting Freak
- Beiträge: 1240
- Registriert: Sonntag 28. Juli 2013, 11:39
- Wohnort: Saarbrücken
Re: Arduino Rührwerk mit BLDC Motor
Nicht wirklich, denn das Auslesen des Temperatursensors kostet Zeit: sensors.requestTemperatures blockiert, bis die Daten konvertiert sind. Diese Zeit musst Du in der Berechnung der Drehzahl berücksichtigen, sonst wird zu viel angezeigt.Ich habe mal versucht den Code entsprechend abzuändern… wäre es so korrekt?
Re: Arduino Rührwerk mit BLDC Motor
Danke für deinen Tipp!PabloNop hat geschrieben: ↑Samstag 13. April 2024, 11:09Nicht wirklich, denn das Auslesen des Temperatursensors kostet Zeit: sensors.requestTemperatures blockiert, bis die Daten konvertiert sind. Diese Zeit musst Du in der Berechnung der Drehzahl berücksichtigen, sonst wird zu viel angezeigt.Ich habe mal versucht den Code entsprechend abzuändern… wäre es so korrekt?
Vielleicht so?
Code: Alles auswählen
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 5 // Pin für den SPEED-Ausgang vom Treiber
#define ALARM_PIN 6 // Pin für den ALM-Ausgang vom Treiber
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
#define TIME_WINDOW 1000 // Zeitfenster in Millisekunden
volatile int pulseCount = 0; // Variable für die Anzahl der Pulsen
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT_PULLUP);
pinMode(ALARM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), countPulses, RISING);
}
void loop() {
unsigned long startTime = millis(); // Zeitstempel vor dem Auslesen der Temperatur
sensors.requestTemperatures(); // Temperatur aktualisieren
float tempC = sensors.getTempCByIndex(0); // Temperatur in Celsius lesen
if (tempC != DEVICE_DISCONNECTED_C) { // Überprüfen, ob ein gültiger Wert gelesen wurde
// Temperatur im Terminal anzeigen
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
// Temperatur auf dem TM1637-Display anzeigen
int temp = int(tempC); // Temperatur auf ganze Zahl konvertieren
display.showNumberDec(temp); // Temperatur ohne Dezimalstelle auf dem Display anzeigen
} else {
// Fehlerbehandlung, wenn kein gültiger Wert gelesen werden kann
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888); // Anzeige auf "8888" setzen, wenn ein Fehler auftritt
}
unsigned long endTime = millis(); // Zeitstempel nach dem Auslesen der Temperatur
unsigned long elapsedTime = endTime - startTime; // Zeit für das Auslesen der Temperatur in Millisekunden
// Warten bis das Zeitfenster abgelaufen ist
delay(TIME_WINDOW - elapsedTime);
// Anzahl der Impulse im Zeitfenster auslesen
int pulseCountSnapshot = pulseCount;
pulseCount = 0; // Reset pulse count for the next window
// Motordrehzahl basierend auf der Anzahl der Impulse und der Dauer des Zeitfensters berechnen
float motorSpeed = (pulseCountSnapshot * 60.0) / MOTOR_POLE_PAIRS / ((TIME_WINDOW - elapsedTime) / 1000.0); // Drehzahl in U/min
// Anzeige der Motordrehzahl
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
}
void countPulses() {
pulseCount++; // Increment pulse count when a rising edge is detected
}
- PabloNop
- Posting Freak
- Beiträge: 1240
- Registriert: Sonntag 28. Juli 2013, 11:39
- Wohnort: Saarbrücken
Re: Arduino Rührwerk mit BLDC Motor
Wenn Du das Delay auf "TIME_WINDOW - elapsedTime" musst Du für die Upm dennoch durch TIME_WINDOW dividieren (weil ja soviel Zeit vergangen ist).
Ein anderes Problem könnte noch sein, was passiert, wenn die Differenz negativ wird...
Ein anderes Problem könnte noch sein, was passiert, wenn die Differenz negativ wird...
Re: Arduino Rührwerk mit BLDC Motor
Das ist ein guter Punkt!
Code: Alles auswählen
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 5 // Pin für den SPEED-Ausgang vom Treiber
#define ALARM_PIN 6 // Pin für den ALM-Ausgang vom Treiber
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
#define TIME_WINDOW 1000 // Zeitfenster in Millisekunden
volatile int pulseCount = 0; // Variable für die Anzahl der Pulsen
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT_PULLUP);
pinMode(ALARM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), countPulses, RISING);
}
void loop() {
unsigned long startTime = millis(); // Zeitstempel vor dem Auslesen der Temperatur
sensors.requestTemperatures(); // Temperatur aktualisieren
float tempC = sensors.getTempCByIndex(0); // Temperatur in Celsius lesen
if (tempC != DEVICE_DISCONNECTED_C) { // Überprüfen, ob ein gültiger Wert gelesen wurde
// Temperatur im Terminal anzeigen
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
// Temperatur auf dem TM1637-Display anzeigen
int temp = int(tempC); // Temperatur auf ganze Zahl konvertieren
display.showNumberDec(temp); // Temperatur ohne Dezimalstelle auf dem Display anzeigen
} else {
// Fehlerbehandlung, wenn kein gültiger Wert gelesen werden kann
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888); // Anzeige auf "8888" setzen, wenn ein Fehler auftritt
}
unsigned long endTime = millis(); // Zeitstempel nach dem Auslesen der Temperatur
unsigned long elapsedTime = endTime - startTime; // Zeit für das Auslesen der Temperatur in Millisekunden
// Warten bis das Zeitfenster abgelaufen ist
long remainingTime = max(TIME_WINDOW - elapsedTime, 0); // Sicherstellen, dass die verbleibende Zeit nicht negativ wird
delay(remainingTime);
// Anzahl der Impulse im Zeitfenster auslesen
int pulseCountSnapshot = pulseCount;
pulseCount = 0; // Reset pulse count for the next window
// Motordrehzahl basierend auf der Anzahl der Impulse und der Dauer des Zeitfensters berechnen
float motorSpeed = (pulseCountSnapshot * 60.0) / MOTOR_POLE_PAIRS / (TIME_WINDOW / 1000.0); // Drehzahl in U/min
// Anzeige der Motordrehzahl
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
}
void countPulses() {
pulseCount++; // Increment pulse count when a rising edge is detected
}
Re: Arduino Rührwerk mit BLDC Motor
Mach es doch nicht so kompliziert:
Mit der Größe des Zeitfensters solltest du experimentieren.
Gruß Lothar
Code: Alles auswählen
void setup() {
Serial.begin(9600);
pinMode(SPEED_PIN, INPUT_PULLUP);
pinMode(ALARM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), countPulses, RISING);
startTime = millis();
}
void loop() {
......
if (startTime + TIME_WINDOW >= millis())
{
unsigned long elapsedTime = millis()-startTime;
float F = pulseCount/elapsedTime;
float motorSpeed = F / MOTOR_POLE_PAIRS * 60; // Drehzahl in U/min
pulseCount = 0; // Reset pulse count for the next window
startTime = millis();
// Anzeige der Motordrehzahl
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
}
}
void countPulses() {
pulseCount++; // Increment pulse count when a rising edge is detected
}
Gruß Lothar
Re: Arduino Rührwerk mit BLDC Motor
Elegant gelöst! Vielen Dank!
Trotzdem muss ich leider sagen, dass im Seriellen Monitor weiterhin nur 0,00 U/min angezeigt wird, egal wie schnell der Motor dreht das ist echt zum verzweifeln
Trotzdem muss ich leider sagen, dass im Seriellen Monitor weiterhin nur 0,00 U/min angezeigt wird, egal wie schnell der Motor dreht das ist echt zum verzweifeln
Re: Arduino Rührwerk mit BLDC Motor
Setze doch an geeigneter Stelle mal Ausgabe im Seriellen-Monitor.
Wird der Wert von pulseCount überhaupt inkrementiert?
Falls du ein Oszilloskop besitzen solltest, wie sieht denn das Signal an SPEED aus?
Du kannst natürlich auch einen einfachen Sketch verwenden und in Abhängigkeit vom Signal am Digitalpin an einem Ausgangspin eine LED zur Anzeige bringen. Dann siehst du jedenfalls, ob das Speedsignal OK ist.
Gruß Lothar
Code: Alles auswählen
void loop() {
Serial.println(pulseCount);
if (startTime + TIME_WINDOW >= millis())
Falls du ein Oszilloskop besitzen solltest, wie sieht denn das Signal an SPEED aus?
Du kannst natürlich auch einen einfachen Sketch verwenden und in Abhängigkeit vom Signal am Digitalpin an einem Ausgangspin eine LED zur Anzeige bringen. Dann siehst du jedenfalls, ob das Speedsignal OK ist.
Gruß Lothar
Re: Arduino Rührwerk mit BLDC Motor
Gute Idee,
ich denke das Hinzufügen einer zusätzlichen Ausgabe in der countPulses()-Funktion, um sicherzustellen, dass sie aufgerufen wird, wäre eine Möglichkeit. Hier ist der überarbeitete Sketch mit dieser Änderung:
Der serielle Monitor zeigt trotzdem nur folgendes:
Temperatur: 22.31 °C
0
Drehzahl: 0.00 U/min
Temperatur: 22.33 °C
0
Drehzahl: 0.00 U/min
ich denke das Hinzufügen einer zusätzlichen Ausgabe in der countPulses()-Funktion, um sicherzustellen, dass sie aufgerufen wird, wäre eine Möglichkeit. Hier ist der überarbeitete Sketch mit dieser Änderung:
Code: Alles auswählen
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 5 // Pin für den SPEED-Ausgang vom Treiber
#define ALARM_PIN 6 // Pin für den ALM-Ausgang vom Treiber
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
#define TIME_WINDOW 1000 // Zeitfenster in Millisekunden
volatile int pulseCount = 0; // Variable für die Anzahl der Pulsen
unsigned long startTime = 0; // Zeitstempel für den Start des Zeitfensters
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT_PULLUP);
pinMode(ALARM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), countPulses, RISING);
startTime = millis(); // Initialisierung des Zeitstempels für den Start
}
void loop() {
// Auslesen der Temperatur und Anzeige
sensors.requestTemperatures(); // Temperatur aktualisieren
float tempC = sensors.getTempCByIndex(0); // Temperatur in Celsius lesen
if (tempC != DEVICE_DISCONNECTED_C) { // Überprüfen, ob ein gültiger Wert gelesen wurde
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
int temp = int(tempC); // Temperatur auf ganze Zahl konvertieren
display.showNumberDec(temp); // Temperatur ohne Dezimalstelle auf dem Display anzeigen
} else {
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888); // Anzeige auf "8888" setzen, wenn ein Fehler auftritt
}
// Ausgabe der Impulsanzahl zur Überprüfung
Serial.println(pulseCount);
// Berechnung und Anzeige der Motordrehzahl
if (startTime + TIME_WINDOW >= millis()) {
unsigned long elapsedTime = millis() - startTime; // Verstrichene Zeit seit dem Start des Zeitfensters
float F = pulseCount / elapsedTime; // Pulse pro Millisekunde berechnen
float motorSpeed = F / MOTOR_POLE_PAIRS * 60; // Drehzahl in U/min berechnen
pulseCount = 0; // Reset pulse count for the next window
startTime = millis(); // Aktualisiere den Startzeitpunkt für das nächste Zeitfenster
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
}
}
void countPulses() {
pulseCount++; // Increment pulse count when a rising edge is detected
Serial.println("Puls erkannt!"); // Ausgabe zur Überprüfung
}
Der serielle Monitor zeigt trotzdem nur folgendes:
Temperatur: 22.31 °C
0
Drehzahl: 0.00 U/min
Temperatur: 22.33 °C
0
Drehzahl: 0.00 U/min
Re: Arduino Rührwerk mit BLDC Motor
Keine Ausgabe in die ISR setzen! Zählt denn pulseCount überhaupt hoch?
Re: Arduino Rührwerk mit BLDC Motor
Sorry, ich bin etwas überfordert
So?
So?
Code: Alles auswählen
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 5 // Pin für den SPEED-Ausgang vom Treiber
#define ALARM_PIN 6 // Pin für den ALM-Ausgang vom Treiber
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
#define TIME_WINDOW 1000 // Zeitfenster in Millisekunden
volatile int pulseCount = 0; // Variable für die Anzahl der Pulsen
unsigned long startTime = 0; // Zeitstempel für den Start des Zeitfensters
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT_PULLUP);
pinMode(ALARM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), countPulses, RISING);
startTime = millis(); // Initialisierung des Zeitstempels für den Start
}
void loop() {
// Auslesen der Temperatur und Anzeige
sensors.requestTemperatures(); // Temperatur aktualisieren
float tempC = sensors.getTempCByIndex(0); // Temperatur in Celsius lesen
if (tempC != DEVICE_DISCONNECTED_C) { // Überprüfen, ob ein gültiger Wert gelesen wurde
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
int temp = int(tempC); // Temperatur auf ganze Zahl konvertieren
display.showNumberDec(temp); // Temperatur ohne Dezimalstelle auf dem Display anzeigen
} else {
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888); // Anzeige auf "8888" setzen, wenn ein Fehler auftritt
}
// Berechnung und Anzeige der Motordrehzahl
if (startTime + TIME_WINDOW >= millis()) {
unsigned long elapsedTime = millis() - startTime; // Verstrichene Zeit seit dem Start des Zeitfensters
float F = pulseCount / elapsedTime; // Pulse pro Millisekunde berechnen
float motorSpeed = F / MOTOR_POLE_PAIRS * 60; // Drehzahl in U/min berechnen
pulseCount = 0; // Reset pulse count for the next window
startTime = millis(); // Aktualisiere den Startzeitpunkt für das nächste Zeitfenster
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
}
}
void countPulses() {
pulseCount++; // Increment pulse count when a rising edge is detected
}
Re: Arduino Rührwerk mit BLDC Motor
Gerade gesehen, du benutzt PIN 5 als Interruptpin, das funktioniert beim UNO nicht. Du musst PIN 2 oder 3 benutzen!
Re: Arduino Rührwerk mit BLDC Motor
Das erklärt eventuell meine Problematik! Das wusste ich nicht! Ich werde es später umstecken (ist leider schon verlötet) und mich dann noch mal melden! Vielen Dank schon mal!
Re: Arduino Rührwerk mit BLDC Motor
Ich habe jetzt das SPEED Kabel an den PIN 2 gesteckt und dafür den Temperatursensor an PIN 7 und den Code entsprechend geändert.
Leider immer noch 0,00 U/min im seriellen Monitor
Leider immer noch 0,00 U/min im seriellen Monitor
Code: Alles auswählen
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7 // Pin für den DS18B20-Sensor
#define CLK 3 // Pin CLK des TM1637-Displays
#define DIO 4 // Pin DIO des TM1637-Displays
#define SPEED_PIN 2 // Pin für den SPEED-Ausgang vom Treiber (Interrupt-Pin)
#define ALARM_PIN 6 // Pin für den ALM-Ausgang vom Treiber
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
#define TIME_WINDOW 1000 // Zeitfenster in Millisekunden
volatile int pulseCount = 0; // Variable für die Anzahl der Pulsen
unsigned long startTime = 0; // Zeitstempel für den Start des Zeitfensters
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
TM1637Display display(CLK, DIO);
void setup() {
Serial.begin(9600);
sensors.begin();
display.setBrightness(0x0a); // Helligkeit einstellen (0-0x0f)
pinMode(SPEED_PIN, INPUT_PULLUP);
pinMode(ALARM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), countPulses, RISING);
startTime = millis(); // Initialisierung des Zeitstempels für den Start
}
void loop() {
// Auslesen der Temperatur und Anzeige
sensors.requestTemperatures(); // Temperatur aktualisieren
float tempC = sensors.getTempCByIndex(0); // Temperatur in Celsius lesen
if (tempC != DEVICE_DISCONNECTED_C) { // Überprüfen, ob ein gültiger Wert gelesen wurde
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.println(" °C");
int temp = int(tempC); // Temperatur auf ganze Zahl konvertieren
display.showNumberDec(temp); // Temperatur ohne Dezimalstelle auf dem Display anzeigen
} else {
Serial.println("Fehler beim Lesen der Temperatur");
display.showNumberDec(8888); // Anzeige auf "8888" setzen, wenn ein Fehler auftritt
}
// Berechnung und Anzeige der Motordrehzahl
if (startTime + TIME_WINDOW >= millis()) {
unsigned long elapsedTime = millis() - startTime; // Verstrichene Zeit seit dem Start des Zeitfensters
float F = pulseCount / elapsedTime; // Pulse pro Millisekunde berechnen
float motorSpeed = F / MOTOR_POLE_PAIRS * 60; // Drehzahl in U/min berechnen
pulseCount = 0; // Reset pulse count for the next window
startTime = millis(); // Aktualisiere den Startzeitpunkt für das nächste Zeitfenster
Serial.print("Drehzahl: ");
Serial.print(motorSpeed);
Serial.println(" U/min");
}
}
void countPulses() {
pulseCount++; // Increment pulse count when a rising edge is detected
}
Leider besitze ich kein Oszilloskop :-(Bitter hat geschrieben: ↑Samstag 13. April 2024, 14:30 Setze doch an geeigneter Stelle mal Ausgabe im Seriellen-Monitor.
Wird der Wert von pulseCount überhaupt inkrementiert?Code: Alles auswählen
void loop() { Serial.println(pulseCount); if (startTime + TIME_WINDOW >= millis())
Falls du ein Oszilloskop besitzen solltest, wie sieht denn das Signal an SPEED aus?
Du kannst natürlich auch einen einfachen Sketch verwenden und in Abhängigkeit vom Signal am Digitalpin an einem Ausgangspin eine LED zur Anzeige bringen. Dann siehst du jedenfalls, ob das Speedsignal OK ist.
Gruß Lothar
Re: Arduino Rührwerk mit BLDC Motor
Da ist noch ein Fehler im Code. Du musst mit 60000 ms multiplizieren, statt mit 60 s. Hatte ich übersehen.
Unabhängig davon müsstest du jetzt eine Ausgabe > 0 bei "Serial.println(pulseCount);" bekommen. Vergrößere doch einfach mal das Zeitfenster auf 60 s.
Gruß Lothar
Unabhängig davon müsstest du jetzt eine Ausgabe > 0 bei "Serial.println(pulseCount);" bekommen. Vergrößere doch einfach mal das Zeitfenster auf 60 s.
Gruß Lothar
Re: Arduino Rührwerk mit BLDC Motor
Um überhaupt zu sehen, ob die Signale am Speed-Ausgang OK sind, spiele doch einmal folgenden Sketch auf:
Nimm irgendeine LED und einen Widerstand um die 200 Ohm, die LED sollte blinken!
Gruß Lothar
Code: Alles auswählen
const byte ledPin = 5; //oder ein anderer
const byte SPEED_PIN = 2;
volatile byte state = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(SPEED_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SPEED_PIN), led_ein_aus, CHANGE);
}
void loop() {
digitalWrite(ledPin, state);
}
void led_ein_aus() {
state = !state;
}
Gruß Lothar
Re: Arduino Rührwerk mit BLDC Motor
Es funktioniert! Ich bekomme nun eine Drehzahl angezeigt! Danke für die tolle Hilfe!
Ich habe das Zeitfenster nun auf 5 Sekunde stehen.
Ich meine, die Drehzahl wird zu hoch ausgegeben (gefühlt ungefähr doppelt so hoch als die tatsächliche Drehzahl). Kann das an der angenommenen Polzahl liegen?
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
Das ist tatsächlich nur ein angenommener Wert, weil ich leider kein Datenblatt zur Hand habe.
Ich habe das Zeitfenster nun auf 5 Sekunde stehen.
Ich meine, die Drehzahl wird zu hoch ausgegeben (gefühlt ungefähr doppelt so hoch als die tatsächliche Drehzahl). Kann das an der angenommenen Polzahl liegen?
#define MOTOR_POLE_PAIRS 4 // Anzahl der Motorpolpaare
Das ist tatsächlich nur ein angenommener Wert, weil ich leider kein Datenblatt zur Hand habe.
Re: Arduino Rührwerk mit BLDC Motor
Bringt Google dich da nicht weiter, sollte doch was zu finden sein! Eine Anfrage an den Hersteller bringt oft auch eine Lösung, oder, du probierst es einfach aus! Wie langsam kann der Motor denn drehen, um ggf. die tatsächliche Umdrehungszahl herauszufinden?
Gruß Lothar
Gruß Lothar