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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.