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);
}
}
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);
}
}