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.
Hi Du willst, das wenn potiwert < 0 dann soll potiwert:=-potiwert werden? MfG Spess
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
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?
Wurzel aus negativen Zahlen sind halt imaginär. Was solls.
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.
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.
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.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.