GetADC will nicht richtig

  • 1
  • 2
  • Seite 1 von 2
ThomasW69
 
Avatar
 
Betreff:

GetADC will nicht richtig

 · 
Gepostet: 15.02.2012 - 10:04 Uhr  ·  #1
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:
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;


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.
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 15.02.2012 - 10:28 Uhr  ·  #2
Hallo ThomasW69,

so ein ähnliches Problem hatte ich vor kurzem auch mal wieder.

Ich hatte damals zwischen zwei ADC-Ports eine kleine Brücke, die man kaum gesehen hatte :)
aber somit gleiche komische Werte bei den Ports ;)

Und ein weiterer ADC-Port war mal wieder defekt, ich denke mal ESD :(
Nach austausch des AVR's und entfernen der fast nicht sichtbaren Brücke war alles ok.

Schafft der AVR die Floatberechnung überhaupt in einem Rutsch?

hast Du schon mal probiert für jeden ADC einen eigenen Buffer zu verwenden?
Code

Procedure  ReadSensors; 
var 
 Data1: word; 
 Data2: word; 
 Data3: word; 

begin 
  Data1:=GetADC(1);                          //Drucksensor1 
  Senspress1:=-(float(920-Data1)/818.0); 
  Data2:=GetADC(2);                          //Drucksensor 2 
  Senspress2:=-(float(920-Data2)/818.0); 
  Data3:=GetADC(3);                         //Durchflusssensor 
  Flow:=(float(Data3));                //Rohdaten lesen 

end;


Ist nur so eine Vermutung, wenn die Floatberechnung nicht in einem Rutsch passiert.
Ich würde auch mal einen größeren Stack und Frame testen :) (Ich weiss Speicher ist knapp ;) )

Ansonsten lese ich meine ADC's genauso aus wie Du. Bei dem Init verwende ich nur noch zusätzlich den "int2", damit der Wert etwas ruhiger ist.

Gruss
Thorsten
ThomasW69
 
Avatar
 
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 15.02.2012 - 11:10 Uhr  ·  #3
Hallo Thorsten

Ich habe mal deinen Codevorschlag implementiert. Der Effekt ist der selbe, also lag es nicht daran.

Zum Test habe ich mal den dritten ADC auf Masse gezogen (Drahtbrücke). Mit Voltmeter am PF2 pin gemessen und da liegen 0V. Dennoch liefert GetADC(3) einen Wert von 920 digits. Da der AT90CAN128 ja 10 bit ADCs hat würde das einer Spannung von 4,5V entsprechen.
Die liegen da aber definitiv nicht an.

Der Drucksensor am PF0 (GetADC(1)) hingegen liefert 4,5V. Daher vermute ich einen Bug in der GetADC Routine. Wahrscheinlich liest GetADC(3) auch den ersten ADC aus.

Controllerwechsel: Selber effekt, also kein ESD Schaden.
Leiterplatte kontrolliert: Keine Brücken.
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 15.02.2012 - 12:22 Uhr  ·  #4
Hallo Thomas,

hast du irgendwo im Programm ein DDRF:=%xxxxx111 drin ?

gruss
Harry

PS: Ich lese die ADCs immer mit Daten:=Integer(GetADC(1)) aus
ThomasW69
 
Avatar
 
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 15.02.2012 - 13:08 Uhr  ·  #5
Nein das DDRF habe ich nicht angefasst. Es sollte also so eingestellt sein wie es der ADC Treiber tut. Vielleicht stimmt ja auch was im def-file für den AT90CAN128 nicht.
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 15.02.2012 - 13:54 Uhr  ·  #6
Hallo Thomas,

welche Compiler Version nutzt Du?

Dann werde ich diese Version mal mit meinem ADCs testen.

AREF extern oder intern?
AVCC mit Kondensator und Induktivität?

Gruß
Thorsten
ThomasW69
 
Avatar
 
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 15.02.2012 - 14:39 Uhr  ·  #7
ThomasW69
 
Avatar
 
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 16.02.2012 - 12:53 Uhr  ·  #8
Habs aufgegeben und nehme einen externen LTC1867. :-(
  • 1
  • 2
  • Seite 1 von 2
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   135   149 · Page-Gen-Time: 0.033769s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI