GetADC will nicht richtig

  • 1
  • 2
  • Seite 2 von 2
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 16.02.2012 - 13:09 Uhr  ·  #9
Hallo Thomas.
Zitat geschrieben von 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
 
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 16.02.2012 - 13:21 Uhr  ·  #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
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 16.02.2012 - 15:21 Uhr  ·  #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
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 19.02.2012 - 14:55 Uhr  ·  #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
 
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 20.02.2012 - 08:14 Uhr  ·  #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
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: GetADC will nicht richtig

 · 
Gepostet: 20.02.2012 - 09:00 Uhr  ·  #14
Hallo ThomasW69.
Zitat geschrieben von 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
  • Seite 2 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   109   123 · Page-Gen-Time: 0.040983s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI