mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Potiwertebereich für AnalogWrite anpassen


Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Community,

ich verwende einen Arduino Uno und einen linearen Gasdrehgriff als Poti.
Mein Poti läuft zwischen den Bereichen von 168 bis 875 Ohm.

168 -> aus
875 -> maximal Anschlag

Nun möchte ich gerne meinen Potimessbereich [168 - 875] für analogWrite 
auf den Wertebereich [0 - 255] anpassen.

Mein Vorschlag:
int potiWert = 0;

int steuerWert = 0;


void setup() {
 Serial.begin(9600);
}

void loop() {
 
 potiWert = (6 * potiWert + 4 * analogRead(A0))/10; 

 steuerWert = 255*(potiWert -168)/(875-168); // skalierter Wertbereich (0-255)
}

Problem:

steuerWert dient als Umrechnung in den 0-255 Bereich.
Jedoch erhalte ich hierfür Minuswerte ab einer bestimmten Größe der 
Zahl.
(s. Anhang)

Ich hoff Ihr könnt mir weiterhelfen.

Vielen Dank

Gruß

Matthias

Autor: Der Andere (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias schrieb:
> potiWert = (6 * potiWert + 4 * analogRead(A0))/10;

Was soll das?

Matthias schrieb:
> steuerWert = 255*(potiWert -168)/(875-168);

Dir ist bewusst, daß dein Wertebereich von int 16 Bit? ist.
Wenn also potiwert größer als 128+168 wird und das mit 255 (ist eh 
falsch, müsste 256 sein) multipliziert wird läuft deine Variable über.

Wegen so einem int Variablenüberlauf ist mal eine Ariane-Rakete 
abgestürzt.

Weiter ist dir kekannt daß int divisionen abschneiden. Also 11/12 ist 
bei int 0!

Autor: THOR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Andere schrieb:
> Dir ist bewusst

Der Andere schrieb:
> Weiter ist dir kekannt

Ich lehne mich mal aus dem Fenster und sage: Nein, ist es ihm/ihr nicht.

Autor: Axel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
https://www.arduino.cc/en/Reference/Map

das lässt sich beim arduino direkt mappen. Du brauchst den niedrigsten 
ADC-Wert und den maximal sich ergebeen ADC-Wert je nach Potistellung.
Als weiteren Parameter gibts Du an, wie der Ausgangsbereich aussehen 
soll.
Voll einfach!

StromTuner

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du Dir mal die Arduino Funktion anschaust, siehst du, wie dort der 
Überlauf verhindert wurde. Es wurden "long" Variablen verwendet. In 
deinem Einzeiler kannst du das etwas effizienter so umsetzen:

> steuerWert = (long int) 255*(potiWert -168)/(875-168);

: Bearbeitet durch User
Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn es dann noch ohne Division abgehen soll, geht auch etwas in der 
Art
y = (x * 1478 - 248130) / 4096

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.