Forum: Mikrocontroller und Digitale Elektronik negativen Wert v. Poti zu positiven Wert umkehren


von Mario (Gast)


Lesenswert?

Hallöle.

void loop(){
int potiwert=analogRead(Analogpin);
 potiwert=map(potiwert, 0, 1023, -500, 500);

 if (potiwert <= - 1 && potiwert >-500){
potiwert= potiwert*(potiwert)/ potiwert;
Serial.println (potiwert);
delay(1000);}

}

Dieser Code soll für meinen Schrittmotor sein, welcher so dann die 
Drehgeschwindigkeit und die Richtung ändert je nach Potiwert.
Daher das set.Speed ja keine negativen Werte annimmt, habe ich den Code 
so eingerichtet ,dass wenn der Potiwert in den negativen Bereich geht, 
dann die Werte in der if Schleife umgedreht werden.
Im Seriellen-Monitor werden aber weiterhin negative Werte ausgegeben.
Ich habe das dann auch noch mal mit der Wurzel ziehen aus dem potiwert 
versucht also statt geteilt durch den potiwert am Ende die Wurzel aus 
dem potiwert.
Ebenfalls mit keinem Erfolg.
Ich wäre sehr froh wenn mir vieleicht jemand einen Tipp geben könnte was 
ich falsch mache.

M. f. G. Mar.

von spess53 (Gast)


Lesenswert?

Hi

Du willst, das wenn potiwert < 0 dann soll potiwert:=-potiwert werden?

MfG Spess

von Günter N. (turtle64)


Lesenswert?

if (potiwert <= - 1 && potiwert >-500)
wird so nicht funktionieren, && hat höhere Priorität als <= und >.
Besser:
 if ((potiwert <= - 1) && (potiwert >-500))

Warum nicht einfach
if (potiwert < 0)
  potiwert = -potiwert;

: Bearbeitet durch User
von Sascha_ (Gast)


Lesenswert?

Mario schrieb:

> Ich habe das dann auch noch mal mit der Wurzel ziehen aus dem potiwert
> versucht also statt geteilt durch den potiwert am Ende die Wurzel aus
> dem potiwert.


Aber der Potiwert ist doch negativ...du hast also die Wurzel aus einer 
negativen Zahl gezogen?

von imaginär (Gast)


Lesenswert?

Wurzel aus negativen Zahlen sind halt imaginär. Was solls.

von Eric B. (beric)


Lesenswert?

Mario schrieb:
> potiwert= potiwert*(potiwert)/ potiwert;

> Im Seriellen-Monitor werden aber weiterhin negative Werte ausgegeben.

Natürlich, weil

pw = pw * (pw) / pw; <==>
pw = pw * 1;         <==>
pw = pw;              ==> wird wegoptimiert.

von Markus L. (rollerblade)


Lesenswert?

Günter N. schrieb:
> if (potiwert <= - 1 && potiwert >-500)
> wird so nicht funktionieren, && hat höhere Priorität als <= und >.
Falsch. Siehe 
http://de.cppreference.com/w/cpp/language/operator_precedence.

von Markus L. (rollerblade)


Lesenswert?

Mario schrieb:
> Im Seriellen-Monitor werden aber weiterhin negative Werte ausgegeben.
Was ergibt denn (-20)*(-20)/(-20)? -20? Klar, daß Minus mal Minus mal 
Minus wieder Minus ergibt. Wie wär's mit -1 * (-20) oder kurz -(-20)?


> Ich habe das dann auch noch mal mit der Wurzel ziehen aus dem potiwert
> versucht also statt geteilt durch den potiwert am Ende die Wurzel aus
> dem potiwert.
> Ebenfalls mit keinem Erfolg.
Ja klar, die Quadratwurzel aus einer negativen Zahl ziehen, und das mit 
einem Integer.
In Mathe wohl nicht aufgepaßt und dann programmieren wollen? Lern doch 
erst mal Mathe, dann klappt das auch mit der Integerarithmetik.

von Günter N. (turtle64)


Lesenswert?

Markus L. schrieb:
> Falsch. Siehe
> http://de.cppreference.com/w/cpp/language/operator_precedence.

Du hast Recht.
Ich würde trotzdem immer viele Klammern verwenden, das macht die Sache 
lesbarer und verhindert doch manchmal Überraschungen durch die 
Priorisierung der Operatoren.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Du willst vermutlich den Absolutwert bilden:

1
potiwert = abs(potiwert);

https://www.arduino.cc/en/Reference/Abs

Da in deinem Beispiel innerhalb des If-Blocks immer potiwert<0 ist,
kannst du dort auch einfach schreiben:

1
potiwert = -potiwert;

: Bearbeitet durch Moderator
von Joe F. (easylife)


Lesenswert?

Das mit dem map() ist doch unnötig kompliziert, und hat zusätzlich den 
Nachteil, dass der Bereich der Mittelstellung nicht berücksichtigt wird, 
in der der Motor stehen bleiben soll.
Was hat dir an dieser Lösung nicht gefallen?

Beitrag "Re: Poti mit Schrittmotor"

Und warum machst du einen neuen Thread zum gleichen Thema auf?
Ursprungsthread: 
Beitrag "Poti mit Schrittmotor"

: Bearbeitet durch User
von Der Andere (Gast)


Lesenswert?

Mario schrieb:
> potiwert= potiwert*(potiwert)/ potiwert;

Unabhängig ob das funktioniert oder nicht.
Nur um einen Betragswert zu bilden dürfte eine Multiplikation und eine 
Division auf einem kleinen µC der das nicht in Hardware kann so ziemlich 
das langsamste sein, was man machen kann.
Ausserdem muss deine Variable durch die Multiplikation mindestens die 
doppelte Länge haben (16Bit für eine 8 Bit Variable)

Das erst mal einfachste (wenn man die Funktion abs() nicht hat oder 
kennt) wäre zumindest:
if (wert < 0)
  wert := wert * (-1);

aber auch nicht unbedingt schnell wegen der Multiplikation:
Schneller geht so:
Beitrag "Sehr schneller Absolutbetrag AVR"

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.