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.
 
 
 
 
 
 Verein
Verein 
 Links
Links Suche
Suche