PIC 16F886 ADC Problem

OP #2281143
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
OP #2281428
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren