Guten Tag zusammen,
ich möchte mit eine Drehzahlerfassung von einem einfachen DC-Motor unter
Nutzung von Interrupt-Befehlen realisieren. Leider spuckt mir das System
auch ohne Anschluss eines Sensors bereits Werte für "Drehzahl" aus, was
für mich nicht plausibel ist. Die Interrupt-Ports (D2 / D3 bzw.
Interrupt 0 / 1) scheinen wohl irgendwie "Signale" zu erhalten. Der
Ausgegebene Wert (pro Sekunde) variiert stark zw. 0 und 120
(willkürliche Zahlen)...
Hier mein System:
* Arduino Uno Rev3
* Arduino MotorShield Rev3 (gesteckt auf Uno)
* DC-Motor
(https://www.amazon.de/ANGEEK-Stücke-Mini-Motor-Arduino/dp/B07VCMZCCY)
* IR-Sensor
(https://www.amazon.de/gp/product/B0817FM4BJ/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1)
Unten findet ihr den Code.
Zur Verschalung:
Der DC ist an den typischen Ports des Motorshields (B) gesteckt, also
erstmal nichts komplexes.
Bei Hinzunahme des IR-Sensors (VCC -> 5V am Motorshield, GND -> GND am
Motorshield, OUT -> D3 am Motorshield (== Interrupt Port 1)
Folgende Erfahrungen zum Problem konnte ich bisher machen:
bereits ohne Anschluss des IR Sensors:
* Erhöhung der Motorgeschwindigkeit (b1_speed bspw. 80 auf 255)-->
Erhöhung des ausgegebenen Wertes --> Interrupt wird häufiger getriggert
* Belastung des Motors (mit etwas Drehmoment) --> Erhöhung des
ausgegebenen Wertes --> Interrupt wird häufiger getriggert
mit Anschluss des IR-Sensors (ohne Betätigung der Lichtschranke):
* --> Erhöhung des ausgegebenen Wertes --> Interrupt wird häufiger
getriggert
Ich kann einfach nicht verstehen, warum das System an den Ports D2/D3
Signale erkennt...
Besten Dank schon mal!
Viele Grüße,
Snipes04
1
#include<TimerOne.h>
2
3
volatileintcounter=0;
4
unsignedintrotation=0;
5
6
constintcurrentSenseB=A1;
7
constdoublecurrentFactor=2/3.3;//2A at 3.3V which is 0.909
8
9
constintb1_speed=11;// Motor Pin A - analog (PWM) -> speed
10
constintb1_direction=13;// Motor Pin A - digital -> direction
11
12
constintCW=HIGH;
13
constintCCW=LOW;
14
15
16
voiddocount()// counts from the speed sensor
17
{
18
counter++;// increase +1 the counter value
19
}
20
21
voidtimerIsr()
22
{
23
24
25
Timer1.detachInterrupt();//stop the timer
26
Serial.println();
27
Serial.println("Motor Speed: ");
28
29
noInterrupts();
30
rotation=(1*counter/1);// divide by number of holes in Disc
31
interrupts();
32
33
Serial.print(rotation);
34
Serial.print(" Rotation per sec -- current: ");
35
36
// Strommessung
37
noInterrupts();
38
doublecurrentV=map(analogRead(currentSenseB),0,1024,0,5000);// eigentlich in mV; /1000 zur Skallierung auf V
39
doublecurrentB=currentV*currentFactor;// Ergebnis: Strom in A
40
interrupts();
41
42
Serial.print(currentB);
43
Serial.print(" mA");
44
counter=0;// reset counter to zero
45
Timer1.attachInterrupt(timerIsr);//enable the timer
46
47
}
48
49
voidsetup()
50
{
51
Serial.begin(9600);
52
53
pinMode(2,INPUT);// interrupt pin 0
54
pinMode(3,INPUT);// interrupt pin 1
55
56
pinMode(b1_speed,OUTPUT);
57
pinMode(b1_direction,OUTPUT);
58
59
60
Timer1.initialize(1000000);// set timer for 1sec
61
attachInterrupt(digitalPinToInterrupt(3),docount,RISING);// increase counter when speed sensor pin goes High
62
Timer1.attachInterrupt(timerIsr);// enable the timer
63
64
}
65
66
voidloop()
67
{
68
analogWrite(b1_speed,80);// set speed of motor (0-255)
69
digitalWrite(b1_direction,CW);// set rotation of motor to Clockwise
Patrick F. schrieb:> Guten Tag zusammen,>> ich möchte mit eine Drehzahlerfassung von einem einfachen DC-Motor unter> Nutzung von Interrupt-Befehlen realisieren.
Die gibt es nicht. Bestenfalls einen externen Interrupt.
> Leider spuckt mir das System> auch ohne Anschluss eines Sensors bereits Werte für "Drehzahl" aus, was> für mich nicht plausibel ist.
Dein Eingang ist offen, aka floating. Damit zappeln sehr hochohmige
CMOS-Eingänge wild rum. Ein Pull-Down widerstand von vielleicht 10-100k
schafft Abhilfe.
Nebenbei noch die Anmerkung dass Ausgaben über die Serielle nicht in den
Interrupt gehören.
Setz dir ein Bit im Interrupt und Frage dieses Bit in der Main ab. Dann
kannst du dir auch das ganze Zeug mit attach/detach ISR sparen.
Und double ist auch sowas von unnötig. Lass es in mV und mA/uA und
rechne damit weiter.
Dann reicht dir ein uint16 aus und die Verarbeitungszeit schrumpft gegen
0.
Uwe schrieb:> Schaltplan bitte...
s. Anhang
(Arduino Motor Shield Rev3 auf Arduino Uno Rev3 Board gesteckt.
Letzterer ist mit dem PC zwecks Datenübertragung und Bestimmung
verbunden)
Wie gesagt, auch ohne Anschluss von dem IR Sensor bekomme ich Werte
ausgespuckt...
Bsp:
10:49:28.934 -> Motor Speed:
10:49:28.968 -> 9 Rotation per sec -- current: 269.09 mA
10:49:29.942 -> Motor Speed:
10:49:29.975 -> 21 Rotation per sec -- current: 224.85 mA
10:49:30.940 -> Motor Speed:
10:49:30.977 -> 51 Rotation per sec -- current: 206.67 mA
10:49:31.931 -> Motor Speed:
10:49:31.969 -> 26 Rotation per sec -- current: 266.06 mA
10:49:32.955 -> Motor Speed:
10:49:32.955 -> 83 Rotation per sec -- current: 183.03 mA
10:49:33.945 -> Motor Speed:
10:49:33.983 -> 49 Rotation per sec -- current: 203.64 mA
10:49:34.963 -> Motor Speed:
10:49:34.963 -> 39 Rotation per sec -- current: 203.64 mA
10:49:35.950 -> Motor Speed:
10:49:35.983 -> 5 Rotation per sec -- current: 245.45 mA
N. M. schrieb:> Nebenbei noch die Anmerkung dass Ausgaben über die Serielle nicht in den> Interrupt gehören.
Siehe Interrupt.
> Und double ist auch sowas von unnötig. Lass es in mV und mA/uA und> rechne damit weiter.
Siehe Festkommaarithmetik
Patrick F. schrieb:> ohne Anschluss des IR Sensors:
ist der Eingang offen, du hast nicht mal pull up aktiviert (und auch der
wäre recht hochohmig und ist leicht störbar)
Patrick F. schrieb:> pinMode(2, INPUT); // interrupt pin 0
Also kein Wunder.
EMV ist ein wichtiger Posten bei der Elektronikentwicklung und wird beim
legoähnlichen Shield-Zusammenstecken nicht beachtet.
Aber selbst wenn deine BEIDEN Gabellichtschranken angeschlossen sind
(hoffentlich alle 3 Kontakte korrekt) bekommst du Störungen.
Man behebt sie an der Quelle, am Motor, durch einen Filter
1
+--47uH--+---+---+
2
| | | |
3
| | 47nF |
4
----------------+ | | |
5
verdrillte Zuleitung 47nF +--(M)
6
----------------+ | | |
7
| | 47nF |
8
| | | |
9
+--47uH--+---+---+
und hält alle Zuleitungen (zum Motor, zur einen Gabellichtschranke, zur
anderen Gabellichtschranke) weit voreinander entfernt aber die Adern
nahe beieinander (z.B. verdrillt oder Doppellitze oder Flachbandkabel),
legt keine grossen Leiterschleiden.
Patrick F. schrieb:> Wie gesagt, auch ohne Anschluss von dem IR Sensor bekomme ich Werte> ausgespuckt...
Und wie gesagt reagieren offene Eingänge auf alles Mögliche (z.B.
Radiowellen, Handystrahlung).
Falk B. schrieb:>> Und double ist auch sowas von unnötig. Lass es in mV und mA/uA und>> rechne damit weiter.>> Siehe Festkommaarithmetik
Double gibt es bei den AVR-Arduino sowieso nur auf dem Papier. Auch
double Variablen besitzen nur 4 Byte und damit 23 signifikante Bits.
Bei Float-Multiplikationen kann man die voll ausschöpfen, was bei
Festkommaarithmetik, trotz der höheren Anzahl signifikanter Bits (bei 32
oder mehr) i.A. nicht der Fall ist. Bei Additionen sieht das anders aus.
Wolfgang schrieb:> Double gibt es bei den AVR-Arduino sowieso nur auf dem Papier. Auch> double Variablen besitzen nur 4 Byte und damit 23 signifikante Bits.
Wurde das nicht vor kurzem (in Version 10) geändert?
Wolfgang schrieb:> Das würde bedeuten, dass sich da etwas noch nicht rumgesprochen hat.> https://www.arduino.cc/reference/de/language/variables/data-types/double/
? Überzogene Erwartungshaltung ?
Arduino ist noch nicht beim Gcc 10
Zudem ist double nicht per default aktiviert.
Wird auch von den ganzen(?) Libc Funktionen nicht unterstützt.
Rechnen kann man damit, aber das Rein und Raus wird dann schon deutlich
schwierig.
MaWin schrieb:> Patrick F. schrieb:>> ohne Anschluss des IR Sensors:>> ist der Eingang offen, du hast nicht mal pull up aktiviert (und auch der> wäre recht hochohmig und ist leicht störbar)>> Patrick F. schrieb:>> pinMode(2, INPUT); // interrupt pin 0>> Also kein Wunder.
--> folglich müsste ich hier das ganze auf
1
pinMode(2,INPUT_PULLUP);// interrupt pin 0
ändern?
> EMV ist ein wichtiger Posten bei der Elektronikentwicklung und wird beim> legoähnlichen Shield-Zusammenstecken nicht beachtet.>> Aber selbst wenn deine BEIDEN Gabellichtschranken angeschlossen sind> (hoffentlich alle 3 Kontakte korrekt) bekommst du Störungen.
Du sprichst von zwei Gabellichtschranken? Ich plane lediglich eine
Lichtschranke einzusetzen. Aber das macht wohl hier keinen Unterschied,
richtig?
> Man behebt sie an der Quelle, am Motor, durch einen Filter>
1
> +--47uH--+---+---+
2
> | | | |
3
> | | 47nF |
4
> ----------------+ | | |
5
> verdrillte Zuleitung 47nF +--(M)
6
> ----------------+ | | |
7
> | | 47nF |
8
> | | | |
9
> +--47uH--+---+---+
10
>
> und hält alle Zuleitungen (zum Motor, zur einen Gabellichtschranke, zur> anderen Gabellichtschranke) weit voreinander entfernt aber die Adern> nahe beieinander (z.B. verdrillt oder Doppellitze oder Flachbandkabel),> legt keine grossen Leiterschleiden.
Danke für den Hinweis an dieser Stelle. Aus der Grafik entnehme ich,
dass hier ein 3 phasiger Motor dargestellt ist? Wenn ja, dann müsst ich
zwei der 47nF streichen, oder?
Viele Grüße,
snipes04
Patrick F. schrieb:> --> folglich müsste ich hier das ganze aufpinMode(2, INPUT_PULLUP); //> interrupt pin 0> ändern?
Ja.
>> Aber selbst wenn deine BEIDEN Gabellichtschranken angeschlossen sind>> (hoffentlich alle 3 Kontakte korrekt) bekommst du Störungen.>> Du sprichst von zwei Gabellichtschranken? Ich plane lediglich eine> Lichtschranke einzusetzen. Aber das macht wohl hier keinen Unterschied,> richtig?
Ja.
>>> Man behebt sie an der Quelle, am Motor, durch einen Filter>>> +--47uH--+---+---+>> | | | |>> | | 47nF |>> ----------------+ | | |>> verdrillte Zuleitung 47nF +--(M)>> ----------------+ | | |>> | | 47nF |>> | | | |>> +--47uH--+---+---+>>>> und hält alle Zuleitungen (zum Motor, zur einen Gabellichtschranke, zur>> anderen Gabellichtschranke) weit voreinander entfernt aber die Adern>> nahe beieinander (z.B. verdrillt oder Doppellitze oder Flachbandkabel),>> legt keine grossen Leiterschleiden.>> Danke für den Hinweis an dieser Stelle. Aus der Grafik entnehme ich,> dass hier ein 3 phasiger Motor dargestellt ist?
Nö. Das ist ein Gleichstrommotor mit 2 Anschlüssen (oben und unten) und
Gehäuse (Mitte).
> Wenn ja, dann müsst ich> zwei der 47nF streichen, oder?
Nö.
Danke für die Bestätigungen. noch eine Frage zum Schaubild:
Falk B. schrieb:>>> Man behebt sie an der Quelle, am Motor, durch einen Filter>>> +--47uH--+---+---+>>> | | | |>>> | | 47nF |>>> ----------------+ | | |>>> verdrillte Zuleitung 47nF +--(M)>>> ----------------+ | | |>>> | | 47nF |>>> | | | |>>> +--47uH--+---+---+>>>>>> und hält alle Zuleitungen (zum Motor, zur einen Gabellichtschranke, zur>>> anderen Gabellichtschranke) weit voreinander entfernt aber die Adern>>> nahe beieinander (z.B. verdrillt oder Doppellitze oder Flachbandkabel),>>> legt keine grossen Leiterschleiden.>>>> Danke für den Hinweis an dieser Stelle. Aus der Grafik entnehme ich,>> dass hier ein 3 phasiger Motor dargestellt ist?>> Nö. Das ist ein Gleichstrommotor mit 2 Anschlüssen (oben und unten) und> Gehäuse (Mitte).>>> Wenn ja, dann müsst ich>> zwei der 47nF streichen, oder?>> Nö.
Hmm dann bin ich immer noch etwas irritiert über die Zeile, in der
"verdrillte Leitung" steht. Hier führt nach meiner Interpretation eine
dritte Leitung zum Motor (M). Magst du dies noch eben erklären?
Patrick F. schrieb:> Hmm dann bin ich immer noch etwas irritiert über die Zeile, in der> "verdrillte Leitung" steht. Hier führt nach meiner Interpretation eine> dritte Leitung zum Motor (M). Magst du dies noch eben erklären?>>>> Man behebt sie an der Quelle, am Motor, durch einen Filter
+--47uH--+---+---+ Anschluß 1
| | | |
| | 47nF |
----------------+ | | |
verdrillte Zuleitung 47nF +--(M) Gehäuse
----------------+ | | |
| | 47nF |
| | | |
+--47uH--+---+---+ Anschluß 2
Der mittlere Knotenpunkt wird elektrisch mit dem metallischen Gehäuse
verbunden, meist direkt angelötet. Dazu braucht man eine dicke Lötspitze
und Leistung. Capice?