|
|
View previous topic :: View next topic |
Author |
Message |
eng.khlaif
Joined: 19 Apr 2008 Posts: 7
|
GP2D12 sensor problem urgent need !!!!!!!!! |
Posted: Tue Apr 29, 2008 8:38 am |
|
|
iam using the following sample code that will read the voltage from sensor( this sensor gives analog output) then i want to display it on and LCD
but when i connect the circuit with the sensor it always gives reading with out moving any object toward the sensor ?(GP2D12) sensor
Code: | #include <16F877a.H>
#device adc=10
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#include <lcd.c>
//============================
void main()
{
int16 adc_value;
float volts;
lcd_init();
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);
while(1)
{
adc_value = read_adc();
volts = (float)(adc_value * 5)/1024.0;
printf(lcd_putc, "\f%3.2f", volts);
delay_ms(500);
}
} |
|
|
|
Matro Guest
|
|
Posted: Tue Apr 29, 2008 8:41 am |
|
|
I'm not sure to really understand the problem. But from what I do, you complain that the ADC gives a result even if there is nothing moving close to the sensor.
That's normal, you ask the ADC for a value and it will give you one, whatever could be the sensor state.
Matro |
|
|
eng.khlaif
Joined: 19 Apr 2008 Posts: 7
|
|
Posted: Tue Apr 29, 2008 1:36 pm |
|
|
Matro wrote: | I'm not sure to really understand the problem. But from what I do, you complain that the ADC gives a result even if there is nothing moving close to the sensor.
That's normal, you ask the ADC for a value and it will give you one, whatever could be the sensor state.
Matro |
exactly it gives a reading without ask it
what i need is i want a reading just when the object is moving
so pls how can i modify the code so that it gives my reading based just on the sensor reading |
|
|
RLScott
Joined: 10 Jul 2007 Posts: 465
|
|
Posted: Tue Apr 29, 2008 1:43 pm |
|
|
eng.khlaif wrote: | ...how can i modify the code so that it gives my reading based just on the sensor reading |
Well, what voltage change does the sensor produce when something moves? You could compare the A/D reading with a previous reading and print the result only if the reading is changed enough.
Robert Scott
Real-Time Specialties |
|
|
eng.khlaif
Joined: 19 Apr 2008 Posts: 7
|
|
Posted: Tue Apr 29, 2008 3:19 pm |
|
|
RLScott wrote: | eng.khlaif wrote: | ...how can i modify the code so that it gives my reading based just on the sensor reading |
Well, what voltage change does the sensor produce when something moves? You could compare the A/D reading with a previous reading and print the result only if the reading is changed enough.
Robert Scott
Real-Time Specialties |
the sensor will read produce a value between 0.41-2.4 volts
what i want to say is from where does it display the reading while i am not moving any objects toward it |
|
|
RLScott
Joined: 10 Jul 2007 Posts: 465
|
|
Posted: Tue Apr 29, 2008 7:25 pm |
|
|
eng.khlaif wrote: |
the sensor will read produce a value between 0.41-2.4 volts
what i want to say is from where does it display the reading while i am not moving any objects toward it |
You question does not make any sense.
Robert Scott
Real-Time Specialties |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Tue Apr 29, 2008 8:33 pm |
|
|
First of all, how do you have the sensor connected? Do you have any form of "smoothing" capacitor as illustrated in the example at the below link?
http://www.oopic.com/gp2d12.htm
The GP2D12 always puts out a voltage which is dependent on how close it is to an object. As RLScott said you need to decide how much change in distance (voltage) will trigger a display or you can simply display the distance reading constantly which is what you have now.
If you want a change to trigger the display you will have to do the following:
Define a constant value as the amount of voltage change trigger point (we will call it TRIG).
During start-up, get the adc_value and put it into a holding variable (we will call it OLD) to establish your initial baseline.
Now Enter the main loop.
Main Loop:
Get the current adc_value and compare it to OLD. If the difference exceeds TRIG then you save the current adc_value into OLD
and display OLD.
Delay however long you wish, blank the display at this point if you don't want the display to show constantly and go through the loop again. |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Tue Apr 29, 2008 10:17 pm |
|
|
Another tip that I would like to add is regarding how to setup accordingly the AD converter
of the PIC. Being the maximum expected output voltage very close to 1/2 Vcc, a good
improvement in the measurement would be achieved replacing:
setup_adc_ports(AN0); by
setup_adc_ports(AN0_VREF_VREF);
Where:
AN0 = Analog input
A2 = VREF- = VRefl = Gnd
A3 = VREF+ = VRefh = 2.55V
This give a resolution of 10mV per step using the ADC in 8 bits mode. Another point
to take care with this type of sensors is that its output do not follows a linear function,
hence you would need to determine what distance correspond to what voltages.
If these oddities are a problem in your application, they could be corrected using
a linearizing table.
Humberto |
|
|
eng.khlaif
Joined: 19 Apr 2008 Posts: 7
|
|
Posted: Wed Apr 30, 2008 11:38 am |
|
|
dear all, thanks for your comments
now it seem that the sensor is working well with me and now i am to convert the voltage into equivalent distance and i modify my code as shown below
what i want to ask it now is how to display voltage on the first line on LCD and distance on the second line as below
V=voltage value
D=read distance
Code: | #include <16F877a.H>
#device adc=10
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#include <lcd.c>
//============================
void main()
{
float distance;
int16 adc_value;
float volts;
lcd_init();
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);
while(1)
{
adc_value = read_adc();
volts = (float)(adc_value * 5)/1023.0;
if(volts >=0.41 && volts <0.53)
{ distance=(148.3333 -volts *166.667);
printf(lcd_putc, "\fV=%3.2f", volts);
printf(lcd_putc, "\fD=%3.2f", distance);
}
else
if(volts >=0.53 && volts <0.68)
{ distance=(117.16933 -volts*107.867 );
printf(lcd_putc, "\fV=%3.2f", volts);
printf(lcd_putc, "\fD=%3.2f", distance);
}
else
if(volts >=0.68 && volts <0.92)
{ distance=(79.435 - volts*52.375 );
printf(lcd_putc, "\fV=%3.2f", volts);
printf(lcd_putc, "\fD=%3.2f", distance);
}
else
if(volts >=0.92 && volts <1.17)
{ distance=(58.1508 - volts*29.24);
printf(lcd_putc, "\fV=%3.2f", volts);
printf(lcd_putc, "\fD=%3.2f", distance);
}
else
if(volts >=1.17 && volts <1.57)
{ distance=(45.20475 - volts * 18.175);
printf(lcd_putc, "\fV=%3.2f", volts);
printf(lcd_putc, "\fD=%3.2f", distance);
}
else
if(volts >=1.57 && volts <1.83)
{ distance=(33.4569 - volts*10.6923);
printf(lcd_putc, "\fV=%3.2f", volts);
printf(lcd_putc, "\fD=%3.2f", distance);
}
else
if(volts >=1.83 && volts <2.24)
{ distance=(26.37895 - volts * 6.82456);
printf(lcd_putc, "\fV=%3.2f", volts);
printf(lcd_putc, "\fD=%3.2f", distance);
}
else
lcd_putc("\f Out Of Range \n");
//printf(lcd_putc, "\f%3.2f", volts);
delay_ms(9500);
}
} |
|
|
|
lasal
Joined: 25 Jan 2012 Posts: 13
|
use both lcd lines |
Posted: Mon Oct 01, 2012 9:52 pm |
|
|
Code: |
printf(lcd_putc, "\fV=%3.2f", volts); // voltage print in first line
printf(lcd_putc, "\nD=%3.2f", distance); // distance print in second line |
|
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Oct 02, 2012 4:47 am |
|
|
Please don't answer 4.5 year old questions.
It is a waste of your time as the original topic poster has long disappeared. Even worse, it is also wasting our time as this ancient topic is on top of the thread list again where everybody takes a look. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|