Zimt Creme
05.04.2011, 23:07
Hallo Forum,
ich versuche derzeit die Drehzahl von kleinen Elektromotoren (~18.000rpm) mithilfe einem Sensor (Überreste eines Fahrradtachos) und einem Arduino Uno zu messen.
Der Sensor liefert mir dabei auf A0 (5V Eingang mit 1024er Auflösung) Werte, die je nach Stellung der Motorachse (also der Stellung der "Sensorteile" zueinander*) zwischen 0 und 200-350 wechseln.
Schwingung zwischen 200-350 -> Sprung auf 0 -> bleibt auf 0 -> steigt langsam wieder an. (siehe Bild).
Ich wollte jetzt abhängig von diesem Wert eine Variable auf 0 oder 1 setzen.
0 bei Werten = 0
1 bei Werten >=1
Bei jedem 2. Wechsel dieser Variablen hätte ich also eine Umdrehung.
programmcode:
void setup() {
Serial.begin(9600);
pinMode(A0,INPUT);
}
long vV; //Spannung an A0
int vN = 0; //Umdrehungen
int vCn = 0; //Variable ob vV auf 0 oder über xx (neuer wert)
int vCa; //Variable ob vV auf 0 oder über xx (alter wert)
void loop() {
vCa = vCn; // "alter Wert" = letzter "neuer Wert"
vV = analogRead(A0); //Spannung auslesen
delayMicroseconds(100);
if (vV == 0) //
{
vCn = 0;
}
if (vV >= 100) // Spannung auf 0 oder drüber?
{
vCn = 1; //
}
if (vCn != vCa) // Wenn Spannung von 0 oder auf 0 gewechselt hat...
{
vN++; //...eine Umdrehung hochzählen
Serial.println(vN);
}
}
Beobachtungen:
Wenn ich die Variable auf 1 setze, sobald ich Werte über 0 messe, werden Umdrehungen gezählt obwohl nichts dreht.
Setze ich die Variable auf 1 ab Werten über 100, kann ich bei langsamer Motordrehung (~30rpm) die Drehzahl messen.
Sobald der Motor mit ~15.000rpm drehen lasse, werden Umdrehungen gezählt, auch wenn der Motor später wieder ausgemacht wird.
Setze ich die Variable auf 1 ab Werten über 200, wird bis 2 gezählt. Danach passiert nichts mehr.
Fragen:
Was für ein Sensor hab ich da überhaupt?
2 Kabel gehen in "Teil 1" (ist normalerweise an der Fahrradgabel befestigt). "Teil2 scheint ein normaler Dauermagnet (wird an einer Speiche befestigt).
Magnetschalter der den Stromkreis schließt, sodass die Spannung zwischen A0 und GND auf 0 fällt? Ganz ohne Anschlüße am Board werden auch Werte un 200-350 ausgegeben.
Warum wird teilweise die Drehzahl hochgezählt, ohne das die Sensoren sich bewegen?
Schwingt da was in den Leitungen oder im Board?
Brauch ich vllt mehr Elektronik (Kondensator, Widerstände etc.?). Darf ich den Sensor nicht zwischen GND und A0 betreiben?
Sind Sensor oder Board für so schnelle Wechsel ungeeignet?
Oder hab ich einfach falsch programmiert?
Hat jemand sonstige Kritik zu äussern, oder Ratschläge?
Häng an der Stelle nun seit Tagen fest un komm allein nichmehr weiter.
N Gedankenanstoß der mich wenigstens bis zum nächsten Problem weiterbringt wär super.
Vielen Dank
Zimt
P.s: da ich mich nicht entscheiden kann ob das Problem in Sensor/Controller oder Software liegt, war ich nich sicher wo das Thema hingehört. Wenns also wo anders besser passt, bitte verschieben.
*Anhang: Der Magnet ist nicht mittig auf der Achse sondern etwa 1cm daneben. Bewegt sich bei einer Motorumdrehung also eine zeit lang vor dem Sensor und eine Zeit lang daneben (ausserhalb der Reichweite?)
ich versuche derzeit die Drehzahl von kleinen Elektromotoren (~18.000rpm) mithilfe einem Sensor (Überreste eines Fahrradtachos) und einem Arduino Uno zu messen.
Der Sensor liefert mir dabei auf A0 (5V Eingang mit 1024er Auflösung) Werte, die je nach Stellung der Motorachse (also der Stellung der "Sensorteile" zueinander*) zwischen 0 und 200-350 wechseln.
Schwingung zwischen 200-350 -> Sprung auf 0 -> bleibt auf 0 -> steigt langsam wieder an. (siehe Bild).
Ich wollte jetzt abhängig von diesem Wert eine Variable auf 0 oder 1 setzen.
0 bei Werten = 0
1 bei Werten >=1
Bei jedem 2. Wechsel dieser Variablen hätte ich also eine Umdrehung.
programmcode:
void setup() {
Serial.begin(9600);
pinMode(A0,INPUT);
}
long vV; //Spannung an A0
int vN = 0; //Umdrehungen
int vCn = 0; //Variable ob vV auf 0 oder über xx (neuer wert)
int vCa; //Variable ob vV auf 0 oder über xx (alter wert)
void loop() {
vCa = vCn; // "alter Wert" = letzter "neuer Wert"
vV = analogRead(A0); //Spannung auslesen
delayMicroseconds(100);
if (vV == 0) //
{
vCn = 0;
}
if (vV >= 100) // Spannung auf 0 oder drüber?
{
vCn = 1; //
}
if (vCn != vCa) // Wenn Spannung von 0 oder auf 0 gewechselt hat...
{
vN++; //...eine Umdrehung hochzählen
Serial.println(vN);
}
}
Beobachtungen:
Wenn ich die Variable auf 1 setze, sobald ich Werte über 0 messe, werden Umdrehungen gezählt obwohl nichts dreht.
Setze ich die Variable auf 1 ab Werten über 100, kann ich bei langsamer Motordrehung (~30rpm) die Drehzahl messen.
Sobald der Motor mit ~15.000rpm drehen lasse, werden Umdrehungen gezählt, auch wenn der Motor später wieder ausgemacht wird.
Setze ich die Variable auf 1 ab Werten über 200, wird bis 2 gezählt. Danach passiert nichts mehr.
Fragen:
Was für ein Sensor hab ich da überhaupt?
2 Kabel gehen in "Teil 1" (ist normalerweise an der Fahrradgabel befestigt). "Teil2 scheint ein normaler Dauermagnet (wird an einer Speiche befestigt).
Magnetschalter der den Stromkreis schließt, sodass die Spannung zwischen A0 und GND auf 0 fällt? Ganz ohne Anschlüße am Board werden auch Werte un 200-350 ausgegeben.
Warum wird teilweise die Drehzahl hochgezählt, ohne das die Sensoren sich bewegen?
Schwingt da was in den Leitungen oder im Board?
Brauch ich vllt mehr Elektronik (Kondensator, Widerstände etc.?). Darf ich den Sensor nicht zwischen GND und A0 betreiben?
Sind Sensor oder Board für so schnelle Wechsel ungeeignet?
Oder hab ich einfach falsch programmiert?
Hat jemand sonstige Kritik zu äussern, oder Ratschläge?
Häng an der Stelle nun seit Tagen fest un komm allein nichmehr weiter.
N Gedankenanstoß der mich wenigstens bis zum nächsten Problem weiterbringt wär super.
Vielen Dank
Zimt
P.s: da ich mich nicht entscheiden kann ob das Problem in Sensor/Controller oder Software liegt, war ich nich sicher wo das Thema hingehört. Wenns also wo anders besser passt, bitte verschieben.
*Anhang: Der Magnet ist nicht mittig auf der Achse sondern etwa 1cm daneben. Bewegt sich bei einer Motorumdrehung also eine zeit lang vor dem Sensor und eine Zeit lang daneben (ausserhalb der Reichweite?)