GetADC will nicht richtig

  • 1
  • 2
  • Page 2 of 2
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 16.02.2012 - 13:09  ·  #9
Hallo Thomas.
Quote by ThomasW69

Es ist die aktuelle Compilerversion 4.99.72.


Ich habe es in der V4.99.71 und V4.99.72 getestet, es läuft ohne Probleme!

Hier mal mein Beispielcode:

Code
program ADC_Test;

{$NOSHADOW}
{ $WG}                     {global Warnings off}

Device = mega1284P, VCC=5;
{ $BOOTRST $0F000}         {Reset Jump to $0F000}

Define_Fuses
  Override_Fuses;
  NoteBook       =  E;
  COMport        = USB;
  LockBits0      =  [];
  FuseBits0      =  [];
  FuseBits1      = [SPIEN, JTAGEN, OCDEN];
  ProgMode       =  JTAG;

Import SysTick, SerPort, ADCPort;

From System Import Float;


Define
  ProcClock      = 14745600;       {Hertz}
  SysTick        = 10;             {msec}
  StackSize      = $00C8, iData;
  FrameSize      = $00C8, iData;
  SerPort        = 57600, Stop1;    {Baud, StopBits|Parity}
  RxBuffer       = 60, iData;
  TxBuffer       = 60, iData;
  ADCchans       = 3, iData, Int2;
  ADCpresc       = 128;

Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
VAR
   Senspress1         : Float;
   Senspress2         : Float;
   Flow               : Float;
   iSenspress1         : Integer;
   iSenspress2         : Integer;
   iFlow               : Integer;

{--------------------------------------------------------------}
{ functions }

// Funktion von ThomasW69 eLab
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;


// Vereinfachte Funktion ohne Berechnung als Integer
Procedure  ReadSensorsInt;
begin
  iSenspress1:=Integer( GetADC(1) );     //Drucksensor1
   iSenspress2:=Integer( GetADC(2) );    //Drucksensor 2
    iFlow:=Integer( GetADC(3) );         //Durchflusssensor
end;

// Berechne anhand der ADC-Werte die Spannung als Float
Function Voltage( var IntWert : integer):FLOAT;
 var
  TeilWert    : Float;
  FloatBuffer : Float;

begin
 //Berechne Wert pro ADC-Einheit, 5V durch 1024 Einheiten
  Teilwert:= 5/1024;
  //Rechne Spannung aus
   FloatBuffer:= Float( IntWert ) * Teilwert;
 return( FloatBuffer );
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
  EnableInts;
   WriteLn(serout, 'Debug: System gestartet...');

  loop //Zyklus

  mdelay(3000); // Kleine Pause :-)   3s
  
  ReadSensorsInt; // Lese Routine von ThomasW69 starten
   WriteLn(serout, 'Sensor1: '+ IntToStr (iSenspress1));
    WriteLn(serout, 'Sensor1 Volt: '+ FloatToStr( Voltage( iSenspress1):3:2));
    
   WriteLn(serout, 'Sensor2: '+ IntToStr (iSenspress2));
    WriteLn(serout, 'Sensor2 Volt: '+ FloatToStr( Voltage( iSenspress2):3:2));

   WriteLn(serout, 'Flow: '+ IntToStr (iFlow));
    WriteLn(serout, 'Flow Volt: '+ FloatToStr( Voltage( iFlow):3:2));

//Ausgabe mit Formel von ThomasW69
  ReadSensors; // Lese Routine von ThomasW69 starten
   WriteLn(serout, 'Sensor1: '+ FloatToStr(Senspress1:3:3));
   WriteLn(serout, 'Sensor2: '+ FloatToStr(Senspress2:3:2));
   WriteLn(serout, 'Flow: '+ FloatToStr(Flow:3:2));
  endloop;
end ADC_Test.


Ich bin kein Profi im Bezug auf den ADC und Float-Berechnung, aber ich komme klar.

Werte die auf der Ser ausgegeben werden:
Sensor1: 503
Sensor1 Volt: 2.46
Sensor2: 326
Sensor2 Volt: 1.59
Flow: 252
Flow Volt: 1.23

Hier die Werte mit Deiner Formel:
Sensor1: -0.510
Sensor2: -0.73
Flow: 252.00

Data kommt maximal mit 1024 rein, wir nehmen mal die Werte von Sensor1 503 Digits/Einheiten an:
1. Step: 920-503 = 417
2. Step: 417 / 818 =0,509779951.....
3.Step: =- 0,509779951

Und das Stimmt auch perfekt mit dem Ausgabe Wert überein "Sensor1: -0.510"

Aber nehme mal das Testprogramm von mir, ich habe leider nicht den gleichen Controller wie Du, aber die Werte passen wie die Faust aufs Auge mit dem was mein Messgerät anzeigt.

Egal ob V4.99.71 oder V4.99.72

Schau doch einfach mal mit der Schift-Taste in den Quellcode rein (Schift drücken und GETADC(-...) anklicken). Bei meiner Routine siehst DU ganz klar die verschiedenen Adressen:

Code
ADC_Test.ReadSensorsInt:
                        .RETURNS   0
                        .BLOCK    76
                        .LINE     77
                        LDI       _ACCA, 001h
                        .FRAME  0
                        CALL       SYSTEM.GETADC

                        STS       ADC_TEST.ISENSPRESS1, _ACCB
                        STS       ADC_TEST.ISENSPRESS1+1, _ACCA
                        .LINE     78
                        LDI       _ACCA, 002h
                        .FRAME  0
                        CALL       SYSTEM.GETADC

                        STS       ADC_TEST.ISENSPRESS2, _ACCB
                        STS       ADC_TEST.ISENSPRESS2+1, _ACCA
                        .LINE     79
                        LDI       _ACCA, 003h
                        .FRAME  0
                        CALL       SYSTEM.GETADC

                        STS       ADC_TEST.IFLOW, _ACCB
                        STS       ADC_TEST.IFLOW+1, _ACCA
                        .ENDBLOCK 80


Vieleicht stimmt die VErsion bei deinen Controller ja wirklich nicht und es stehen am Port 0 und 1 die selben Adressen.

Gruss
Thorsten
ThomasW69
 
Avatar
 
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 16.02.2012 - 13:21  ·  #10
Ich teste mal deinen Code.
Hatte einen Versuchsplan gemach tund gemessen.
Dann nochmal gemessen und anderes Verhalten bekommen. Daher auch den vorherigen Post geändert.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 16.02.2012 - 15:21  ·  #11
Hallo ThomasW69,

anbei mal die Skizze von meinem Testaufbau, den Sensor kannste natürlich auch gegen +5V hängen, dann einfach die 10K gegen GND.

Gruß
Thorsten
Attachments
ADC Skizze
Filename: ADC_Skizze.jpg
Filesize: 30.05 KB
Title: ADC Skizze
Information: ADC Skizze
Download counter: 107
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 19.02.2012 - 14:55  ·  #12
Hallo ThomasW69,

ich habe mir mals das Board von OLMEX angeschaut, der Schaltplan ist an den ADC-Ports etwas verwirrend!

Die ADCs sind nicht an ADO...., sondern bei der CPU an:
PF0 ADC0 Con4.13
PF1 ADC1 Con4.12
PF2 ADC2 Con4.11

Hast Du das mal überprüft!

Gruss
Thorsten
ThomasW69
 
Avatar
 
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 20.02.2012 - 08:14  ·  #13
Hallo Thorsten.

Ich habe mal deinen Code mit dem Auslesen in eine Integervariable implementiert. Was soll ich sagen- es geht!
Wieso? weiß ich nicht und mir erschließt sich auch noch nicht warum der Weg über word Probleme verursacht haben soll.
Was mir aber noch aufgefallen ist, dass ADCs die offen sind (also nicht beschaltet) die Werte eines anderen ADCs anzeigen. Da kommt es irgendwie zum übersprechen. Allerdings ist das bei unterschiedlichen Controllern auch unterschiedlich stark.
Ein Voltmeter am Eingang tut da nichts, das scheint zu hochohmig zu sein. Ein Pulldown-Widerstand allerdings, sorgt dafür, dass der ADC dann in der Tat 0 liefert. So kann ich mir wenigstens erklären, dass ADC0 und ADC1 einen ähnlichen Wert hatten, wenn ADC1 unbeschaltet war.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: GetADC will nicht richtig

 · 
Posted: 20.02.2012 - 09:00  ·  #14
Hallo ThomasW69.
Quote by ThomasW69

Hallo Thorsten.

Ich habe mal deinen Code mit dem Auslesen in eine Integervariable implementiert. Was soll ich sagen- es geht!
Wieso? weiß ich nicht und mir erschließt sich auch noch nicht warum der Weg über word Probleme verursacht haben soll.
Was mir aber noch aufgefallen ist, dass ADCs die offen sind (also nicht beschaltet) die Werte eines anderen ADCs anzeigen. Da kommt es irgendwie zum übersprechen. Allerdings ist das bei unterschiedlichen Controllern auch unterschiedlich stark.
Ein Voltmeter am Eingang tut da nichts, das scheint zu hochohmig zu sein. Ein Pulldown-Widerstand allerdings, sorgt dafür, dass der ADC dann in der Tat 0 liefert. So kann ich mir wenigstens erklären, dass ADC0 und ADC1 einen ähnlichen Wert hatten, wenn ADC1 unbeschaltet war.


Naja, 1. Schritt ist erstmal ok! Der Compiler, Deine Hardware und Deine Beschaltung ist ok.

Da der ADC eh nur 10bit hat, gibt es eh nur 1024 Werte von 0-1023, also spricht eigentlich nichts gegen die Integer-Version. Auch wenn man KEINE +/- Werte hat. ;)

Aber freut mich wenn der Rest schon mal geht.
Alternativ kannste ja mal zum Test meine Funktion/Procedure auf WORD umstellen.

Gruss
Thorsten
  • 1
  • 2
  • Page 2 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: 15   110   125 · Page-Gen-Time: 0.028477s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI