Forum: Mikrocontroller und Digitale Elektronik PIC 16F886 ADC Problem


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Ich habe eine kleines Problem mit der Wandlung von ADC-Werten. Dabei 
verwende ich diese Funktion (mit HI-Tech PICC Compiler):
1
// ADC setup
2
VCFG = 0;                                              // Use Vdd as Ref  
3
ADFM = 1;                                              // Right justified A/D result
4
ADCS0 = 1;                                             // 16 TOSC prescale
5
ADCS1 = 0;
6
ADCS2 = 1;
7
CHS0 = 0;                                              // Channel select AN0
8
CHS1 = 0;
9
CHS2 = 0;
10
ADON = 1;                                              //Turn A/D on
11
12
unsigned int read_a2d(unsigned char channel){          // ADC channel
13
  channel &= 0x0F;                                     // Truncate channel to 4 bits
14
  ADCON0 &= 0b11000001;                                // Terminate and clear current channel select
15
  ADCON0 |= (channel << 2);                            // Apply the new channel select
16
  GO = 1;                                              // Initiate conversion on the selected channel
17
  while(GO) continue;                                  // Wait for ADC conversion to complete
18
  return((ADRESH << 8) + ADRESL);                      // Return result
19
}
20
21
void get_error(int desired){
22
  int adc = read_a2d(0)
23
  int error = desired - adc;
24
25
  if(error > 0){
26
    RC0 = 1;
27
    RC1 = 0;
28
  }
29
  else{
30
    RC0 = 0;
31
    RC1 = 1;
32
  }
33
  if(adc == 0)  RC2 = 1;
34
  else          RC2 = 0;
35
}

Dabei habe ich bemerkt, dass das Resultat nicht immer gleich ist. Laut 
Datenblatt sollte +- 1LSB sein, aber zum Teil wird der Wert '0' 
ausgegeben. Und dies umso häuffiger je extremer der AD Wert vom von 0 
Abweicht.
Soll heissen, wenn 'desired' grösser ist als der momentane Wert, 
leuchtet die Led an RC0. Ist der Wunschwert kleiner als der momentane 
Wert, so flackern alle LEDs, wobei die LEDs an RC1 und RC2 genau gleich 
gepulst werden. Die Frequenz von RC1 und RC2 wird mit zunehmendem 
Unterschied immer grösser.

Habt ihr eine Idee, woran dies liegen könnte, da das Phänomen nur in 
eine Richtung existiert?

Besten Dank für die Unterstützung,
MFG
Patrick
von holger (Gast)


Lesenswert?

>Laut Datenblatt sollte +- 1LSB sein

Ha, ha. Vergiss das.
von Patrick B. (p51d)


Lesenswert?

Darf ich fragen wieso?
OK, bei einer Mittelwertbildung wirds dann genauer, aber ich verstehe 
immer noch nicht, wie es dann zu einer Tolleranz von +- 1024 kommt.
von Patrick B. (p51d)


Lesenswert?

Neue Erkenntnis:
Sobald ich den Kanal fix bestimme und immer nur diesen abfrage, läuft es 
perfekt. Wechsle ich aber die Kanäle (z.B. 0-2) und wandle diese 
nacheinander, so bekomme ich bei jeder ~10-14 Wandlung ein Fehler, wobei 
das Resultat 0 ist, egal welche Spannung angelegt ist.

Ist der PIC nicht für das Abfragen mehrerer Kanäle ausgelegt?
von Spike H. (-rox-)


Lesenswert?

Der µC hat nur einen ADC, d.h. ein Multiplexer wechselt zwischen den 
verschiedenen Eingängen um mehrere analoge Kanäle zu implementieren. Du 
musst nach dem Umschalten eine Weile warten bevor du mit der AD-Wandlung 
beginnen kannst, damit sich der Kondensator zwischen MUX und ADC 
aufladen kann.

Quelle:
http://www.sprut.de/electronic/pic/grund/adc.htm
von Andreas B. (biosniper)


Lesenswert?

Aquisition Time ist das Stichwort.
von Dieter Werner (Gast)


Lesenswert?

Am günstigsten ist die Kanalumschaltung direkt nach dem Lesen von 
ADRES, dann hat man automatisch genügend Ladezeit für den Kondensator.
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.