Hallo
Ich bin gerade dabei einen AT90CAN128 zusammen mit mehreren Sensoren zum Laufen zu bekommen. Da habe ich allerdings so meine Probleme mit dem Auslesen des ADCs
Alle 3 Sensoren siten an den ADC Channels 0,1,2 des AT90CAN128 (PF0..PF2). Die initalisierung schaut so aus:
Ausgelesen wird mit der folgenden Funktion
Procedure ReadSensors;
var Data: word;
begin
Data:=GetADC(1); //Drucksensor1
Senspress1:=-(float(920-Data)/818.0);
Data:=GetADC(2); //Drucksensor 2
Senspress2:=-(float(920-Data)/818.0);
Data:=GetADC(3); //Durchflusssensor
Flow:=(float(Data)); //Rohdaten lesen
end;
Jetzt habe ich hier einige komische effekte:
1. Ist nur der Drucksensor 1 Angeschlossen, so liefert sowohl GetADC(1) als auch GetADC(2) den selben wert, obwohl der zweite eingang eigentlich unbeschaltet ist. Gibt es da intern im Controller ein Übersprechen zwischen den Kanälen? Sind die nicht entkoppelt? Muss ich den zweiten Eingang gegen Masse legen, damit der inaktiv wird?
2. GetADC(3) liefert IMMER 0 obwohl am Pin 0,8V anliegen! Warum? Bug? Programmierfehler? Verständnisproblem?
Brauch da dringend Hilfe wegen Termindruck.
Ich bin gerade dabei einen AT90CAN128 zusammen mit mehreren Sensoren zum Laufen zu bekommen. Da habe ich allerdings so meine Probleme mit dem Auslesen des ADCs
Alle 3 Sensoren siten an den ADC Channels 0,1,2 des AT90CAN128 (PF0..PF2). Die initalisierung schaut so aus:
Code
Import SysTick, RTclock, SerPort, SerPort2, ADCPort, SPIdriver1, TWImaster,CAN_AVR,Watchdog;
From System Import Float, longint, FlashCheck_S,pipes, Pids,Processes,Exceptions;
Define
ProcClock = 16000000; {Hertz}
SysTick = 10; {msec}
StackSize = $0100, iData;
FrameSize = $0100, iData;
SerPort = 9600, Stop2; {Baud, StopBits|Parity}
RxBuffer = 8, iData;
TxBuffer = 8, iData;
SerPort2 = 57600, Stop2; {Baud, StopBits|Parity}
RxBuffer2 = 64, iData;
TxBuffer2 = 64, iData;
ADCchans = 3, iData;
ADCpresc = 128;
TWIpresc = TWI_BR100;
{ SPIpresc = 2;
SPIOrder = MSB;
SPICPOL = 1;
SPICPHA = 1;
SPI_SS = false;
}
SPIdriver1 = PortB, 1, 2, 6, 3; // SCK, MOSI, MISO, SS
SPIorder1 = MSB;
SPIcpol1 = 1;
SPIcpha1 = 0;
RTClock = iData, DateTime;{Time, DateTime}
FlashChksum = ProgEnd; {or absolute address}
CAN_AVR = 16, 16, iData, CAN_SysTime; // RxPipe, TxPipe, memory, Systemtime
CAN_AVRbaud = CAN_Baud125;
Scheduler = iData;
Watchdog = msec2000; //Watchdog auf 2 Sek setzen.
exceptions = 2;
From System Import Float, longint, FlashCheck_S,pipes, Pids,Processes,Exceptions;
Define
ProcClock = 16000000; {Hertz}
SysTick = 10; {msec}
StackSize = $0100, iData;
FrameSize = $0100, iData;
SerPort = 9600, Stop2; {Baud, StopBits|Parity}
RxBuffer = 8, iData;
TxBuffer = 8, iData;
SerPort2 = 57600, Stop2; {Baud, StopBits|Parity}
RxBuffer2 = 64, iData;
TxBuffer2 = 64, iData;
ADCchans = 3, iData;
ADCpresc = 128;
TWIpresc = TWI_BR100;
{ SPIpresc = 2;
SPIOrder = MSB;
SPICPOL = 1;
SPICPHA = 1;
SPI_SS = false;
}
SPIdriver1 = PortB, 1, 2, 6, 3; // SCK, MOSI, MISO, SS
SPIorder1 = MSB;
SPIcpol1 = 1;
SPIcpha1 = 0;
RTClock = iData, DateTime;{Time, DateTime}
FlashChksum = ProgEnd; {or absolute address}
CAN_AVR = 16, 16, iData, CAN_SysTime; // RxPipe, TxPipe, memory, Systemtime
CAN_AVRbaud = CAN_Baud125;
Scheduler = iData;
Watchdog = msec2000; //Watchdog auf 2 Sek setzen.
exceptions = 2;
Ausgelesen wird mit der folgenden Funktion
Code
Procedure ReadSensors;
var Data: word;
begin
Data:=GetADC(1); //Drucksensor1
Senspress1:=-(float(920-Data)/818.0);
Data:=GetADC(2); //Drucksensor 2
Senspress2:=-(float(920-Data)/818.0);
Data:=GetADC(3); //Durchflusssensor
Flow:=(float(Data)); //Rohdaten lesen
end;
Jetzt habe ich hier einige komische effekte:
1. Ist nur der Drucksensor 1 Angeschlossen, so liefert sowohl GetADC(1) als auch GetADC(2) den selben wert, obwohl der zweite eingang eigentlich unbeschaltet ist. Gibt es da intern im Controller ein Übersprechen zwischen den Kanälen? Sind die nicht entkoppelt? Muss ich den zweiten Eingang gegen Masse legen, damit der inaktiv wird?
2. GetADC(3) liefert IMMER 0 obwohl am Pin 0,8V anliegen! Warum? Bug? Programmierfehler? Verständnisproblem?
Brauch da dringend Hilfe wegen Termindruck.