www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Skalierung von Messwerten in C


Autor: DirkF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich erfasse diverse Größen (Temperatur,Kraft,Druck) mit einem 
10-Bit AD Wandler des PIC18.
Als Beispiel
0-1023 Digit = -50....+300 Grad Celsius.
0-1023 Digit = - 25... 100 BAR (4-20 mA Messung)

Gint es eine fertige Funktion in C, die aus dem Eingangs Integer einen 
skalierten Ausgangsinteger macht ? Ich kenn sowas von der Siemens S7.

int Skalieren ( int In-min, INT IN-max, INT Out-min, INT OUT-max)

Werte für die Temperaturmessung:

INT Skalieren (0,1023,-500,3000);  // 1 Nachkommastelle

Ergebnis sollte dann ebenfalls als INT mit 1 Nachkommastelle sein.

Danke für eure Hilfe im voraus !

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Gint es eine fertige Funktion in C,

Weiß ich nicht. Aber in der Zeit, in der du hier auf Antwort wartest, 
hätte ich eine solche Funktion in  Pascal dreimal geschrieben. In 
Assembler wahrscheinlich auch.
Außerdem fehlt deiner Funktion irgendwie der umzurechnende Wert.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
                                                       out_max - out_min
 salierter_wert = out_min +  ( Messwert - in_min ) * ---------------------
                                                         in_max - in_min

wenn du noch 1 Kommastelle haben willst, musst du noch einen Faktor 10 
anbringen
                                  10 * ( Messwert - in_min )  * ( out_max - out_min )
 salierter_wert = 10 * out_min +  ----------------------------------------------------
                                                    in_max - in_min

Auf Datentypen und mögliche Überläufe achten!

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: DirkF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, danke für die Hinweise. Habe es hin bekommen:


//**********************scale**********************************

  int scale (int in_min, int in_max, int out_min, int out_max, int wert)
  {
  int abc;
  abc = ((float)wert / ( (float)in_max - (float)in_min))*((float)out_max 
- (float)out_min) + (float)out_min;
  return (abc);
  }


//******************************Main**************************


void main(void)
{

  int ergebnis;
           int wert=600;
  ergebnis = scale (0,1024,-500,2500,wert);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DirkF schrieb:
> Hallo, danke für die Hinweise. Habe es hin bekommen:
>
>
> //**********************scale**********************************
>
>   int scale (int in_min, int in_max, int out_min, int out_max, int wert)
>   {
>   int abc;
>   abc = ((float)wert / ( (float)in_max - (float)in_min))*((float)out_max
> - (float)out_min) + (float)out_min;
>   return (abc);
>   }

Warum hab ich blos geahnt, dass du float nehmen wirst :-)

Es ist unnötig!

Und schieb die Division nach hinten! Du willst so spät wie möglich 
dividieren!

(Da ist noch ein Fehler, den ich zu verantworten habe. Vom Messwert muss 
noch in_min abgezogen werden. Bei dir fällt es nicht auf, weil dein 
in_min gleich 0 ist.

Sieh dir nochmal die Formel weiter oben an. Da hab ich das in_min 
eingebaut.
)

Und schmeiss die float raus. Es reicht wenn du alles in long rechnest.

Autor: Tretet den Trog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soll Mami Haendchen halten beim Dreisatz ? Wo ist das Problem dabei ?

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und das Beispiel war extra in Fixed Point :-(

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tretet den Trog schrieb:
> Soll Mami Haendchen halten beim Dreisatz ? Wo ist das Problem dabei ?

Eher lineare Gleichung.
Dreisatz ist der Spezialfall, wenn in_min und out_min gleich 0 sind.
Ist aber ähnlich trivial wie der Dreisatz.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: DirkF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, danke für den Hinweis mit dem Long. Der code ist jetzt wesentlich 
kleiner geworden !

//**********************scale**********************************

  int scale (int in_min, int in_max, int out_min, int out_max, int wert)
  {
  int abc;
  abc = ((long)out_max - (long)out_min)* (long)wert / ( (long)in_max - 
(long)in_min);
  abc = abc + out_min;

  return (abc);
  }

//******************************Main**************************

void main(void)
{
  int ergebnis;
  int wert = 600;  // vom AD Wandler 10 Bit
  ergebnis = scale (0,1024,-500,2500,600); // skalieren in 
-50,0...+250,0°C

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den in_min Offset Fehler hast du immer noch.

Sagtest du nicht auch etwas von einer Skalierung, so dass im Endergebnis 
noch 1 'Nachkommastelle' auftaucht? (Kannst du natürlich auch über die 
out_min, out_max Werte erreichen, wenn du deren möglichen Zahlenbereich 
nicht ausnutzen wirst.

Und es reicht wenn du das Ergebnis von  ( max - min )   auf long 
castest. Die Subtraktion muss nicht long gemacht werden. Nicht bei 
deinen Zahlenwerten. Wenn du es allerdings ein wenig allgmeiner halten 
willst, dann lass es so wie es ist.

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.