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