Forum: Mikrocontroller und Digitale Elektronik Pumpenmotor rpm mit Arduino berechnen


von Max M. (Firma: conglomat gmbh) (dasjhdsajkhda)


Lesenswert?

Hallo Leute,

ich habe folgende Wasserpumpe M400-K 
(https://docs.rs-online.com/9836/0900766b8162656f.pdf) von dem ich die 
Motor RPM mit einem Arduino Uno R3 auslesen möchte.

Das auslesen habe ich mit Interrupts hinbekommen. Ich bin mir nicht 
sicher, wie die Berechnung von Pulses in rpm gemacht werden soll.
Im Datenblatt steht, dass das RPM Signal ein 4 pulse / revolution 
Rechtecksignal ist. Bedeutet das, dass ich lediglich den count Wert 
durch 4 dividiere um die revolution zu erhalten. Diesen Wert dann mal 60 
multiplizieren um revolution pro Minute zu bekommen?
Vielleicht stelle ich mir das zu einfach vor....
1
void counter(){
2
  count++;
3
}
4
 
5
void setup(){
6
  pinMode(3, INPUT); 
7
8
  count = 0;
9
  rpm = 0;
10
  oldtime = 0;
11
12
  attachInterrupt(1, counter, CHANGE);  
13
}
14
15
void loop(){
16
  if((millis() - oldtime) > 1000)
17
  {
18
    noInterrupts();
19
    copy_count = count;
20
    count = 0;
21
    interrupts();
22
23
    oldtime = millis(); 
24
25
    rpm = (count/4)*60;
26
  }

: Verschoben durch Moderator
von MaWin (Gast)


Lesenswert?

Revolution heisst im Deutschen nicht Revolution, sondern Umdrehung(en).

Wenn du die Pulse innerhalb von 15 Sekunden erfasst, hast du direkt die 
UPM Anzahl

von Max M. (Firma: conglomat gmbh) (dasjhdsajkhda)


Lesenswert?

MaWin schrieb:
> Wenn du die Pulse innerhalb von 15 Sekunden erfasst, hast du direkt die
> UPM Anzahl

warum 15 Sekunden?

von H. H. (Gast)


Lesenswert?

Max M. schrieb:
> MaWin schrieb:
>> Wenn du die Pulse innerhalb von 15 Sekunden erfasst, hast du direkt die
>> UPM Anzahl
>
> warum 15 Sekunden?

60/4=15

von EAF (Gast)


Lesenswert?

H. H. schrieb:
> 60/4=15

Max M. schrieb:
> , CHANGE);

60 / 8 = 7,5

von Max M. (Firma: conglomat gmbh) (dasjhdsajkhda)


Lesenswert?

EAF schrieb:
> 60 / 8 = 7,5
Ich sollte also mein if-statement ändern?
1
if( (millis()-oldtime) > 7500) // 7,5 sekunden intervalle

von EAF (Gast)


Lesenswert?

Oder die hälfte der Interrupts unterdrücken/verhindern.
Und die Rechnung von H. H. (hhinz) stimmt wieder.

Change vs Rising
Dann geht auch 15000ms


Vielleicht möchtest du ja auch einen der Timer als Zähler benutzen.
Dann brauchts nur noch für den Überlauf eine ISR (wenn überhaupt)

von Max M. (Firma: conglomat gmbh) (dasjhdsajkhda)


Lesenswert?

EAF schrieb:
> Change vs Rising
> Dann geht auch 15000ms
Das Problem bei dieser Methode ist, dass Geschwindigkeitsänderungen 
nicht genau widergespiegelt werden. Ich möchte meine Pumpe innerhalb 5s 
unterschiedlich ansteuern, d.h. innerhalb 5s kann die UPM sich extrem 
verändern. Um dies zu berücksichtigen würde ich dann doch die Formel 
ganz oben benutzen oder?
1
if ((millis() - lastime) > 1000) // 1s Messzeit
2
{
3
   .... 
4
   rpm = count/4; // 4 pulses pro Umdrehung
5
   rpm = rpm*60; // rpm (in Minuten)
6
}

> Vielleicht möchtest du ja auch einen der Timer als Zähler benutzen.
> Dann brauchts nur noch für den Überlauf eine ISR (wenn überhaupt)
CaptureTimer benutzen?

: Bearbeitet durch User
von EAF (Gast)


Lesenswert?

Max M. schrieb:
> CaptureTimer benutzen?
Auch eine Möglichkeit.

Eigentlich meinte ich das Signal an Pin T1 anzulegen und dieses als Takt 
für Timer1 zu nutzen.

von Hugo H. (hugo_hu)


Lesenswert?

Du hast keine Ahnung, wie breit oder schmal die Impulse sind. Ich würde 
schlicht die Zeit in ms zwischen 2 "RISING"s nehmen, 15000/Zeit und 
fertig ist die Laube :-)

Das geht auch ganz fix und Du brauchst keine Pulse / Rises etc. zu 
zählen. Du bist dann so zeitnah wie möglich an der aktuellen 
Umdrehungszahl.

: Bearbeitet durch User
von Max M. (Firma: conglomat gmbh) (dasjhdsajkhda)


Lesenswert?

Hugo H. schrieb:
> Du hast keine Ahnung, wie breit oder schmal die Impulse sind. Ich würde
> schlicht die Zeit in ms zwischen 2 "RISING"s nehmen, 15000/Zeit und
> fertig ist die Laube :-)

2 Rising Flanken würden mir eine halbe Umdrehung geben. Macht es nicht 
mehr Sinn 4 Rising Flanken zeitlich zu messen? Dann habe ich die Zeit 
für 1 Umdrehung. Teile 60 durch diesen Wert um die Umdrehungen pro 
Minute zu bekommen.

Ich verstehe leider nicht wann ich die 15000/Zeit wo einsetzen soll.

von Wolfgang (Gast)


Lesenswert?

Max M. schrieb:
> Ich verstehe leider nicht wann ich die 15000/Zeit wo einsetzen soll.

Du brauchst auch nicht zu verstehen, was du wann wo einsetzen musst, 
sondern zum Lösen deine Aufgabe musst du wissen, wie man aus der 
Drehgeschwindigkeit die Drehzahl berechnet. Schreibe dir mal die 
richtigen Einheiten dran. Dann dürfte es klarer werden.

Teile 60 Sekunden durch die Zeit für eine Umdrehung und du bekommst die 
Drehzahl in Umdrehungen pro Minute - das verstehst du?

Wenn du 4 Pulse pro Umdrehung hast, musst du also 60 Sekunden durch 4 
mal die Zeit zwischen zwei Pulsen teilen. 60 Sekunden geteilt durch 4 
sind 15000 Millisekunden. Also ergibt 15000ms geteilt durch den 
Zeitabstand zwischen zwei Impulsen die Drehzahl.

von PittyJ (Gast)


Lesenswert?

Ist das nicht alles nur Schulmathematik, so 8. Klasse?
Wenn man eine GmbH hat, dann ist doch die Steuererklärung schon 
komplexer als diese Umdrehungsberechnung hier.

von Hugo H. (hugo_hu)


Lesenswert?

Max M. schrieb:
> 2 Rising Flanken würden mir eine halbe Umdrehung geben.

Nein, 1/4 Umdrehung. Das reicht aus um die aktuelle Umdrehungszahl zu 
bestimmen.

Max M. schrieb:
> Ich verstehe leider nicht wann ich die 15000/Zeit wo einsetzen soll.

15000 / Zeit (in ms) zwischen 2 RISING = Umdrehungen pro Minute.

So, ungefähr:
1
const     byte              interruptPin = 3;
2
3
volatile  unsigned  long    time_old;
4
volatile  unsigned  long    time_new;
5
6
volatile  word              upm = 0;
7
8
void setup()
9
{
10
  attachInterrupt(digitalPinToInterrupt(interruptPin), upm_isr, RISING);
11
}
12
13
void loop()
14
{
15
  Serial.print(upm);
16
}
17
18
void upm_isr()
19
{
20
  time_new = millis();
21
  upm = 15000 / (time_new - time_old);
22
  time_old = time_new;
23
}

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.