Nochmal Verstelleinheit

OP #6212209
Hallo,

ich hatte bereits in einem früheren Beitrag eine Frage zur geplanten
Verstelleinheit gestellt.
Dieses Thema habe ich nun lösen können.

Jetzt geht es aber nochmal um das Verfahren der Einheit selbst.

Ich habe dazu folgenden Arduino-Code geschrieben, welcher aber nicht im
Ansatz dies tut, was er soll.

Vorhaben ist folgendes:
Da keine Positionserfassung möglich ist, mache ich eine Referenzfahrt.
Dessen Ergebnis ist die Zeit in der Variable "vvRef100"
Über die Variable "vf" soll der Verfahrweg von 0-100% angegeben werden
können
Die Variable "pos" soll den aktuellen Positionswert enthalten und wenn
der neue rechnerische Positionswert mehr als 500 millis abweicht soll
verfahren werden, bis zum erreichen +- 10 millis des Sollwerts.

Es verfährt der Motor aber bei jeder Vorgabe größer 0 und die Variable
"pos" wird auch nicht verändert, obwohl ich die verfahrene Zeit ja beim
Anhalten einberechne.

Was mache ich falsch?

Variablendeklaration:
unsigned long vvRef100;
unsigned long TvfStart;
unsigned long pos;
signed long pos_rech[3];
int vf = 0;
int vfr = 0;


Loop:
    pos_rech[0] = pos + 500;
    pos_rech[1] = pos - 500;
    pos_rech[2] = ((vvRef100 / 100) * vf);
    pos_rech[3]=(millis() - TvfStart);
    if (pos_rech[0] < pos_rech[2] && vfr == 0) {
      driver.motorAReverse(motorSpeed);
      TvfStart = millis();
      vfr = 1;
    }
    else if (pos_rech[1] > pos_rech[2] && vfr == 0) {
      driver.motorAForward(motorSpeed);
      TvfStart = millis();
      vfr = 2;
    }
    else if (millis() - TvfStart > pos_rech[2] - 10 && millis() -
TvfStart < pos_rech[2] + 10) {
      driver.motorAStop();

      if (vfr = 1) {
        pos = (pos + pos_rech[3]);
      }
      if (vfr = 2) {
        pos = (pos - pos_rech[3]);
      }
      vfr = 0;
      befehl = 0;
      Serial.print("pos_neu ");  Serial.println(pos);
Gast
Es ist so wunderschön, dass jeder hier nun weiß, was du genau vorhast.

Also ran an die Tastatur und mache dir die Mühe zu beschreiben, wie 
deine Verstelleinheit aussieht. Oder setzte einen Link.
OP
Ich verstehe die Argumentation zum Aussehen der Verstelleinheit nicht.
Mir geht es um den Code, warum dieser nicht das tut was ich beschrieben 
habe. Der Motor fährt mit entsprechendem Treiber problemlos.

@crazyhorse:
Ja genau es soll die Position per Zeit mit einem DC-Motor angefahren 
werden.
Hoch präzise muss das ganze nicht sein.

Hier nochmal der Code hoffentlich richtig eingefügt.
1
unsigned long vvRef100;
2
unsigned long TvfStart;
3
unsigned long pos;
4
signed long pos_rech[3];
5
int vf = 0;
6
int vfr = 0;
7

8
void loop(){
9
    pos_rech[0] = pos + 500;
10
    pos_rech[1] = pos - 500;
11
    pos_rech[2] = ((vvRef100 / 100) * vf);
12
    pos_rech[3]=(millis() - TvfStart);
13
    if (pos_rech[0] < pos_rech[2] && vfr == 0) {
14
      driver.motorAReverse(motorSpeed);
15
      TvfStart = millis();
16
      vfr = 1;
17
    }
18
    else if (pos_rech[1] > pos_rech[2] && vfr == 0) {
19
      driver.motorAForward(motorSpeed);
20
      TvfStart = millis();
21
      vfr = 2;
22
    }
23
    else if (millis() - TvfStart > pos_rech[2] - 10 && millis() - TvfStart < pos_rech[2] + 10){
24
      driver.motorAStop();
25

26
      if (vfr = 1) {
27
        pos = (pos + pos_rech[3]);
28
      }
29
      if (vfr = 2) {
30
        pos = (pos - pos_rech[3]);
31
      }
32
      vfr = 0;
33
      befehl = 0;
34
      Serial.print("pos_neu ");  Serial.println(pos);
35
}
Gast
H.Joachim S. schrieb:
> Oder kann man das in der Arduinowelt so schreiben?

Die Arduniowelt ändert nichts an den Vorgaben durch die verwendete 
Programmiersprache.
Und natürlich versteht der GCC das, weil die Schreibweise in C, C++ usw. 
eine zulässige Operation ist. Eben die große Freiheit von C & Co. ...
OP
Habe es mit der korrigierten Abfrage versucht.

Es klappt aber nicht so wie ich es mir vorstelle.

Vorgabewert waren 10%

debug-Werte erhalte ich folgende:

vvRef100 41406
pos_neu 8261

Kann mir jemand sagen, warum beim Wert "pos_neu" das recht exakt 
doppelte vom zu erwartenden Wert raus kommt.

Ich komm hier nicht dahinter.
Gast
Christoph W. schrieb:
> JensM schrieb:
>> Array pos_rech ist 3 Elemente groß.
>> Du benutzt aber 4.
>> Das geht schief.
>
> Ich dachte 0 ... 3 = 4
>
> Lieg ich da falsch?

Es ist richtig. Die Ordinalzahlen 0 ... 3 nummerieren 4 Elemente.

Aber: In einer C-Deklaration eines Arrays steht in den eckigen Klammern, 
die Anzahl_ der Elemente und _nicht die höchste Ordinalzahl (Index). 
Das Ding hat tatsächlich nur 3 Elemente.
Gast
Für meine Begriffe unerwartet, dass der Compiler bei einem expliziten, 
d.h. literalen Index, der zu hoch ist, keinen Fehler oder wenigstens 
eine Warnung ausgibt.
Gast
H.Joachim S. schrieb:
> Warnungen sind doch zum ignorieren da.... :-)

Ach deswegen sind die Warnungen in der Arduino IDE standardmäßig 
deaktiviert. Jetzt verstehe ich es endlich.

Christoph W. schrieb:
> Die Arduino-IDE gibt keine Warnung aus.

Zwei Dumme - ein Gedanke.

Spaß beiseite: Das ist ein ein ganz dummer Fehler, ich kann nicht 
verstehen, warum die Arduino Macher daran immer noch festhalten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.