Forum: Mikrocontroller und Digitale Elektronik Capsense Algorithmus mit fraction Byte


von Christian (Gast)


Lesenswert?

Hallo.
Ich arbeite mich gerade durch den Capsense Source Code (PSOC3) durch.
Wenn sich der Wert am Sensor ändert,z.b. durch Temperaturschwankung,
soll eine Referenz(SensorBaseline[]) diese folgen.Eigentlich ganz simple
aber trotzdem verstehe ich den Algorithmus nicht:

UpdateSensorBaseline()
{
    uint32 calc;
    uint16 RawData;

   //new sample
   RawData = input;

   /* Make full Baseline 23 bits */
   calc = (uint32) SensorBaseline[sensor] << 8u;
   calc |= (uint32) SensorBaselineLow[sensor];

   /* Add Raw Data to Baseline */
   calc += RawData;

   /* Sub the high Baseline */
   calc -= SensorBaseline[sensor];

   /* Put Baseline and BaselineLow */
   SensorBaseline[sensor] = ((uint16) (calc >> 8u));
   SensorBaselineLow[sensor] = ((uint8) calc);
}
//global deklariert:
uint16 SensorBaseline[max_SENSOR];
//used to store fraction byte of baseline value
uint8 SensorBaselineLow[max_SENSOR];

Warum bildet man nicht einfach die Differenz des Sensorwertes und
der Referenz: RawData - SensorBaseline=Diff. Und addiert Diff anschl.
zur Referenz: Diff+SensorBaseline=SensorBaseline.
Mich verwundert auch der Kommentar:
//used to store fraction byte of baseline value
uint8 SensorBaselineLow[max_SENSOR];
Was soll hier ein fraction Byte bedeuten?

von Matthias (Gast)


Lesenswert?

Das ist ein IIR-Filter mit

  y_n+1 = (y_n * 255 + x ) / 256

Wegen der einfacheren Berechnung ist 255 als

  y_n * 256 - y_n

realisiert

MfG

von Christian (Gast)


Lesenswert?

Ahh,jetzt machts Sinn. Dankeschön.
Aber wie komm ich auf : y_n * 256 - y_n = 255?
Und warum gibt es dort ein fraction Byte: SensorBaselineLow?

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:
> Ahh,jetzt machts Sinn. Dankeschön.
> Aber wie komm ich auf : y_n * 256 - y_n = 255?

nicht 255

  y_n * 255

ist ersetzt worden durch

  y_n * 256 - y_n

> Und warum gibt es dort ein fraction Byte: SensorBaselineLow?

Damit man zwar in ganzen Zahlen rechnen kann aber trotzdem sowas wie 
"Kommastellen" hat.

Du kannst ja auch anstelle von in Euro in Cent rechnen.

Anstelle von  3 Euro 80 + 5 Euro 75

     3.80
     5.75
   ------
     9.55

rechnest du einfach

     380
     575
    ----
     955

das heisst dein Ergebnis ist 9 Euro. und die 55 sind das 
'Kleingedruckte', die Nachkommastellen.
Hier halt nicht dezimal, sondern in Form von 8 Bit

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.