Experimente mit Sensoren HP03S  und HH10D
Teil 1
Mit diesem Programm ist es möglich, die beiden Real-Werte
aus den ADC-Werten für den Sensor HP03S zu berechnen.


Voraussetzung zur Berechnung sind alle ROM-Konstnaten (C1 bis D) und jeweils ein
Datensatz aus dem ADC des Sensors.

(Die erforderlichen ROM-Konstanten können mit diesem Test-Programmen ausgelesen
und angezeigt werden.)
Quelltext des Sensor-Programmes mit MEGA8L
Quelltext des Anzeige-Programmes mit MEGA128


Blockschaltbild
Details
Evaluierungsprogramm
Berechnungs-Prozedure:

Der Sensor HP03S liefert über eine I2C-Schnittstelle einen Rohwert für Temperatur und
Luftdruck. Diese Werte müssen jedoch relativ aufwändig mit Hilfe der mitgeleiferten
Konstanten in die anwendbaren Daten umgerechnet werden.

Die Berechnung kann so organisiert werden, dass diese mit Integer-Zahlen (LongInt)
erfolgen kann. Da jedoch die Rechenzeit mit Real-Typen nicht relevant länger wird, habe ich
folgenden Weg gewählt.

Der Pascal-Compiler von MikroElektronika erlaubt eine implizite Typ-Konversion, was im
Folgenden auch eingesetzt wurde. Das betrifft zum Beispile zu, wenn die Rohwerte (word-
format) auf die Real-Rechenvariablen übetragen werden.

Die procedure wurde so geschrieben, dass immer nur eine Art Rechenoperation pro Zeile
erscheint.



{------------------------------------------------------------------------------}
procedure Compute_P_T(var _pr, _te : real);
{------------------------------------------------------------------------------}

// Berechnungen erfolgen im Bereich der real-Zahlen:

// Implizite Type-Konversion
var HC1, HC2, HC3 : real;
    h_pow : longint;
    dUT, OFF, SENS, X : real;
    i : byte;
begin
  //
    HC1 := hp03s_Temperat;
    HC1 := HC1 - hp03s_C5;
    HC2 := HC1 / 128;
    dUT := HC1;
    h_pow := 1;
    h_pow := h_pow shl hp03s_C;
    if (hp03s_temperat >= hp03s_C5) then begin
      HC1 := (HC2 * HC2 * hp03s_A);
    end
    else begin
      HC1 := (HC2 * HC2 * hp03s_B);
    end;
    HC2 := HC1 / h_pow;
    dUT := dUT - HC2;
    //-------------------
    HC1 := hp03s_C4;
    HC1 := HC1 - 1024;
    HC1 := HC1 * dUT;
    HC1 := HC1 / 16384;
    HC1 := HC1 + hp03s_C2;
    OFF := HC1 * 4;
    //-------------------
    HC1 := hp03s_C3;
    HC1 := HC1 * dUT;
    HC1 := HC1 / 1024;
    SENS := HC1 + hp03s_C1;
    //-------------------
    HC1 := hp03s_pressure;
    HC1 := HC1 - 7168;
    HC1 := HC1 * SENS;
    HC1 := HC1 / 16384;
    X := HC1 - OFF;
    //--------------------
    HC1 := X * 10;
    HC1 := HC1 / 32;
    _pr := HC1 + hp03s_C7;  // Ergebnis
    _pr := _pr / 10;
    //--------------------
    HC1 := hp03s_C6;
    HC1 := HC1 * dUT;
    HC1 := HC1 / 65536;
    h_pow := 1;
    h_pow := h_pow shl hp03s_D;
    HC3 := dUT / h_pow;
    _te := HC1 - HC3 + 250;  // Ergebnis
    _te := _te / 10;
    //---------------------------
end;