Arduino: DC-Motor beeinflusst Interrupts?!

OP #6850099
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
}
#6850129
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.
#6850172
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.
OP #6850182
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
Angehängte Dateien:
Gast #6850214
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.
Gast #6850230
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.
Gast #6850645
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.
OP #6850775
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
#6850782
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ö.
OP #6850795
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?
#6850803
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren