Forum: Mikrocontroller und Digitale Elektronik Programm läuft nach jedem vierten Durchlauf einmal falsch


von Egon M. (kpc)


Lesenswert?

Hallo,
mit der angehängte Programmsequenz soll ein Gleichstrommotor testweise 
einige Grad vor- und rückwärts drehen. Das funktioniert auch ganz gut, 
aber regelmäßig nach vier Rückwärtsschritten macht der Motor eine volle 
Vorwärtsdrehung - ohne Kommando vom Kontroller.

Ich habe eine LED angebracht, die leuchtet, wenn der Controller das 
Kommando zum Vorwärtsdrehen gibt. Bei der unerlaubten Drehung leuchtet 
die LED die übliche Dauer, geht dann aus und der Motor dreht weiter. 
Kurz vor Ablauf der zu langen Drehung geht die LED nochmal kurz an.

Hier die Programmsequenz (es handelt sich um einen Arduino, der mittels 
Adafruit-Code einen kleinen Gleichstrommotor ansteuert):
1
void loop() {
2
  
3
   myMotor->setSpeed(70);      // Geschwindigkeit des Drehens
4
 
5
   digitalWrite(6, HIGH);      // LED signalisiert Drehrichtg
6
   myMotor->run(FORWARD);      // gegen Uhrzeiger   
7
   delay(800);                 // Dauer des Drehens
8
   digitalWrite(6, LOW);  
9
10
  myMotor->run(RELEASE);
11
  delay(3000);
12
  
13
  myMotor->run(BACKWARD);      //  Uhrzeiger
14
  delay(700);
15
 
16
   myMotor->run(RELEASE);
17
  delay(3000);
18
 }

Hat jemand eine Erklärung für das seltsame Verhalten - oder muß man es 
als Spuk einfach hinnehmen?

VG
Egon

von Tom (Gast)


Lesenswert?

Wirklich genau regelmäßig alle 4 Durchgänge?

Welche Motoren benutzt Du?

Versorgst du das Motor-Shield seperat oder über den Jumper vom Arduino?
Wenn letzteres: Welches Netzteil?

Was passiert mit dem Programm ohne angeschlossene Motoren am 
Motor-Shield?


PS: Links auf die Hard- und Software wären nett gewesen:
https://learn.adafruit.com/adafruit-motor-shield/power-requirements
HW: https://github.com/adafruit/Adafruit-Motor-Shield-for-Arduino
SW: 
https://github.com/adafruit/Adafruit-Motor-Shield-library/blob/master/AFMotor.h
https://github.com/adafruit/Adafruit-Motor-Shield-library/blob/master/AFMotor.cpp

von Daniel A. (daniel-a)


Lesenswert?

Ich hab ne neue glaskugel, mal sehen...

Nimm einfach das delay(800) aus der nicht gezegten timer 
interruptrutine, und das Problem verschwindet...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Egon Müller schrieb:
> Hier die Programmsequenz (es handelt sich um einen Arduino, der mittels
> Adafruit-Code einen kleinen Gleichstrommotor ansteuert):
Wie ist "der kleine Gleichstrommotor" an den uC angeschlossen? Ist da 
irgendeine Entstörmaßnahme eingebaut?

> Kurz vor Ablauf der zu langen Drehung geht die LED nochmal kurz an.
Welches kurz, welches lang? Kurz = ?, lang = ?

> aber regelmäßig nach vier Rückwärtsschritten macht der Motor eine volle
> Vorwärtsdrehung - ohne Kommando vom Kontroller.
Wie hast du das festgestellt?
Dann muss der Motor defekt sein., wenn er ohne Spannung einfach 
losläuft. du solltest diese Zeit unbedingt verlängern, dann hast du ein 
Perpetuum Mobile...

> oder muß man es als Spuk einfach hinnehmen?
Schon der Gedanke an sich ist doch, naja, sagen wir mal "kurios". Ist 
das die Art, wie heute Software geschrieben wird?

von Daniel V. (danvet)


Lesenswert?

Daniel A. schrieb:
> Ich hab ne neue glaskugel, mal sehen...
>
> Nimm einfach das delay(800) aus der nicht gezegten timer
> interruptrutine, und das Problem verschwindet...

Ich denke auch, dass das Problem woanders liegt als in der gezeigten 
Sequenz.
Was auch zu denken gibt:
In dieser "Loop" hast du ja fast 7 Sekunden keine Möglichkeit irgendwas 
anderes zu machen. Da würde ich mir eine andere Lösung wünschen.

von Egon M. (kpc)


Lesenswert?

Hallo,
ich möchte nacheinander Eure Fragen beantworten, vielleicht kommt man so 
zu einem Resultat.
..............
Wirklich genau regelmäßig alle 4 Durchgänge?
ja
Welche Motoren benutzt Du?
Servomotor von Pollin, Elektronik ausgebaut
Versorgst du das Motor-Shield seperat oder über den Jumper vom Arduino?
Separat
Wenn letzteres: Welches Netzteil?
einstellbares Netzteil, steht bei 8V (und funktioniert damit)
Was passiert mit dem Programm ohne angeschlossene Motoren am
Motor-Shield?
Läuft weiter (sieht man an der LED).
..................
Ich hab ne neue glaskugel, mal sehen...
Wie jeder weiß, kann man mit einer Glaskugel Verborgenes sehen. Das 
Verborgene muß aber wenigstens existieren. Hier nun ist nichts, nur die 
gezeigte Programmsequenz und sonst nichts (außer natürlich der übliche 
Setupkram nebst Definitionen usw.)
Nimm einfach das delay(800) aus der nicht gezegten timer
interruptrutine, und das Problem verschwindet...
Das delay(800) ist unverzichtbar, es definiert, wie lange sich der Motor 
drehen soll
..........................

Wie ist "der kleine Gleichstrommotor" an den uC angeschlossen? Ist da
irgendeine Entstörmaßnahme eingebaut?
Ich vermute, er ist als Servo für Flugmodelle gedacht, Maße etwa 4x4x2 
cm.
Entstörung habe ich nicht extra vorgesehen, weil ich hoffe, das 
Adafruit-Shield erledigt das. An Störungen glaube ich nicht, weil der 
unerwünschte Vorgang zu regelmäßig auftritt (ich habe viele Abläufe 
beobachtet).
...........................
Wie hast du das festgestellt?
Dann muss der Motor defekt sein., wenn er ohne Spannung einfach
losläuft. du solltest diese Zeit unbedingt verlängern, dann hast du ein
Perpetuum Mobile...
Die Spannung liegt immer an, es handelt sich ja um einen immer 
wiederholten loop.
.......................

 Die Spannung bzw. den Strom wird dem Motor durch das Adafruit-Shield 
zugeteilt und dieses reagiert auf irgendeinen Port des Arduino.
Im nächsten Schritt müßte ich das Adafruit-Shield vom Arduino lösen und 
die Ports manuell kontrollieren. Ist ziemlich umständlich, deshalb 
wollte ich erst mal fragen, ob an meiner Programmsequenz etwas faul ist.

VG
Egon

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.