Forum: Mikrocontroller und Digitale Elektronik Poti während der Fahrt auslesen gibt schwankenden Werte


von Kolja (Gast)


Lesenswert?

Hallo

Ich bin etwas verwundert über das Ergebnis meiner ersten Messungen.

Aufbau:
altes Servo, ohne Elektronik wird vom µC angesteuert,
Positionsbestimmung über ein RDC80 (Poti)

alte Vorgehensweise:
der Motor wurde für 5ms an, dann für 10ms ausgeschaltet
und jetzt das Poti analog ausgelesen.
Die Messwerte waren auch voll plausibel, nämlich immer größer werdend.

Jetzt würde ich den Motor gerne mit einer echten PWM betreiben.

neue Vorgehensweise:
Auszug aus dem Code
1
String nachricht = "Zeit Position\n";
2
    while (1)
3
    {
4
      ist_position = analogRead(adc);
5
      
6
      nachricht += millis();
7
      nachricht += " ";
8
      nachricht += ist_position;
9
      nachricht += "\n";
10
11
      if ( abs(soll_position - ist_position) > 5)
12
      {
13
         analogWrite(servo, PWM1);
14
         yield();
15
      }
16
      else
17
      {
18
        analogWrite(servo, 0);
19
        Serial.print(" Soll Position: "); Serial.print(soll_position);
20
        Serial.print(" Ist Position: ");  Serial.println(ist_position);
21
        return;
22
      }
23
    }

Somit wird das Poti jetzt während der Fahrt ausgelesen und es gibt sehr 
unschöne Messergebnisse:

-3  230
-5  225
10  235
2  237
1  238
3  241
-4  237
-4  233
0  233
8  241
1  242
0  242
2  244
-4  240
-5  235
11  246
0  246
0  246
4  250


Wobei die erste Spalte die Zeit (millis) ist.

Warum ist das so?
Und vor allem, wie kann ich dem entgegen wirken?

Danke und Gruß Kolja

von c r (Gast)


Lesenswert?

Bring doch erstmal deine Debugging-Ausgabe in Ordnung. millis() sollte 
eigentlich keine negativen Werte annehmen können, also stimmt da 
schonmal was nicht.

Und wenn es um Arduinos geht, solltest du das vll. erwähnen.

von Kolja (Gast)


Lesenswert?

Sorry für die Verwirrung:

Es handelt sich um einen ESP8266,
welcher mit der Arduino IDE programmiert wird.

Die negativen Werte kann ich nicht erklären.
Es sollten immer die Zeiten zwischen den Messungen sein.

Hier nochmal ein Ausschnitt:

Messung  Zeit  millis()  Position
900  4  28782534  263
901  4  28782538  264
902  4  28782542  263
903  5  28782547  257
904  4  28782551  252
905  4  28782555  267
906  4  28782559  267
907  4  28782563  269
908  4  28782567  270
909  4  28782571  267
910  5  28782576  263
911  4  28782580  256
912  4  28782584  273
913  4  28782588  274
914  4  28782592  274
915  4  28782596  273
916  5  28782601  269
917  4  28782605  264
918  4  28782609  277
919  4  28782613  278
920  4  28782617  278

Danke für den Hinweis!

