Fehlerkorrektur beim ADC auslesen RPI

Gast #4486144
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
}
#4486151
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?
#4486176
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.
Gast #4486273
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")
#4486613
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
Gast #4486636
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren