Filter für Messwert

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Murphy.
Beiträge: 20
Registriert: Fr 21. Okt 2016, 19:02

Re: Filter für Messwert

Beitrag von Murphy. »

Moin,

der ADC läuft auf 5V also 100 ksps max. sampling rate.

Das var hab ich schon eingefügt und es läuft leider trotzdem nicht. Allerdings läufts wenn ich nur bei den ersten sechs Kanälen die Filter-Funktion verwende. Ich benutze einen Raspberry, kanns sein das die Rechenleistung nicht reicht oder das der zu langsam ist?


Code: Alles auswählen

 
unit u_spi_form;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  spidev, fpspi;
 
type
 
  { Tspi_form }
 
  Tspi_form = class(TForm)
    spi_timer: TTimer;
    procedure spi_timerTimer(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  spi_form: Tspi_form;
  adc: Array[1..7] of Integer;
  spi_adc: Array[1..7] of Integer;
  dac: Array[1..2] of Integer;
 
 
implementation
 
{$R *.lfm}
 
var index:Integer;    { Index auf den Messwert im Puffer }
var Wert,min,max,i:Integer;
 
const PufferGroesse = 5 + 2{ +2 weil der kleinste und groesste Wert entfernt werden }
const MAX_ADU = 4095;   { beim 12 Bit Wandler }
const MIN_ADU = 0;
 
{ Es folgen die Pufferspeicher der einzelnen Kanäle }
 
type
  Pufferspeicher = Array[0..PufferGroesse-1] of Integer;
 
var filter_adc: Array [1..7] of Pufferspeicher;
 
{ Filter_ADC1 }
//var Puffer_adc1: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC2 }
  //var Puffer_adc2: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC3 }
  //var Puffer_adc3: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC4 }
  //var Puffer_adc4: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC5 }
  //var Puffer_adc5: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC6 }
  //var Puffer_adc6: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC7 }
  //var Puffer_adc7: Pufferspeicher;   { Messwert Ringpuffer }
 
 
function filter(spi_adc:Integer; VAR Puffer_adc:Pufferspeicher):Integer;
  begin
    Puffer_adc[index]:=spi_adc;
    if index < PufferGroesse-1 then index:= index+1
    else index:=0;
    Wert:=0;
    min:=MAX_ADU;
    max:=MIN_ADU;
    for i:=0 to PufferGroesse-1 do
    begin
      if Puffer_adc[i] > max then max:=Puffer_adc[i];
      if Puffer_adc[i] < min then min:=Puffer_adc[i];
      Wert:=Wert+Puffer_adc[i];
    end;
    Wert := Wert-min;
    Wert := Wert-max;
    Wert := Wert DIV (PufferGroesse-2);
    result := Wert;
  end;
 
 
{ Tspi_form }
 
procedure Tspi_form.spi_timerTimer(Sender: TObject);
var
  spi: TSPILinuxDevice;
  rbuf, wbuf: array[0..2] of Byte;
  rslt: Word;
  dac_rbuf, dac_wbuf: array[0..1] of Byte;
  i: Integer;
 
begin
  spi := TSPILinuxDevice.Create(0,0);
  spi.Mode := SPI_MODE_0;
  try
    // ADC_Ch1
    wbuf[0] := %00000110;
    wbuf[1] := %00000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[1] := rslt;
    //adc[1]:=filter(spi_adc[1],filter_adc[1]);
 
    //ADC_Ch2
    wbuf[0] := %00000110;
    wbuf[1] := %01000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[2] := rslt;
   // adc[2]:=filter(spi_adc[2],filter_adc[2]);
 
    // ADC_Ch3
    wbuf[0] := %00000110;
    wbuf[1] := %10000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[3] := rslt;
    //adc[3]:=filter(spi_adc[3],filter_adc[3]);
 
    // ADC_Ch4
    wbuf[0] := %00000110;
    wbuf[1] := %11000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[4] := rslt;
    //adc[4]:=filter(spi_adc[4],filter_adc[4]);
 
    // ADC_Ch5
    wbuf[0] := %00000111;
    wbuf[1] := %00000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[5] := rslt;
    //adc[5]:=filter(spi_adc[5],filter_adc[5]);
 
    // ADC_Ch6
    wbuf[0] := %00000111;
    wbuf[1] := %01000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[6] := rslt;
    //adc[6]:=filter(spi_adc[6],filter_adc[6]);
 
 
    // ADC_Ch7
    wbuf[0] := %00000111;
    wbuf[1] := %10000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[7] := rslt;
    //adc[7]:=filter(spi_adc[7],filter_adc[7]);
  finally
    spi.Destroy;
  end;
 
  for i:=1 to 7 do begin
    adc[i] :=filter(spi_adc[i],filter_adc[i]);
  end;
 
  spi := TSPILinuxDevice.Create(0,1);
  spi.Mode := SPI_MODE_0;
  try
    dac_wbuf[0] := %01110000 or (dac[1] shr 8)// DAC_Ch1
    dac_wbuf[1] := dac[1] shl 4;
    spi.ReadandWrite(dac_wbuf[0], 2, dac_rbuf[0], 2);
 
    dac_wbuf[0] := %11110000 or (dac[2] shr 8)// DAC_Ch2
    dac_wbuf[1] := dac[2] shl 4;
    spi.ReadandWrite(dac_wbuf[0], 2, dac_rbuf[0], 2);
  finally
    spi.Destroy;
  end;
 
 end;
 
end.
 
 
 

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Filter für Messwert

Beitrag von siro »

Klammere mal zum Beispiel Kanal 1..4 aus und gucke ob dann die restlichen Kanäle funktionieren.
Wenn das geht, liegt es an der Anzahl der Kanaäle, dass irgend etwas nicht hinterher kommt...Timingproblem...

Oder probier mal den Takt von deinem spi_timer herab setzen, fallls das möglich ist.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Filter für Messwert

Beitrag von Mathias »

Könnte es sein, das du mit dem Filter nur eine Symtombekaempfung machen willst ?

Die Ursache fuer die Stoerungen kann auch anderswo sein.

Spannungsversorgung deiner Sonde.
Multiplex des mcp ueberfordert, hatte ich mit meinem ADS115.
Wie oben sch beschrieben, SPI ueberfordert.

Was hast du Hardwareseitig fuer Sonden ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Murphy.
Beiträge: 20
Registriert: Fr 21. Okt 2016, 19:02

Re: Filter für Messwert

Beitrag von Murphy. »

siro hat geschrieben:Klammere mal zum Beispiel Kanal 1..4 aus und gucke ob dann die restlichen Kanäle funktionieren.
Wenn das geht, liegt es an der Anzahl der Kanaäle, dass irgend etwas nicht hinterher kommt...Timingproblem...

Oder probier mal den Takt von deinem spi_timer herab setzen, fallls das möglich ist.



Moin, es liegt anscheinend an der Anzahl der Kanäle. Wenn ich einen Kanal ausklammer läufts. Was kann ich jetzt nochmachen damit auch der letzte Kanal ausgelesen wird?

Das Programm sieht jetzt so aus und der Timer Intervall steht auf 250ms. Haber aber bereits diverse Intervalle ohne Erfolg getestet...

Code: Alles auswählen

 
unit u_spi_form;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  spidev, fpspi;
 
type
 
  { Tspi_form }
 
  Tspi_form = class(TForm)
    spi_timer: TTimer;
    procedure spi_timerTimer(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  spi_form: Tspi_form;
  adc: Array[0..6] of Integer;
  spi_adc: Array[0..6] of Integer;
  dac: Array[0..1] of Integer;
 
 
implementation
 
{$R *.lfm}
 
var index:Integer;    { Index auf den Messwert im Puffer }
var Wert,min,max,i:Integer;
 
const PufferGroesse = 5 + 2{ +2 weil der kleinste und groesste Wert entfernt werden }
const MAX_ADU = 4095;   { beim 12 Bit Wandler }
const MIN_ADU = 0;
 
{ Es folgen die Pufferspeicher der einzelnen Kanäle }
 
type
  Pufferspeicher = Array[0..PufferGroesse-1] of Integer;
 
var filter_adc: Array [0..6] of Pufferspeicher;
 
{ Filter_ADC1 }
//var Puffer_adc1: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC2 }
  //var Puffer_adc2: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC3 }
  //var Puffer_adc3: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC4 }
  //var Puffer_adc4: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC5 }
  //var Puffer_adc5: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC6 }
  //var Puffer_adc6: Pufferspeicher;   { Messwert Ringpuffer }
{ Filter_ADC7 }
  //var Puffer_adc7: Pufferspeicher;   { Messwert Ringpuffer }
 
 
function filter(spi_adc:Integer; VAR Puffer_adc:Pufferspeicher):Integer;
  begin
    Puffer_adc[index]:=spi_adc;
    if index < PufferGroesse-1 then index:= index+1
    else index:=0;
    Wert:=0;
    min:=MAX_ADU;
    max:=MIN_ADU;
    for i:=0 to PufferGroesse-1 do
    begin
      if Puffer_adc[i] > max then max:=Puffer_adc[i];
      if Puffer_adc[i] < min then min:=Puffer_adc[i];
      Wert:=Wert+Puffer_adc[i];
    end;
    Wert := Wert-min;
    Wert := Wert-max;
    Wert := Wert DIV (PufferGroesse-2);
    result := Wert;
  end;
 
 
{ Tspi_form }
 
procedure Tspi_form.spi_timerTimer(Sender: TObject);
var
  spi: TSPILinuxDevice;
  rbuf, wbuf: array[0..2] of Byte;
  rslt: Word;
  dac_rbuf, dac_wbuf: array[0..1] of Byte;
  i: Integer;
 
begin
  spi := TSPILinuxDevice.Create(0,0);
  spi.Mode := SPI_MODE_0;
  try
    // ADC_Ch1
    wbuf[0] := %00000110;
    wbuf[1] := %00000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[0] := rslt;
    adc[0]:=filter(spi_adc[0],filter_adc[0]);
 
    //ADC_Ch2
    wbuf[0] := %00000110;
    wbuf[1] := %01000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[1] := rslt;
    adc[1]:=filter(spi_adc[1],filter_adc[1]);
 
    // ADC_Ch3
    wbuf[0] := %00000110;
    wbuf[1] := %10000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[2] := rslt;
    adc[2]:=filter(spi_adc[2],filter_adc[2]);
 
    // ADC_Ch4
    wbuf[0] := %00000110;
    wbuf[1] := %11000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[3] := rslt;
    adc[3]:=filter(spi_adc[3],filter_adc[3]);
 
    // ADC_Ch5
    wbuf[0] := %00000111;
    wbuf[1] := %00000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[4] := rslt;
    adc[4]:=filter(spi_adc[4],filter_adc[4]);
 
    // ADC_Ch6
    wbuf[0] := %00000111;
    wbuf[1] := %01000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[5] := rslt;
    adc[5]:=filter(spi_adc[5],filter_adc[5]);
 
 
    // ADC_Ch7
    wbuf[0] := %00000111;
    wbuf[1] := %10000000;
    spi.ReadandWrite(wbuf[0], 3, rbuf[0], 3);
    rslt := (rbuf[1] and $0F) shl 8;
    rslt := rslt or rbuf[2];
    spi_adc[6] := rslt;
    adc[6]:=filter(spi_adc[6],filter_adc[6]);
  finally
    spi.Destroy;
  end;
 
  //for i:=0 to 6 do begin
    //adc[i] :=filter(spi_adc[i],filter_adc[i]);
 
  //end;
 
  spi := TSPILinuxDevice.Create(0,1);
  spi.Mode := SPI_MODE_0;
  try
    dac_wbuf[0] := %01110000 or (dac[0] shr 8)// DAC_Ch1
    dac_wbuf[1] := dac[0] shl 4;
    spi.ReadandWrite(dac_wbuf[0], 2, dac_rbuf[0], 2);
 
    dac_wbuf[0] := %11110000 or (dac[1] shr 8)// DAC_Ch2
    dac_wbuf[1] := dac[1] shl 4;
    spi.ReadandWrite(dac_wbuf[0], 2, dac_rbuf[0], 2);
  finally
    spi.Destroy;
  end;
 
 end;
 
end.
 
 
 


Ich hab mehere verschiedene Sensoren, die alle ein eher bescheidenes Signal ausgeben.... Jup ich muss die Symtome bekämpfen. Spi überforderdet glaub ich nicht, da die ungeglättet Signal funktionieren.... Ich hab keine Idee mehr

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Filter für Messwert

Beitrag von Mathias »

Wie werden die Sensoren versorgt, kommt dies aus einem PC Netzteil, oder aus einer stabilen Spannungsquelle ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Filter für Messwert

Beitrag von shokwave »

Erklär mir bitte mal die folgenden Zeilen(nach "begin").

Code: Alles auswählen

function filter(spi_adc:Integer; VAR Puffer_adc:Pufferspeicher):Integer;
  begin
    Puffer_adc[index]:=spi_adc;
    if index < PufferGroesse-1 then index:= index+1
    else index:=0;

Soweit ich das sehen kann ist Index eine globale Variable, die aber nur in diesen 3 Zeilen verwendet wird. Warum?
mfg Ingo

Murphy.
Beiträge: 20
Registriert: Fr 21. Okt 2016, 19:02

Re: Filter für Messwert

Beitrag von Murphy. »

Mathias hat geschrieben:Wie werden die Sensoren versorgt, kommt dies aus einem PC Netzteil, oder aus einer stabilen Spannungsquelle ?


Ich benutze ein Schaltnetzteil von Reichelt, und habe alle Spannungen mit Kondensatoren entsprechend dem Datenblatt geglättet.

shokwave hat geschrieben:Erklär mir bitte mal die folgenden Zeilen(nach "begin").

Code: Alles auswählen

function filter(spi_adc:Integer; VAR Puffer_adc:Pufferspeicher):Integer;
  begin
    Puffer_adc[index]:=spi_adc;
    if index < PufferGroesse-1 then index:= index+1
    else index:=0;

Soweit ich das sehen kann ist Index eine globale Variable, die aber nur in diesen 3 Zeilen verwendet wird. Warum?


Solangsam bin ich auch nicht mehr sicher ob ich das richtig verstanden habe. Ich denke das der Index durch das schreiben in den Puffer gesetzt wird ???

Ich verseh einfach nicht warum der filter bei 6 kanälen funktioniert aber bei 7 komplett aussteigt....

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Filter für Messwert

Beitrag von siro »

@shokwave:
Der index MUSS globals sein, da er im Interrupt bei OnTimer aktualisiert wird.
Der Wert muss also nach Beendigung der Procedure erhalten bleiben.
Der Index zählt mit jedem neuem eingetragenen Messwert eins hoch, bis er am Ende ist
und beginnt dann wieder von 0.
Wäre er lokal, also innerhalb, der OnTimer Procedure würde er seinen Wert verlieren.
es sei denn man würde ihn "static" machen, das geht wohl neuerdings in FPC.
Das Wort "Interrupt" darf man hier aber nicht wörtlich nehmen... :wink:

@Murphy:
Du kannst ja mal versuchen die Zeiten "annähernd" zu messen wie lange es dauert von Punkt a bis Punkt b.

var t:Int64;
t:=GetTickCount64;
{ aktuellen Zählerstand in Millisekunden merken }
.....Programmcode
.....Programmcode
t:=GetTickCount64 - t; { neuen Zählerstand holen und alten abziehen }
Form1.caption:=IntToStr(t); { Textausgabe der Laufzeit in Millisekunden }

Die gesamte Laufzeit muss ja unter 250ms liegen sonst gehts schief.


Du solltest zudem das TSPILinuxDevice.Create und spi.Destroy aus der Timerfunktion rausnehmen,
das gehört da meiner Meinung nach nicht hin.
Das wird nur einmal bei Form.Create erzeugt
und dann bei Form.Destroy wieder freigegeben.
Kost sonst nur Zeit und verwurschtelt Dir den Speicher...
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Filter für Messwert

Beitrag von shokwave »

@Siro:Danke, sollte keine Kritik sein, hatte es nur nicht geblickt.

@Murphy:Zum eigentlichen Problem, bleibe ich trotzdem mal an genau der Codestelle:

Code: Alles auswählen

if index < PufferGroesse-1 then index:= index+1

Wenn Puffergresse 7 ist läuft er von 0 bis 5, da 7-1=6 und 5<6. Oder kurz, das "-1" muss raus oder "index <= Puffergroesse-1".
mfg Ingo

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Filter für Messwert

Beitrag von shokwave »

siro hat geschrieben:@shokwave:
Der index MUSS globals sein, da er im Interrupt bei OnTimer aktualisiert wird.

Noch 'ne blöde Frage. Der "Index" wird aber nicht einmal pro Timer erhöht, sondern bei jedem Aufruf von filter(), also 7 mal. Soll das so sein?
mfg Ingo

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Filter für Messwert

Beitrag von Mathias »

Murphy. hat geschrieben:
Mathias hat geschrieben:Wie werden die Sensoren versorgt, kommt dies aus einem PC Netzteil, oder aus einer stabilen Spannungsquelle ?


Ich benutze ein Schaltnetzteil von Reichelt, und habe alle Spannungen mit Kondensatoren entsprechend dem Datenblatt geglättet.

Das könnte eine Ursache für das Rauschen sein. Ich hatte am Anfang meine Sonden direkt vom USB meine PCs versorgt, das Ergebnis, eine Katastrophe.
Erst als ich eine saubere Spannung hinter einem LM317 habe, habe ich eine saubere Gleichspannung für meine Sonde.
Besonders stark macht sich dies bemerkbar, wen eine Sonde als Spannungsteiler arbeitet.

Im Anhang, habe ich ein PDF, als ich meine Sonden noch mit USB versorgte. Rechts oben macht sich das Rauschen besonders bemerkbar.
Dateianhänge
Messwert_000000-1.pdf
(12.8 KiB) 64-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Filter für Messwert

Beitrag von siro »

@shokwave:
Der index wird bei jedem Aufruf von Filter erhöht und da hast Du recht, das ist NICHT okay.
Die Filterfunktion war auch ursprünglich für einen Messkanal gedacht.

Die Abfrage für index ist aber richtig
Bei PufferGröße 7 gibt es ein gültiges Array von 0..6
Ein kleines Testprogramm beweisst die Funktionalität:
const PufferGroesse = 5+2;
var index:integer;

Code: Alles auswählen

procedure put;
begin
  if index < PufferGroesse-1 then index:=index+1 else index:=0;
  form1.ListBox1.items.add(IntToStr(index));
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  for i:= 0 to 100 do put;
end;


Hier der Screenshoot:
Dateianhänge
index.jpg
index.jpg (7.16 KiB) 2599 mal betrachtet
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Filter für Messwert

Beitrag von siro »

Zu den Störungen selbst:
Das kann viele Ursachen haben. Ich bevorzuge die Messsignale lieber niederohmig in den ADU einzuspeisen.
Hatte auch mal 1K in der ADU Leitung und raus kam ziemlicher Müll, hab den überbrückt und siehe da es wurde wesentlich besser.
Ein Schaltnetzteil verusacht generell viele Störungen, die müssen aber nicht unbedingt auf dem Messiganl sichtbar sein,
entscheidend ist hier der Aufbau und das Layout. Eine falsche Leiterbahnführung kann katastrophale Folgen haben.
Zudem gibts ein Digital und ein Analog Masse, das sollte unbedingt beachtet werden.
Ich würde bei Störungen erstmal die Schaltung mit einem gut gesiebten Analognetzteil oder wenn möglich sogar einer Batterie versorgen.
Sind die Störungen dann auch da, kannst Du dein Schaltnetzteil ausschliessen.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Filter für Messwert

Beitrag von shokwave »

Stimmt, beim letzten Durchlauf (5<6) wird dann Index auf 6 erhöht. Mein Denkfehler. :oops:
mfg Ingo

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Filter für Messwert

Beitrag von Timm Thaler »

siro hat geschrieben:Ich schmeisse vor der Mittelwertbildung jedoch noch den Groesten und kleinsten Messwert raus und bilde nur noch aus den restlichen Werten den Mittelwert,
Ausreisser werden damit schön geglättet.


Und was machst Du, wenn Du zwei Ausreisser nach oben hast?

Antworten