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


von Matthias (Gast)


Angehängte Dateien:

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:
1
int potiWert = 0;
2
3
int steuerWert = 0;
4
5
6
void setup() {
7
 Serial.begin(9600);
8
}
9
10
void loop() {
11
 
12
 potiWert = (6 * potiWert + 4 * analogRead(A0))/10; 
13
14
 steuerWert = 255*(potiWert -168)/(875-168); // skalierter Wertbereich (0-255)
15
}

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

von Der Andere (Gast)


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!

von THOR (Gast)


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.

von Axel R. (Gast)


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

von Stefan F. (Gast)


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);

von Wolfgang (Gast)


Lesenswert?

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

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.