GetADC will nicht richtig

  • 1
  • 2
  • Page 1 of 2
ThomasW69
 
Avatar
 
Subject:

GetADC will nicht richtig

 · 
Posted: 15.02.2012 - 10:04  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 15.02.2012 - 10:28  ·  #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
 
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 15.02.2012 - 11:10  ·  #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
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 15.02.2012 - 12:22  ·  #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
 
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 15.02.2012 - 13:08  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 15.02.2012 - 13:54  ·  #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
 
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 15.02.2012 - 14:39  ·  #7
ThomasW69
 
Avatar
 
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 16.02.2012 - 12:53  ·  #8
Habs aufgegeben und nehme einen externen LTC1867. :-(
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   135   149 · Page-Gen-Time: 0.026782s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI