PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : A/D Problem



Daniel2412
22.09.2008, 18:53
Hallo,

ich hab schon wieder ein Problem. Ich habe einen PIC 16F72 und einen GP2D120 Sensor. Der 10bit A/D-Wandler ist mit einer Referenzspannung (Vref+ 2.7V und Vref- 0.6V) eingestellt. Die Berechnung zur Kurve ist D=A/(X-B). Die Werte die rauskommen sind von 4cm an bis 11cm echt gut. Die Abweichung beträgt max. 2 mm. Das Ergebnis lasse ich mir auf 7Segmentanzeigen ausgeben. Jetzt mein Problem. Ziehe ich den Sensor über 11cm vom Gegenstand weg bleiben trotzdem die 11cm auf der Anzeige stehen und erst bei ca. 20cm ändert sich der Wert auf der Abzeige wieder. Um den Fehler zu einzugrenzen habe ich mir den A/D-Wert auf die 7Seg.-Anzeigen ausgeben lassen. Und bei 256 hängt er wirklich fest, obwohl die Spannung von 11cm auf 20cm um ca. 0.4V sinkt. Bin ich dann ca. bei 20cm angelangt springt er A/D-Wert mit einmal so auf 60 und alles ist wieder ok. Hab es schon mit einem anderen Controller (gleicher Typ) getestet und das gleiche. 256 ist auch eine komische Zahl.

Vielleicht hat ja jemand eine Idee.




unsigned short mask(unsigned short num)
{
switch (num)
{
case 0 : return 0x7E;
case 1 : return 0x30;
case 2 : return 0x6D;
case 3 : return 0x79;
case 4 : return 0x33;
case 5 : return 0x5B;
case 6 : return 0x5F;
case 7 : return 0x70;
case 8 : return 0x7F;
case 9 : return 0x7B;
}
}



unsigned int weg4,adwert, digit,digit1,digit10,digit100,digit_no;

void interrupt()
{
if (digit_no==0)
{
PORTB = digit1;
PORTC = 0x80;
digit_no = 1;
}
else
{
PORTB = digit10;
PORTC = 0x40;
digit_no = 0;
}
TMR0 = 0;
INTCON = 0x20;
}

void main()
{
ADCON0 = 0x41; //ADC einschalten
ADCON1 = 0x8F;
TRISA = 0xFF;
PORTB = 0;
TRISB = 0;
PORTC = 0;
TRISC = 0;
//adwert = 1023;
OPTION_REG = 0x80;
TMR0 = 0;
INTCON = 0xA0;

while (1)
{
ADCON0 = 0x45; //ADC Starten
//adwert--;
adwert = ADC_Read(0);

weg4=4731/(adwert+155);

digit = weg4 % 10u;
digit1 = mask(digit);
digit = (weg4 / 10u) % 10u;
digit10 = mask(digit);
Delay_ms(200);
}
}

theborg
22.09.2008, 20:22
hi ja ist klar das er bei 255 festhängt der adc kan nur 8bit

Daniel2412
22.09.2008, 20:24
Hmm, im Datenblatt steht das der 16F872 einen 10bit A/D hat

Daniel2412
22.09.2008, 20:26
4cm Abstand zum Gegenstand entspricht einen A/D-Wert von 1023. Bei 30cm Abstand entspricht de A/D-Wert 0.

theborg
22.09.2008, 21:28
jo du hast oben im text die 8 vergessen deswegen hatte ich des falsche db :P wieviel V schmeist den der sensor aus ?

Daniel2412
22.09.2008, 21:35
Er gibt von ca. 3Volt bis unter 0,4 raus. Richtig sauber arbeiten tut er aber bei mir von 2,7-0,6 Volt. Ich werde morgen noch mal ein wenig daran rumbasteln und ihn mal ohne Referenzspannung betreiben. Vielleicht geht es dann ja besser.

theborg
22.09.2008, 23:02
da haste des prob wen er 3v rausgibt dann reicht dein vref net