Forum: Mikrocontroller und Digitale Elektronik Fehlerkorrektur beim ADC auslesen RPI


von baer (Gast)


Lesenswert?

Fehlerkorrektur beim ADC auslesen...

Hallo Liebe Leut, ich habe einen PI und dazu einen pcf8591 um Analoge 
werte auszulesen...

jetzt ist es so, dass ich relativ schnell (alle 300ms) die Werte 
auslese. Diese kommen auch "zumeist" Korrekt an! Doch leider übernimmt 
er gelegentlich einen "anderen" ADC wert...

z.B.
A0 = 0
A1 = 120
A2 = 57
A4 = 255

jetzt lese ich die ganze Zeit wie werte ein... hin und wieder Springt 
der A2 dann z.B. auf 0...

wie bewerkstellige ich hier am besten eine "Fehlerkorrektur", meine Idee 
war es beim einlesen eine "MAXIMALDIFFERENZ" zu definieren... und wenn 
diese überschritten wird, soll diese Ignoriert werden.

Die Weiterverarbeitung bewerkstellige ich in Javascript...

=> die werte "Langsamer" auszulesen sorgt zwar dafür dass etwas weniger 
Fehler kommen, aber auch da habe ich irgendwann mal genau diesen Fehler. 
Man könnte fast meinen der kommt alle X mal auslesen. Evtl. kann auch 
jemand den Fehler im "Code" erkennen...

hier das C-Script.
1
#include <wiringPi.h>
2
#include <stdlib.h>
3
#include <unistd.h>
4
#include <stdio.h>
5
#include <pcf8591.h>
6
7
#define PINBASE 100
8
9
/*
10
cc -o test2 test2.c -lwiringPi
11
*/
12
13
int main (void)
14
{
15
  int i;
16
  int adc0;
17
  int adc1;
18
  int adc2;
19
  int adc3;
20
21
  if (pcf8591Setup(PINBASE, 0x48) < 0)
22
  {
23
    printf("pcf8591Setup failed:\n");
24
  }
25
26
  adc0 = analogRead(PINBASE + 0);
27
  adc1 = analogRead(PINBASE + 1);
28
  adc2 = analogRead(PINBASE + 2);
29
  adc3 = analogRead(PINBASE + 3);
30
  printf("[%d,%d,%d,%d]\n",adc0,adc1,adc2,adc3);
31
}

von Joachim B. (jar)


Lesenswert?

der PI hat kein real time OS, manchmal ist er mit sich selber 
beschäftigt.
Ist deine Versorgung für den PCF sauber?
Am analogen Ausgang Klinke kann man  herrlich swap und Busaktivitäten 
hören, wenn das auch auf die Versorgung vom PCF trifft, Mahlzeit.

Wer sagt denn das deine Analogwerte so stabil sind? Oszi angeschlossen 
und verifiziert?

von Markus F. (mfro)


Lesenswert?

Joachim B. schrieb:
> der PI hat kein real time OS, manchmal ist er mit sich selber
> beschäftigt.

Das darf in diesem Fall keine Rolle spielen.

Schliesslich liest der Pi die Analogwerte nicht selber ein, sondern holt 
sie sich per i2c. Ist er dann mal mit sich selbst beschäftigt, kommt der 
Messwert halt ein bisschen später, sollte deshalb aber nicht gleich 
verkehrt sein.

von baer (Gast)


Lesenswert?

Joachim B. schrieb:
> Wer sagt denn das deine Analogwerte so stabil sind?

momentan verwende ich passive Bauelemente => z.b. einen normalen 
Widerstand, da gibt es nicht viel zu "schwanken"

von baer (Gast)


Lesenswert?

baer schrieb:
> da gibt es nicht viel zu "schwanken"

naja... zugegeben... wenn der wert 57 ist... kommt (von 100 Messungen) 
15x 56  60x 57  20x 58 und 5x ein komplett anderer Wert (gerade habe 
ich alle anderen ADC auf GND gesetzt, jetzt kommt eben immer 0.

wenn ich den PFC (Fertigbauelement von amazon) tausche kommt der selbe 
fehler (somit denk ich, dass es wohl nicht an der "hardware" liegt. Auch 
die verkabelung ist mir 15cm länge sauber und wenig störanfällig (wie 
gesagt, gerade noch im "Schreibtischbertrieb")

von Joachim B. (jar)


Lesenswert?

baer schrieb:
> naja... zugegeben... wenn der wert 57 ist... kommt (von 100 Messungen)
> 15x 56  60x 57  20x 58 und 5x ein komplett anderer Wert

dann mache doch eine min max Beobachtung und alles was über die Maßen 
abweicht wird verworfen.

Wert 57,
if ADC >=57 und ADC<(57 + (57 * Fehler%))max = ADC
if ADC <57 und ADC>(57 + (57 * -Fehler%))min = ADC
if !(ADC < MIN und ADC > MAX) ADC = OK

von baer (Gast)


Lesenswert?

naja... so einfach ist das nicht... ich will schon messen!

d.h. werte zwischen 0 und 255 sind möglich... aber ich habe nur eine 
"langsame" Veränderung... d.h. nach 80 kommt nicht 0 oder 255 sonder 
z.B. 87!

ich hab mir jetzt schon Lösungsansätze ausgedacht:
1.
AX != AA
AX != AB
AX != AC

hier erscheint das Problem, sollten die werte doch mal GLEICH sein (z.B. 
0 oder 255) bekomme ich keine echten werte zurück

2.
ich schiebe werte in ein array und vergleiche die einzelnen werte... 
größere Ausreiser Lösche ich aber nach aktuellen Konzept, dauert das zu 
lange :/


noch bin ich zu keiner "echt guten" Lösung gekommen

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.