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