View previous topic :: View next topic |
Author |
Message |
rezaf
Joined: 12 Oct 2008 Posts: 7
|
about ADC |
Posted: Wed Aug 26, 2009 2:35 pm |
|
|
Hi
I have problem with ADC commands. I written the code below and in schematic connected a 5v with potentiometer to AN0 pin but when the voltage is 0v the printf command send "1" to RS232 simulator and when voltage is 0.5v the printf command send "102" to RS232 simulator. what is the problem ?? how can I show the real voltage number in printf command ??
(I have tested %d-%Lu and etc.)
Code: | do {
set_adc_channel(0);
delay_us(5);
value = read_adc();
printf("\r\n\nCalibrated A/D = %d\n\r",value);
}while(true); |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
Ttelmah Guest
|
|
Posted: Wed Aug 26, 2009 2:50 pm |
|
|
The ADC returns just an integer number.
It's actual value, will depend on what you are using as a reference. So if (for instance), you are using the 5v supply (not very accurate....), you will get a number from 0 to 255 (if your ADC is set to 8bit - look at the #device statements), or 0 to 1023 (if the ADC is set to 10bit - again look at the #device statement....).
Converting it to a displayable 'voltage', will depend on how much time you want to take, and how accurate you want the result to be.
Assuming a standard ADC, that you _have_ selected 10bit with the device statement, and you are running from the 5v supply, the 'best' conversion will be:
Code: |
//remember value _must_ be declared as a int16, or long
do {
set_adc_channel(0);
delay_us(5);
value = read_adc();
value = (((int32)value*5000)/1024)+5;
value=value/10;
printf("\r\n\nCalibrated A/D = %4.2Lw\n\r",value);
}while(true);
|
This gives the closest possible result with two displayed digits after the decimal point, for the PIC ADC (research the PIC data sheets to see why the divisor is /1024, not /1023, and why acount of 5 is added....).
Best Wishes |
|
|
rezaf
Joined: 12 Oct 2008 Posts: 7
|
Re |
Posted: Thu Aug 27, 2009 5:33 am |
|
|
thanks PCM programmer for the sample code link. thanks Ttelmah for your guide, but say to me that the formula is experimental or is constant ? how can I calculate the formula for other conversion ?
I want to read amplified output voltage of IR LED (RX) that is between 0 to 2.5 volt and connected to pin AN0 and show the number of voltage on LED Bar that connected to port B(according to voltage, LEDs go high)with OUTPUT_B(0xxx) command. do I must give Vref to PIC ?
Best Regards. |
|
|
mkuang
Joined: 14 Dec 2007 Posts: 257
|
|
Posted: Thu Aug 27, 2009 8:28 am |
|
|
Too lazy to even read the datasheet after Ttelmah pointed it out to you right?
When you set up the adc peripheral on the PIC you have to give it a reference voltage. If you don't do it the compiler assumes you are using Vcc - Vss. Since Vss is GND this means the reference voltage by default is just Vcc. Since Vcc is 5000mV that is where the 5000 comes in. Since you are presumably using 10 bit adc, 2^10 is 1024 and that is where that comes in.
You can set up the adc so that it uses an external Vref (2.5V, 1.2V or whatever), you stick that on your VrefH pin and have to tell the compiler to use that Vref instead of Vcc. For series 18 devices the setup is something like:
Code: |
SETUP_ADC_PORTS(AN0 | VSS_VREF)
|
so that if your Vref is 2.5V the adc will return 1023 when your input is 2.5V. |
|
|
rezaf
Joined: 12 Oct 2008 Posts: 7
|
Re |
Posted: Fri Aug 28, 2009 3:42 am |
|
|
sorry I am not lazy don't judge quickly. the microchip's datasheet is not for amateurs also my english is not very good. I read that several times from when I work on PIC but always go confused.
thanks for guides. |
|
|
|