Forum: Mikrocontroller und Digitale Elektronik Spannungsbereich AI PIC18F66K80


von Stefan S. (humus)


Lesenswert?

Hallo Zusammen,

ich beschäftige mich gerade mit der analogen Messdatenaufnahme mit dem 
PIC18F66K80. Ich möchte Spannungswerte von 0 - 5 VDC über den AIß 
aufnehmen. Das Datenblatt verwirrt mich jedoch. Muss ich etwas am 
"COMPARATOR VOLTAGE
REFERENCE MODULE" einstellen um eine Eingangsspannung von 0 - 5V 
aufnehmen zu können oder ist das per default so eingestellt?

Vielen Dank.

von Torben K. (tokuhila)


Lesenswert?

Nein, musst du nicht

PS: Errata lesen, der AD-Wandler hat nen Schuß

: Bearbeitet durch User
von Stefan S. (humus)


Lesenswert?

Hallo Torben,

Errata ???

Ich gebe gerade 4,979V auf den AI2 und bekomme über mein Display 3,840V 
angzeigt und habe einfach keine Ahnung warum. Ich messe die Spannung 
direkt am PIN des uC.
Mein Code sieht folgendermaßen aus:
1
#include <built_in.h>
2
3
// LCD module connections
4
sbit LCD_RS at LATD4_bit;
5
sbit LCD_EN at LATD6_bit;
6
sbit LCD_D4 at LATD0_bit;
7
sbit LCD_D5 at LATD1_bit;
8
sbit LCD_D6 at LATD2_bit;
9
sbit LCD_D7 at LATD3_bit;
10
11
sbit LCD_RS_Direction at TRISD4_bit;
12
sbit LCD_EN_Direction at TRISD6_bit;
13
sbit LCD_D4_Direction at TRISD0_bit;
14
sbit LCD_D5_Direction at TRISD1_bit;
15
sbit LCD_D6_Direction at TRISD2_bit;
16
sbit LCD_D7_Direction at TRISD3_bit;
17
// End LCD module connections
18
19
unsigned int adc_rd, rntc_rd;
20
char txt2[15], txt3[15];
21
22
void main() {
23
  ADCON0 = 0x24;                  //AN2, AN5 als Analog, Rest auf Digital gestellt
24
  ADCON1 = 0x00;                  //AN8 - AN14 auf Digital gestellt
25
26
  TRISA = 0xFF;              // Set PORTA as input
27
  TRISC = 0x00;              // Set PORTC as output
28
  TRISD = 0x00;              // Set PORTD as output
29
30
  ADC_Init();  // Initialize ADC module with default settings
31
  
32
  Lcd_Init();
33
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
34
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
35
  Lcd_Out(1,1,"Spannungsfolgertest");
36
  
37
  while (1) 
38
  {
39
    LATC = 0x00;             // set MUX/I0
40
    adc_rd = ADC_Read(2);    // get ADC value from 1st channel
41
    sprintf(txt3, "V_AI2 = %u mV", adc_rd);                // Trim the string from leading spaces
42
43
    Lcd_Cmd(_LCD_CLEAR);               // Clear display
44
    Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
45
    Lcd_Out(3,1, txt3);
46
    Delay_ms(1000);
47
48
  }
49
}

Mein Compiler ist MicroCPro for PIC. Mache ich hier etwas falsch?

VG

: Bearbeitet durch User
von Torben K. (tokuhila)


Lesenswert?

Du verwechselst ADCON mit ANCON. ADCON konfiguriert den Wandler, ANCON 
legt fest, was ist digital und was analog. Ausserdem bleibt ADC_Read() 
ein Geheimnis. Versorgungsspannung vom PIC ist 5V?

Auszug aus dem Errata:
"The 12-bit A/D performance is outside the data
sheet’s A/D Converter specifications. When used
as a 12-bit A/D, the possible issues are: high offset
error, up to a maximum of ±25 LSBs at 25°C,
±30 LSBs at 85°C, 125°C and -40°C; high DNL
error, up to a maximum of +6.0/-4.0 LSBs; and
multiple missing codes, up to a maximum of
twenty. Users should evaluate the 12-bit A/D
performance in their application using the
suggested work around below. See Table 3 for
guidance specifications."

: Bearbeitet durch User
von Stefan S. (humus)


Lesenswert?

Hallo Torben,

ADCON <-> ANCON war falsch eingesetzt, danke für den Hinweis. Ich habe 
herausgefunden dass der Faktor zwischen meinem angezeigten Wert und dem 
Sollwert 0,819 beträgt. Ist also konstant über den Bereich von 0 - 5 V:

U_ist  U_disp  U_ist/U_disp
[mV]    [mV]    [-]
----------------------------
5000  4092  0,818
4000  3275  0,819
3000  2456  0,819
2000  1636  0,818
1000  815  0,815

-> Ist das Errata ein Zusatz zum Datenblatt des uC? 
(http://ww1.microchip.com/downloads/en/appnotes/00693a.pdf?). Ich werde 
daraus nicht schlau, aber denkst du der Faktor den ich errechnet habe 
kommt daraus Zustande?

VG

von Torben K. (tokuhila)


Lesenswert?

Du weißt aber schon, was 12bit Auflösung bedeuten? 5V = 0xFFF = 4096 :)

: Bearbeitet durch User
von Stefan S. (humus)


Lesenswert?

Ich bin gerade selber drauf gekommen. 1 Tag verschwendet und den Fehler 
in den tiefen der Bithölle gesucht, dabei die "selbstverständlichen" 
Dinge vergessen ...

Trotzdem Danke für die Unterstützung!!!!

von Torben K. (tokuhila)


Lesenswert?

Denk trotzdem an das Errata. Das hat mich auch 1 Tag gekostet bis ich 
wusste warum mein Meßergebnis derart daneben ist. Als Workaround einfach 
einen ungenutzten AINx auf GND legen und messen. Das ist dann dein 
Nulloffset den du von den anderen Meßergebnissen abziehst.

von Stefan S. (humus)


Lesenswert?

Werde ich! DANKE.
Kannst du mir den Link zu dem Dokument posten?

von pete (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.