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.