www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18f 67j60 ADC Problem


Autor: Maxim (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bei mir klappt die Umwandlung von einem Spanungswert zwischen 0,8 und 
3,3 Volt nicht richtig.
Im Ergebnisregister ADRESH und ADRESL stehen immer die gleiche Werte 
egal, wenn ich 1V oder z.B. 2V oder 3Volt am Eingangspin bereitstelle.
Die Werte im ADRESH und ADRESL Register ändern sich, wenn ich die 
Versorgungsspanung vom Kontroller ganz abtrenne. (Kontroller 
positioniert auf einer Platte mit Webmanagment, wo auf der Seite 
Ergebnisse stehen ->Bild)
Datenblatt: http://www.uploadarea.de/files/bgqh1mrewibz8w8bo1e91gzjj.pdf
Hier ist komlette Code aus Datei CustomHTTPApp.c ,wo das Ganze 
ausgeführt wird:

#define __CUSTOMHTTPAPP_C
#include "TCPIPConfig.h"
#if defined(STACK_USE_HTTP2_SERVER)
#include "TCPIP Stack/TCPIP.h"
#include "MainDemo.h"    // Needed for SaveAppConfig() prototype
#include "ADC.h"

/*###################################################################### 
######*/

unsigned int ADC_Convert_Spgswert(void);
unsigned char ADC_Convert_Testvariable(void);

void ADC_Init(void);
BOOL RuckgabewertInput1=0;
BOOL RuckgabewertInput2=0;
BOOL RuckgabewertInput3=0;
BOOL RuckgabewertInput4=0;

unsigned int valuemax2;

HTTP_IO_RESULT HTTPExecutePost(void)
{
  BYTE filename[20];
  MPFSGetFilename(curHTTP.file, filename, sizeof(filename));
}

BYTE HTTPNeedsAuth(BYTE* cFile)
{
  return 0x80;      // No authentication required
}

#if defined(HTTP_USE_AUTHENTICATION)
BYTE HTTPCheckAuth(BYTE* cUser, BYTE* cPass)
{
  return 0x00;      // Provided user/pass is invalid
}
#endif

HTTP_IO_RESULT HTTPExecuteGet(void)
{
  BYTE *ptr;
  BYTE filename[20];

  MPFSGetFilename(curHTTP.file, filename, 20);//Make sure BYTE 
filename[] above is large enough for your longest name

  if(!memcmppgm2ram(filename, "forms.htm",9))
  {
    ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led4");
    if(ptr){                     //^ ptr wird dem led4 wert zugewiesen
       LED5_IO = (*ptr == '1');    // RF5
      RuckgabewertInput4= (*ptr == '1');
        }
    ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led3");
    if(ptr){
      LED4_IO = (*ptr == '1');  // RF4
      RuckgabewertInput3= (*ptr == '1');
        }
    ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led2");
    if(ptr){
      LED3_IO = (*ptr == '1');  // RF3
      RuckgabewertInput2= (*ptr == '1');
        }
    ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led1");
    if(ptr){
      LED2_IO = (*ptr == '1');  // RF2
      RuckgabewertInput1= (*ptr == '1');
        }
  }
return HTTP_IO_DONE;
}

void HTTPPrint_ledSelected(WORD num, WORD state)
{
  switch (num)
  {
    case 4: if ((((RuckgabewertInput4==1)&& (state==TRUE)) || 
((RuckgabewertInput4==0)&& (state==FALSE))))
        {          TCPPutROMString(sktHTTP, (ROM BYTE*)"SELECTED"); 
}
        break;
    case 3: if ((((RuckgabewertInput3==1)&& (state==TRUE)) || 
((RuckgabewertInput3==0)&& (state==FALSE))))
        {          TCPPutROMString(sktHTTP, (ROM BYTE*)"SELECTED"); 
}
        break;
    case 2: if ((((RuckgabewertInput2==1)&& (state==TRUE)) || 
((RuckgabewertInput2==0)&& (state==FALSE))))
        {          TCPPutROMString(sktHTTP, (ROM BYTE*)"SELECTED"); 
}
        break;
    case 1: if ((((RuckgabewertInput1==1)&& (state==TRUE)) || 
((RuckgabewertInput1==0)&& (state==FALSE))))
        {          TCPPutROMString(sktHTTP, (ROM BYTE*)"SELECTED"); 
}
        break;

    default:      num = 0;
  }
return;
}

void HTTPPrint_config_led (WORD num)
{
switch (num)
    {
  case 1:
  TCPPutString(sktHTTP, HTTPGetROMArg(curHTTP.data, (ROM BYTE 
*)"led1"));
  break;
  case 2:
  TCPPutString(sktHTTP, HTTPGetROMArg(curHTTP.data, (ROM BYTE 
*)"led2"));
  break;
  case 3:
  TCPPutString(sktHTTP, HTTPGetROMArg(curHTTP.data, (ROM BYTE 
*)"led3"));
  break;
  case 4:
  TCPPutString(sktHTTP, HTTPGetROMArg(curHTTP.data, (ROM BYTE 
*)"led4"));
  break;
  default: break;
    }
}

void HTTPPrint_Spgswert(void)
{

  BYTE TestArray[12];         //="MAXIM12\n"; //BYTE *TestPtr= 
"Maxim34\n";
  ADC_Init();
  ADC_Convert_Spgswert();
  uitoa (ADRESH,TestArray);
  TCPPutString(sktHTTP,TestArray);
            //TCPPutString(sktHTTP,&TestPtr);
            //TCPPutROMString(sktHTTP,(ROM 
BYTE*)ADC_Convert_Spgswert());
            //  TCPPutROMString(sktHTTP,(ROM BYTE*)"TEST");
            //TCPPutString(sktHTTP, HTTPGetROMArg(curHTTP.data, (ROM 
