Forum: Mikrocontroller und Digitale Elektronik Arduino: DC-Motor beeinflusst Interrupts?!


von Patrick F. (snipes04)


Lesenswert?

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
volatile int counter = 0;
4
unsigned int rotation = 0;
5
6
const int currentSenseB = A1;
7
const double currentFactor = 2/3.3; //2A at 3.3V which is 0.909
8
 
9
const int b1_speed = 11;  // Motor Pin A - analog (PWM) -> speed
10
const int b1_direction = 13;  // Motor Pin A - digital -> direction
11
12
const int CW  = HIGH;
13
const int CCW = LOW;
14
15
16
void docount()  // counts from the speed sensor
17
{
18
  counter++;  // increase +1 the counter value
19
}
20
21
void timerIsr()
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
  double currentV = map(analogRead(currentSenseB),0,1024,0,5000); // eigentlich in mV; /1000 zur Skallierung auf V
39
  double currentB = 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
void setup()
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
void loop()
67
{
68
  analogWrite(b1_speed, 80);  // set speed of motor (0-255)
69
  digitalWrite(b1_direction, CW);  // set rotation of motor to Clockwise
70
}

von Uwe (Gast)


Lesenswert?

Schaltplan bitte...

von Sascha W. (sascha-w)


Lesenswert?

da fehlen sicher die Pullup's und so ein offener Eingang nimmt halt 
alles auf.

Sascha

von Falk B. (falk)


Lesenswert?

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.

von N. M. (mani)


Lesenswert?

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.

von Patrick F. (snipes04)


Angehängte Dateien:

Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

Falk B. schrieb:
>> Nutzung von Interrupt-Befehlen realisieren.
>
> Die gibt es nicht. Bestenfalls einen externen Interrupt.

Natürlich kann man einen Interrupt per Software anspringen.
https://de.wikipedia.org/wiki/Software-Interrupt

von Falk B. (falk)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wurde das nicht vor kurzem (in Version 10) geändert?

Das würde bedeuten, dass sich da etwas noch nicht rumgesprochen hat.
https://www.arduino.cc/reference/de/language/variables/data-types/double/

von EAF (Gast)


Lesenswert?

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.

von Patrick F. (snipes04)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Patrick F. (snipes04)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

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?

von Patrick F. (snipes04)


Lesenswert?

Danke, verstanden!
Werde es morgen mal testen und feedback geben.

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.