Forum: Mikrocontroller und Digitale Elektronik MPX 5500 und Formel in C


von Steven Z. (steven84)


Lesenswert?

Hallo zusammen ich hab mal wieder eine Frage! Ich habe mir ein 
Drucksensor zugelegt und wollte damit bissl den Druck messen leider hab 
ich nicht so richtig Erfahrung wie man eine Formel vom Papier nach C 
transferiert


diese lautet ((ADCwert/1024)-0.04)/0.0018  die 5 Volt der ADC Formel vom 
AVR und die des Sensors hab ich rauskürzen können.

wie bekomm ich das jetzt mit den richtigen Wertebereichen der Variablen 
und der Formel nach C?

hier mal meine Idee
_________________________________________
int convert2kpa(int32_t value)
{ int32_t pressure;
  pressure=((value/1024)-0.04)/0.0018;
  return(pressure);
}


Wandlung des ADC Signals:


vergl=(convert2kpa(ADCwert));



Danke schon mal im Vorraus

von Heiko (Gast)


Lesenswert?

Vielleicht stehe ich gerade auf dem Schlauch, aber ich verstehe das 
Problem nicht. Funktioniert es so nicht, wie du es gemacht hast?

von Heiko (Gast)


Lesenswert?

Nachtrag: pressure sollte eine Gleitkommavariable sein.

von Steven Z. (steven84)


Lesenswert?

Das LCD Display rührt sich aber nicht :(
hier mal eine mein gestauchter main Code

   char buffer[10];

   lcd_clear();
   lcd_home();
   val=ADC_Read_avg(5,5); // ADC kanal 5 lesen und 5 messungen machen

   vergl=(convert2kpa(val)); // umwandlung von ADC zu kpa
   printf("%d \n",vergl);  // ausgabe über die serielle schnittstelle


   lcd_string( "Pressure:" );  // "" inhalt ins Display schreiben
   lcd_setcursor( 11,1 ); //setcursor(Spalte, Zeile)
   itoa (vergl,buffer,10); // kpa adc wert nach Ascii für LCD display
   lcd_string(buffer); // buffer auf LCD ausgeben

also pressure als Float deklarieren oder?

: Bearbeitet durch User
von Heiko (Gast)


Lesenswert?

Im Datenblatt deines Sensors steht ein Bereich von 0...500kPa. 
Barometrische Drucksensoren gehen etwa bis 10kPa. Ich würde sagen, der 
ist so unempfindlich, daß er einfach nichts "merkt" von einer 
Druckänderung.

von Heiko (Gast)


Lesenswert?

Steven Zimmermann schrieb:
> also pressure als Float deklarieren oder?

Ja, aber das ist nur ein Schönheitsfehler. Du hast den falschen Sensor.

von Mike (Gast)


Lesenswert?

Heiko schrieb:
> Barometrische Drucksensoren gehen etwa bis 10kPa.

Aber nur, wenn sie für die Stratosphäre spezifiziert sind. Auf NN wären 
die mit solch einem Meßbereich hoffnungslos (mehr als einen Faktor 10) 
übersteuert.

von Evangelista T. (Gast)


Lesenswert?

>Du hast den falschen Sensor.

Wieso? Zum messen des Reifendrucks ist das die erste Wahl.

von Steven Z. (steven84)


Lesenswert?

Dann versteh ich aber nicht warum er dann ein vakuum registriert also 
wenn ich mit dem Mund eins erzeuge dann geht er bis auf 0 runter. 500 
kpa sind doch 50bar mit einer Luftpumpe kann ich ca 3bar erzeugen aber 
da sollte er doch was anzeigen. Im Display hab ich nur eine -22 stehen!

von Karl H. (kbuchegg)


Lesenswert?

1
      ..... (value/1024)


value ist ein int (wenn auch mit 32 Bit, was aber wurscht ist, denn 
value kann nur Werte zwischen 0 und 1023 annehmen).
1024 ist ein int

Damit wird hier int durch int dividiert und das Ergenis ist wieder ein 
int.

Du kannst dir ja mal überlegen, welches int-Ergebnis du bekommst, wenn 
du zb 512 durch 1024 dividierst.
Exakt. Das Ergebnis ist einfach nur 0.


Hinweis: man kann solche Dinge auch ganz leicht mit einem C Compiler auf 
dem PC vorab überprüfen. Das hätte sogar den Vorteil, das man da mit 
einem Debugger ganz leicht ran kann und das man die Implementierung 
schnell und einfach ändern kann oder sich Teilergebnisse rausziehen 
kann, etc. etc.
Und erst dann, wenn die 'Formel' bzw. ihre IMplenentierung auf dem PC 
überprüft ist, dann geht man auf den µC.

von Karl H. (kbuchegg)


Lesenswert?

FAQ: Datentypen in Operationen


oder jedes andere noch so grindige C-Buch.

von Heiko (Gast)


Lesenswert?

Mike schrieb:
> Aber nur, wenn sie für die Stratosphäre spezifiziert sind. Auf NN wären
> die mit solch einem Meßbereich hoffnungslos (mehr als einen Faktor 10)
> übersteuert.

Sorry, Du hast natürlich recht. Ich habe die Umrechnung psi <-> Pascal 
verpeilt. Der in meiner Wetterstation geht von 0..15psi. Aber 500kPa ist 
trotzdem happig.

von Thomas K. (thomas_k39)


Lesenswert?

Deine Funktion wird immer 0 zurückgeben.

Wieso?
1
value/1024
ist eine Division von zwei ganzen Zahlen und liefert für alle Werte von 
value von 0 bis 1023 genau 0.

Erst wenn Du
1
pressure=((value/1024.0)-0.04)/0.0018;
schreibst, wird die Rechnung mit Float durchgeführt und das Ergebnis in 
einen int umgewandelt.

von Martin (Gast)


Lesenswert?

Wenn ich mich nicht verrechnet habe sollte

((ADCwert*1137778)-46603378)>>21

genauso gehen, nur in Int32_t-Arrithmetik.

von Mike (Gast)


Lesenswert?

Thomas K. schrieb:
> Erst wenn Dupressure=((value/1024.0)-0.04)/0.0018;schreibst, wird die
> Rechnung mit Float durchgeführt und das Ergebnis in
> einen int umgewandelt.

Man fragt sich natürlich, was da überhaupt die Float Rechnung soll. Der 
Sensor hat keinen sonderlich großen Dynamikbereich und in der 
Skalierungsrechnung treten auch keine Ausdrücke auf, die dies 
rechtfertigen würde. Selbst mit einer Druckangabe im Bereich 0..5000 hPa 
ohne Nachkommastellen läge man mit der Ausgabegenauigkeit einen Faktor 
100 über der spezifizierten Sensorgenauigkeit. Das ist also mehr als 
locker mit 32-Bit Integerrechnung in physikalische Werte umrechenbar.

von Steven Z. (steven84)


Lesenswert?

Vielen Dank, an alle. Ich selber programiere nur als hobby und leider 
ist mir nie beigebracht worden wie man die Mathematik in C umsetzt, so 
das ich mich hier so durchschlagen muss ;).
jedenfalls funzt die Rechnung nur der Sensor selber hat glaub ich einen 
treffe weg :(.

Danke nochmals...

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.