von Kolja (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal eine grafische Auswertung.

von ui (Gast)


Lesenswert?

wo ist jetzt das problem?

von Kolja (Gast)


Lesenswert?

Das die ausgelesenen Werte so schwanken.

von Anon Y. (avion23)


Lesenswert?

Kolja schrieb:
> Jetzt würde ich den Motor gerne mit einer echten PWM betreiben.

Einstrahlung? Schwankende Masse? Probier mal 1uF über das Poti.

von Kolja (Gast)


Lesenswert?

Mache ich heute Abend, danke!

Kann es generell mit der PWM zusammenhängen?

von c r (Gast)


Lesenswert?

Kolja schrieb:
> Kann es generell mit der PWM zusammenhängen?

Ja, und da es laut deiner Aussage die einzige Veränderung ist schon 2 
mal Ja.

von dunno.. (Gast)


Lesenswert?

Kolja schrieb:
> Mache ich heute Abend, danke!
>
> Kann es generell mit der PWM zusammenhängen?

Auch. Wir kennen ja weder die schaltung noch den aufbau. Aber so ein 
drahtverhau auf dem steckbrett, da kann man sich schon ne menge dreck 
eifangen, und die pwm sowie der rf teil des esps sind schöne quellen für 
sowas..

von Kolja (Gast)


Lesenswert?

dunno.. schrieb:
> der rf teil des esps

Was ist der RF?

von Stefan F. (Gast)


Lesenswert?

RF = Radio-Frequency

Also der Teil, der die Antenne beim Senden ansteuert.

von Kolja (Gast)



Lesenswert?

Danke

Hier mal ein Bild von den alten Messungen.

Der Code war in etwa so:
1
    while (1)
2
    {
3
      ist_position = analogRead(adc);
4
      if ( abs(soll_position - ist_position) > 5)
5
      {
6
                digitalWrite(servo, HIGH);
7
                delay(5);   
8
                digitalWrite(servo, LOW);
9
                delay(15);
10
        yield();
11
        Serial.print(" Soll Position: "); Serial.print(soll_position);
12
        Serial.print(" Ist Position: ");  Serial.println(ist_position);
13
14
      }

von Nop (Gast)


Lesenswert?

Wenn man sich im ersten Plot mal die Stellen der blauen Kurve ansieht, 
wo die PWM eng ist, dann ist da auch das Gezitter der orangen Kurve eng 
beisammen (zeitlich). Und wo die blaue Kurve mit niedrigerer Frequenz 
taktet, sind die Wackler der orangen auch weiter auseinander (zeitlich). 
Das sieht nach einem Zusammenhang aus.

von Michael U. (amiga)


Lesenswert?

Hallo,
1
      if ( abs(soll_position - ist_position) > 5)
2
      {
3
         analogWrite(servo, PWM1);
4
         yield();
5
      }

Du initialisiert hier jedesmal die PWM neu, die läuft aber nach 
analogWrite() alleine weiter bis analogWrite(servo, 0);

Ich glaube nicht, daß das vom Laufzeitverhalten so günstig ist.
Das yield() ist hier meiner Meinung nach überflüssig, es ist keine 
blockierende Funktion im Spiel, die die ESP-internen Routinen nicht zum 
Zuge kommen lassen.

Gruß aus Berlin
Michael

von Kolja (Gast)


Angehängte Dateien:

Lesenswert?

dunno.. schrieb:
> Wir kennen ja weder die schaltung noch den aufbau.

Ist auf einer Lochrasterplatine aufgelötet
und war es auch bei den ersten Versuchen.

Anon Y. schrieb:
> Einstrahlung? Schwankende Masse? Probier mal 1uF über das Poti.

Einen 1µF Kondensator habe ich gefunden.
Elko oder Keramik ?
Und dann zwischen A0 und GND?

Nop schrieb:
> Das sieht nach einem Zusammenhang aus.

Hab mal einen Ausschnitt vergrößert.
Irgendwie ist da schon eine Regelmäßigkeit zu erkennen.
Aber die blaue Kurve ist ja nicht die PWM,
sondern die Zeit zwischen den Messungen (rechte Y-Achse)

Michael U. schrieb:
> Ich glaube nicht, daß das vom Laufzeitverhalten so günstig ist.

Kannst du das genauer beschreiben?


Danke und Gruß Kolja

von Kolja L. (kolja82)


Lesenswert?

Keiner?

von Eric B. (beric)


Lesenswert?

Kolja schrieb:
> Irgendwie ist da schon eine Regelmäßigkeit zu erkennen.
> Aber die blaue Kurve ist ja nicht die PWM,
> sondern die Zeit zwischen den Messungen (rechte Y-Achse)

Dann mach doch die Zeit zwischen den Messungen konstant:
Timer benutzen statt delay()

von Kolja (Gast)


Lesenswert?

Es gibt kein delay in dem Code,
die Messungen werden bei jedem Durchlauf der Schleife durchgeführt.

Und die Zeit dazwischen ist entweder 4 oder 5 ms.
Viel genauer geht es doch nicht.

Wenn ich einen Timer mit millis() benutzen würde,
kann die Zeit doch auch um eine Millisekunde schwanken.

Wobei das in beiden Fällen ja gerundete Werte sind.
Die 4ms können ja z.B 4,49ms sein und die 5ms 4,51ms.

von Kurt B. (kurt-b)


Lesenswert?

Kolja schrieb:

>
> Somit wird das Poti jetzt während der Fahrt ausgelesen und es gibt sehr
> unschöne Messergebnisse:

Leg entweder eine eigene Masseleitung zum Motor oder versuche die 
Auslesezeit dahin zu bekommen wo der Motor keinen Strom zieht/liefert.

 Kurt

von Einer K. (Gast)


Lesenswert?

Kolja schrieb:
> dunno.. schrieb:
>> Wir kennen ja weder die schaltung noch den aufbau.
>
> Ist auf einer Lochrasterplatine aufgelötet

Meister!

Du hältst geheim, wo du das Poti angeschlossen hast.
Zappelt die Spannung am Poti, zappeln auch deine Messwerte.

von Kolja (Gast)


Angehängte Dateien:

Lesenswert?

Schon längst überfällig, hier der Schaltplan.

Kurt B. schrieb:
> Leg entweder eine eigene Masseleitung zum Motor oder versuche die
> Auslesezeit dahin zu bekommen wo der Motor keinen Strom zieht/liefert.

Eigene Masseleitung hat der Motor.
Aber wie bekomme ich die Messung des ADC mit der PWM gekoppelt?

Arduino F. schrieb:
> Du hältst geheim, wo du das Poti angeschlossen hast.

Ja, hat Recht.

von Kolja (Gast)


Lesenswert?

Edit:

Ein Unterschied zum Schaltplan:
Die Spannung kommt nicht aus zwei Akkus,
sondern aus einem 5V Netzteil,
welches an den USB Port der NodeMCU angeschlossen ist.
Der Motor wird dann über Vin gespeist.

von Anon Y. (avion23)


Lesenswert?

Kolja schrieb:
> Einen 1µF Kondensator habe ich gefunden.
> Elko oder Keramik ?
> Und dann zwischen A0 und GND?

Egal und direkt am ESP.

Es ist sehr schwierig dir die Konzepte in einem Forenbeitrag zu 
erklären. Ganz allgemein: Deine Spannungsquelle darf keinen 
Innenwiderstand haben weil du sonst Schwankungen hast die sich bei 
schwankenden Lasten auf deine Messung durch schlagen.
Meßschaltung und Leistungsschaltung dürfen nicht den selben Massepfad 
haben.

von Kolja (Gast)


Lesenswert?

Edit 2:

Es fehlt auch der Transistor zwischen Vin und A0.

von Einer K. (Gast)


Lesenswert?

Ich sehe weiterhin kein Poti.
Und, was da alles an A0 angeschlossen ist, ist mir ein Rätsel!

von Kolja (Gast)


Lesenswert?

Der RDC80 ist ein doppeltes Poti.
An 1 und 2 sind die Ausgänge angeschlossen.
An 3 und 4 die Spannungsversorgung.

Hier mal die Beschreibung vom VK: 
http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&item=291763838070

von Einer K. (Gast)


Lesenswert?

Kolja schrieb:
> Der RDC80 ist ein doppeltes Poti.

Ah, ja...
Dann sollen 2 der Transistoren  analog Multiplexer spielen....
Von mir aus, wenn es das so tut....

Aber was ich da wirklich vermisse, sind Stabilisierungsmaßnahmen 
jeglicher Art. Mich wundert nicht, dass alle Schwankungen da voll durch 
schlagen.

von Kolja (Gast)


Lesenswert?

Ja, ein mini-Multiplexer sozusagen :-)
Durch den dritten Transistor (nicht eingezeichnet),
würde sich wahrscheinlich schon ein richtiger kleiner Multiplexer 
lohnen.

Es ist aber noch ein Prototyp, sobald ich davon mehr als drei brauche,
muss der Schaltplan wohl erweitert werden.

Arduino F. schrieb:
> Aber was ich da wirklich vermisse, sind Stabilisierungsmaßnahmen
> jeglicher Art.

D.h. 1µF zwischen A0 und GND,
oder noch mehr?

Die NodeMCU hat schon alles zum Stabilisieren des ESP auf dem Board,
wurde hier mal gesagt.

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.