BYTE *)"led4"));
  return;
}

void HTTPPrint_Spgswertneu(void)
{
  BYTE TestArray[12]; //
   uitoa (ADRESL,TestArray);  // Umspeichern von Ergebnis fuer Rückgabe 
des Wertes
  TCPPutString(sktHTTP,TestArray);    // Rückgabe des Wertes
}
void HTTPPrint_Spgswerterg(void)
{
  BYTE TestArray[12]; //BYTE *TestPtr= "Maxim34\n";
   uitoa (valuemax2,TestArray);
  TCPPutString(sktHTTP,TestArray);
}

void ADC_Init(void)
{   ADCON0bits.ADON = 1;  //ADC einschalten
  ADCON1 = 0b00011011; // 0bxxxx1011 schaltet i/O von AN0 bis AN3 als 
Analog, ab AN4 als Digital
            //  0b--01xxxx VCFG0 [VREF+ bei(AN3)] als + A/Eingang
  ADCON0 = 0b00001100; // 0bxx0011xx; verbinden ADC mit dem Eingang AN3 
/RF2
  ADCON2 = 0b00100101; //ADCON2 = 0bx-xxx101; Frequenzverhältnis 
zwischen ADC-Takt und PIC-Takt
            //ADCON2 = 0bx-000xxx; für korrekte Messung: genug Zeit für 
Um-/Aufladung des Kondensators
             //ADCON2 = 0b0-xxxxxx; Links oder rechts von ADRESH ADRESL 
Register anhängen
// ADRESL.right 000 - Zeit automatisch
//  ADCON2 = 0b00101101; // Zeit abgeleitet von A/D RC oscillator . 101 
FOSC/32 Frequenz 22.86 MHz
  //ADCON0 |= 0x01;   // ADC ein   //ADCON0 &= ~(0x01); // ADC aus
}

unsigned int ADC_Convert_Spgswert(void)
{
  ADCON0bits.GO = 1;             // start an ADC conversion and return 
the 8 most-significant bits of the result
    while (ADCON0bits.GO == 1);    // wait for it to complete
  valuemax2 = ADRESH;           //value = (int)ADRESH;
  valuemax2 <<= 8;
  valuemax2 |= ADRESL;
    valuemax2 >>= 6;


 return valuemax2;
}

: Verschoben durch Moderator
Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???  wenn jemand eine Idee hat woran es liegen könnte, wäre super!!!

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe schon hingekriegt:
void ADC_Init(void)
{
  ADCON1 = 0b00001011;
  ADCON0 = 0b00001100;
  ADCON2 = 0b00111000;
  ADCON0bits.ADON = 1;
}
mit genauigkeit stimmt noch nocht (z.B. statt 3,07  2,9Volt),
aber ich schaue weiter...

Autor: Michael Roek (mexman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> mit genauigkeit stimmt noch nocht (z.B. statt 3,07  2,9Volt),
> aber ich schaue weiter...

Das sind ja grad mal 5% Abweichung.
Welche Referenz benutzt Du, intern oder extern?
Schon mal gemessen?

Gruss

Michael

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich benutzte interne Spannung von 4 Digitalen Ausgängen über 
R2R-Netzwerk Digital-Analog-Umsetzung realisiert.
Maximal einstellbare Spanung 3,06 Volt (bei 4 eingeschalteten Pins).

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja gemessen mit Fluke 21 III Multimeter (im September wurde neu 
Kalibriert).

Grüße,  Maxim

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
villeicht interpretiere ich ADC Werte falsch,
ich bin nicht sicher, ob mein Faktor stimmt.

ADC_Wert = 963 oder 975 (schwankt) für angelegte 3,06 Volt

wenn bei Pins stellt Microkontroller eine Spannung von 3,26 Volt ein 
(mit Multimeter bei beliebigen Pins gemessen), dann für 10 Bit Wandlung 
wird auch 3,26 Volt genommen?
Im Datenblatt habe ich nicht gefunden, welche Spannung dafür benutzt 
Mikrokontroller.

wenn 3,26V => 3,26 / 1024 = 0,00318 V = 3,18 mV

-> ADC_Wert * Faktor = 963*0,00318 = 3,0658 V dann stimmt das!
-> ADC_Wert = 975 =>   975*0,00318 = 3,1005 V würde auch noch passen!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.