Forum: Mikrocontroller und Digitale Elektronik Digitalen Drehzahlsensor von Brushlessmotoren auswerten


von Hans S. (nettworker)


Lesenswert?

Hallo zusammen,

ich möchte mir für einen Motorteststand ( Brushlessmotoren aus dem 
Modellbau )eine Drehzahlanzeige bauen.
Ich habe noch einen Drehzahlsensor hier rumliegen: 
http://www.rc-team.org/dsens.htm
Wie kann ich denn da die Impulse zählen? Macht das der Arduino ( Nano / 
Uno ) überhaupt mit?
12 Zellen Akku x 4,2 Volt = 50,4 V max. , Motoren mit max. 2000 KV x 
50,4 V = 100800 Umdrehungen ( Impulse ).

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Hans S. schrieb:
> 100800 Umdrehungen ( Impulse ).

Selbst wenn das pro Sekunde wäre, hätte der MC noch keine Probleme 
damit. Wichtiger ist, ob der Sensor damit klarkommt. So lange dieser ein 
sauberes digitales Signal an den Arduino liefert, kann der das locker 
zählen.

Das Messen der Umdrehungen kann auf mehrere Arten geschehen:
* Der MC misst den zeitlichen Abstand der Sensorimpulse und errechnet 
daraus die Drehzahl
* Der MC misst die Anzahl der Pulse pro Zeiteinheit und errechnet daraus 
die Drehzahl.
Die erste Methode ist schneller, liefert aber meistens etwas mehr Jitter 
(Sprünge im Ergebnis), die zweite Methode braucht immer die Torzeit als 
Messperiode, ist durch Mittelung aber etwas ruhiger.

von Hans S. (nettworker)


Lesenswert?

Der Sensor ist extra dafür gebaut.
Das sind Impulse pro Minute, sollte dann ja kein Problem sein.

Kannst du mir mal nen Denkanstoss liefern, wie ich die Pulse zähle?

Mit pulsIn, mess ich ja den Abstand, wenn ich mich nicht irre.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Hans S. schrieb:
> Mit pulsIn, mess ich ja den Abstand, wenn ich mich nicht irre.

Es tut mir leid, aber von dem Arduino Sketchzeug habe ich soviel Ahnung 
wie von mittelalterlicher türkischer Dichtung. Mein Ansatz wäre:

Timer starten und Input Capture Interrupt aktivieren. Am IC Eingang ist 
mein Sensorsignal.

InputCapture Interrupt liest Timer Register und setzt Timer zurück.
Gelesenes Register ist Ergebnis in Zeiteinheiten des Timer. 
Hauptprogramm macht die Umrechnung kontinuierlich und zeigts über die 
serielle Schnittstelle oder auf LCD.
Falls ich langsame Umdrehungen erwarte, nutze ich zusätlich den Timer 
Overflow Interrupt, um Überläufe des Timers zu berücksichtigen.

: Bearbeitet durch User
von Hans S. (nettworker)


Lesenswert?

Matthias Sch. schrieb:
> Es tut mir leid, aber von dem Arduino Sketchzeug habe ich soviel Ahnung
> wie von mittelalterlicher türkischer Dichtung. Mein Ansatz wäre:

Und ich genauso viel von dem was du da schreibst :)
Bin Anfänger......

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Hans S. schrieb:
> Bin Anfänger......

Na dann:

1. Datenblatt des Controllers lesen, der auf dem Arduino sitzt.
2. Programmiersprache Deiner Wahl lernen (Assembler, C, Bascom...).
3. Controller programmieren und Drehzahlen auslesen / ausgeben.

von Karl H. (kbuchegg)


Lesenswert?

Hans S. schrieb:

> Bin Anfänger......

Dann geh erst mal den simplen Weg.
1 Sekunde lang mitzählen, wieviele Pulse vom Sensor gemeldet werden. Für 
deinen Motorteststand ist eine Aktualisierung alle 1 Sekunde wohl mehr 
als ausreichend. Zudem sind die dich interessierenden Drehzahlen alle 
gross genug, dass die Genauigkeit der Methode ausreichend sein sollte.

Anfänger sein ist kein Argument. Irgendwann muss man alles mal lernen. 
Und das geht auch nicht ohne Blessuren ab. Sprich: es wird dich hunzen, 
es wird dir Ärger machen, es wird nicht auf Anhieb funktionieren, du 
wirst einen Menge lernen müssen und du wirst auch nicht gleich mit der 
technisch ausgefeiltesten Methode rangehen können weil die für dich noch 
3 Schuhnummern zu gross ist. Wenn du aber durch bist, wirst du eine 
Menge gelernt haben. 'Ich will, aber ich kann nicht weil ich Anfänger 
bin, macht ihr mal für mich' gilt in der Programmierung nicht. In der 
Hinsicht ist Programmieren wie Radfahen: du musst es selber machen um es 
zu lernen. Und es gibt dabei eine Menge zu lernen!

1
...
2
3
unsigned long last;
4
5
void loop()
6
{
7
  unsigned long now = millis();
8
9
  if( now - last >= 1000 ) {    // (mindestens) 1 Sekunde ist vergangen
10
    last = now;
11
12
    mach was mit der Pulszahl
13
14
    Pulszahl = 0;
15
  }
16
17
  stelle fest, ob am Eingang ein Pegelwechsel vorliegt und wenn ja
18
  zähle einen Puls in der Pulszahl.
19
}

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Hans S. schrieb:
> Wie kann ich denn da die Impulse zählen? Macht das der Arduino ( Nano /
> Uno ) überhaupt mit?

Klassisch: Beitrag "einfache Drehzahlmessung mit ATmega88"
oder Arduino Uno: 
http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp7

Karl Heinz schrieb:
> Dann geh erst mal den simplen Weg.

Ich glaube, er will keinen Weg gehen, sondern am Ziel sein ;-)

von Karl H. (kbuchegg)


Lesenswert?

m.n. schrieb:

> Karl Heinz schrieb:
>> Dann geh erst mal den simplen Weg.
>
> Ich glaube, er will keinen Weg gehen, sondern am Ziel sein ;-)

So wie alle, die das an einem verregneten Samstag Nachmittag machen 
wollen. :-)

Wenn es nur um das Ziel geht: es gibt im Modellbauhandel genügend 
Drehzahlmesser. Und das zu einem Preis, der im Eigenbau nur schwer 
erreichbar ist.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Karl Heinz schrieb:
> So wie alle, die das an einem verregneten Samstag Nachmittag machen
> wollen. :-)

Ist heute schon wieder Sonnabend? ;-)
Vielleicht soll ja noch eine Großanzeige angeschlossen werden und das 
ist bislang nicht verraten worden - wie so oft.
Egal, soll er entscheiden, wie er mag.

von Hans S. (nettworker)


Lesenswert?

Ich will keine fertige Lösung, bei mir hier ist Mittwoch vormittag und 
regnen tuts auch nicht.

Wenn ihr euch auf dem Level unterhalten wollt, gerne, kann ich auch.

Wer lesen kann ist klar im Vorteil! Im Eingangsbeitrag steht der Link zu 
dem Drehzahlmesser den ich nutzen möchte. Ich wollte lediglich wissen, 
wie man so ein Signal auswerten kann.
Umrechnen und seriell oder auf einem Display ausgeben kann ich mir den 
Kram selbst.

Wenn ihr ne Frage zu Visual Basic .Net habt, fragt mich bitte nicht. Ich 
kann diese Leute die irgendwas damit an einem verregneten Mittwoch 
Nachmittag machen wollen nicht ab. Die wollen immer alles fertig haben.

: Bearbeitet durch User
von Chefkoch (Gast)


Lesenswert?

>100800 Umdrehungen

nehme mal an pro Minute,
und zweifle gleichzeitig, dass einem Motor das gefällt.

von m.n. (Gast)


Lesenswert?

Hans S. schrieb:
> Ich wollte lediglich wissen, wie man so ein Signal auswerten kann.

Und das haben wir Dir mitgeteilt.
Daß es bei Dir regnet, tur mir aufrichtig Leid :-(

von Karl H. (kbuchegg)


Lesenswert?

Hans S. schrieb:

> Wenn ihr ne Frage zu Visual Basic .Net habt, fragt mich bitte nicht. Ich
> kann diese Leute die irgendwas damit an einem verregneten Mittwoch
> Nachmittag machen wollen nicht ab. Die wollen immer alles fertig haben.

Brauchst keine Sorge haben.
Die hier regelmässig Postenden sind durchaus in der Lage eigenständig 
aus der mit pulsIn gemessenen Pusldauer auf die Drehzahl umzurechnen 
ohne zuerst einen VB.Net Wissenden befragen zu müssen.

: Bearbeitet durch User
von Hans S. (nettworker)


Lesenswert?

OK, back to Normallevel..... :)

@chefkoch
Das wäre das absolute Maximum, was rechnerisch/technisch an Drehzahl 
geht.
In der Regel sind es Motoren mit max 4000kv an 3 oder 6 Zellen, die 
Motoren mit 12 zelligen Akkus haben in der Regel maximal 600kv.

@Karl Heinz
Es soll schon mal den Fall gegeben haben, wo man mit einer Windows 
Programmierumgebung ein Konfigurationstool programmiert hat, das dann 
per Bluetooth die config an den Arduino übergeben hat. Hab ich selbst im 
Bau....

Über die pulseIn bekomm ich doch die Impulslänge, also den Zwischenraum 
zwischen den Rechtecken des Signals. Sind die nicht bei gleichbleibender 
Drehzahl idealerweise immer gleich lang?

von Karl H. (kbuchegg)


Lesenswert?

Hans S. schrieb:

> Über die pulseIn bekomm ich doch die Impulslänge, also den Zwischenraum
> zwischen den Rechtecken des Signals.

Du hast auf einen Sensor verlinkt.
Auf der dortigen Web-Seite gibt es ein Video.
In dem Video wird ein Oszi-Bild gezeigt, wie sich das Signal bei 
wechselnder Drehzahl des Motors verhält.
Schon mal angeschaut?`

> Sind die nicht bei gleichbleibender
> Drehzahl idealerweise immer gleich lang?
Natürlich sind die bei gleichbleibender Drehzahl idealerweise gleich 
lang. Das ist doch überhaupt nicht die Frage. Die Frage ist doch: wie 
verhält sich die Pulslänge (bzw. Länge der Pausen zwischen den Pulsen) 
bei wechselnder Drehzahl! Bzw. welcher Zusammenhang besteht zwischen der 
Pulslänge und der Anzahl der Pulse pro Zeiteinheit (und damit der 
Drehzahl) und welche Eigenschaften muss das Signal dafür haben.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Hans S. schrieb:

> Es soll schon mal den Fall gegeben haben, wo man mit einer Windows
> Programmierumgebung ein Konfigurationstool programmiert hat, das dann
> per Bluetooth die config an den Arduino übergeben hat. Hab ich selbst im
> Bau....

und?
würde mich nur beeindrucken, wenn du sowohl auf PC Seite als auch auf 
Arduino Seite die Bluetoothansteuerung komplett selbst machst. Inklusive 
Protokollstapel und Profile.

: Bearbeitet durch User
von Hans S. (nettworker)


Lesenswert?

Ich glaub, ich hab mich verrannt.

Ich krieg den zeitlichen Zusammenhang zwischen dem Durchlaufen der void 
loop und dem Abfragen der pulseIn nicht gebacken.

pulsIn gibt ja den Länge des Impulses zurück, wenn das Signal von HIGH 
auf LOW geht.
Was ist denn jetzt schneller, die Wiederholung der void loop  oder das 
nächste Auftreten eines Impulswechsels.

Setz ich da nicht besser nen Interrupt und zähle da einfach ne Variable 
hoch?

Ich muss ja die Impulse zählen, die Länge ist für mich uninteressant.
Über die Anzahl der Impulse und die Anzahl der Motorpole kann ich mir 
die Drehzahl ja errechnen.
So ist auch die Funktionsweise von Datenloggern, die im Modell die Daten 
loggen oder per Telemetrie an den Sender schicken.

von Karl H. (kbuchegg)


Lesenswert?

Hans S. schrieb:

> pulsIn gibt ja den Länge des Impulses zurück, wenn das Signal von HIGH
> auf LOW geht.

Nein.
Lies noch mal die Doku, was pulsIn wirklich macht.

http://arduino.cc/en/pmwiki.php?n=Reference/PulseIn

> Was ist denn jetzt schneller, die Wiederholung der void loop oder das nächste 
Auftreten eines Impulswechsels.

Interessiert kein Schwein. Selbst wenn du mal einen Puls verpasst, 
ändert der Motor seine Drehzahl in 100µs nicht wesentlich.

> Ich muss ja die Impulse zählen

Kann man  natürlich auch machen. Das Grundgerüst dafür steht ja schon 
weiter oben.

: 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.