|
|
View previous topic :: View next topic |
Author |
Message |
eliberg Guest
|
what's wrong with this simple A/D code? |
Posted: Thu Feb 16, 2006 7:22 am |
|
|
Hi to everyone,
I'm trying to simply convert an analog input using the ad module of the PIC18F4431.
The analog input is on the AN0 pin, the range of the voltage is 0-5V (Vdd-Vss).
The problem is that whatever I put on the AN0 pin (0V, 1V, 3V...5V) I always read adc3=1023.
Trying to visualize adresh and adresl I obtained that adresh=3 and adresl=255.
I'v also tried setting manually each of the AD registers, but it was the same. Always 1023.
What's wrong?
The code is the following:
#include <18F4431.h>
#device adc=10
#use delay(clock=20000000)
#fuses HS, NOPROTECT, NOBROWNOUT, NOWDT, NOLVP, PUT, NOSTVREN, NOFCMEN, NOIESO, MCLR
#use rs232(baud=19200,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#define led_status PIN_D7
void main()
{ unsigned int16 adc3=0;
output_bit(led_status,1);
delay_ms(2000);
output_bit(led_status,0);
printf("\n\r adc alive");
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
while (1)
{
set_adc_channel(0);
delay_us(20);
adc3=read_adc( );
printf("\n\r adc=%lu",adc3);
delay_ms(1000);
}
}
Thank you.
Eli |
|
|
dr Guest
|
ADC problem |
Posted: Thu Feb 16, 2006 7:57 am |
|
|
setup_adc_ports(sAN0|VSS_VDD);
I think your syntax is wrong here. In my usage, setup_adc_ports( ALL_ANALOG) always works. I don't know how that would pan out with the
18F4431 though. |
|
|
rnielsen
Joined: 23 Sep 2003 Posts: 852 Location: Utah
|
|
Posted: Thu Feb 16, 2006 9:38 am |
|
|
Change this to:
Plus, your result will be a 10 bit value and uses two full Bytes. This leaves six bits unused. The register bit ADFM controls which 'side' of these two bytes will be stuffed with zero's. ACCON2 contains bit ADFM. ADFM defaults to a value of '0'. This will Left justify the result, meaning the lower six bits will be zero's. Setting ADFM to a '1' will Right justify the result and, maybe, give you the result you are looking for.
Ronald |
|
|
eliberg Guest
|
|
Posted: Thu Feb 16, 2006 11:05 am |
|
|
Thanks for the replays.
First of all I need just one AN pin, so I cannot use ALL_ANALOG, also because the other possible AN pins are used as digital I/O, in my project.
In the 18f4431.h "setup_adc_ports(sAN0|VSS_VDD)" is the right syntax to set AN0 as analog, from 0 to 5V.
Second, I'm not sure I can use #device adc=16, because the AD module is a 10bit AD converter, in the 18F4431, so I can set adc=8 or adc=10.
Anyway I will try, thanks for the idea.
In the meanwhile I think I solved the problem by myself. Inserting "set_tris_a(0b00011001)" now the adc works. The only strange thing is that the digital value becomes 255 when the input voltage is 4V, not 5V.
Any idea for this new problem?
Thank you very much!
Eli |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Thu Feb 16, 2006 11:19 am |
|
|
Quote: |
setup_adc_ports(sAN0|VSS_VDD)
|
Is right.
If you use #device adc=10 the output range is 0 - 03FF
If you use #device adc=16 the output range is 0 - FFC0
Quote: |
The only strange thing is that the digital value becomes 255 when the input voltage is 4V, not 5V.
|
Nop. It would be: Code: |
255 = 1.25V
512 = 2.50V
1024 = 5.00V |
Unles you are looking only the less significant register of 0x03FF
Humberto |
|
|
eliberg Guest
|
|
Posted: Mon Feb 20, 2006 7:34 am |
|
|
Ok, with #device=10 I obtain 1023 at 4V, instead of 5V.
The same problem with #device=8 (255 at 4V).
I don't know where is the problem!
eli |
|
|
rberek
Joined: 10 Jan 2005 Posts: 207 Location: Ottawa, Canada
|
|
Posted: Mon Feb 20, 2006 8:16 am |
|
|
Do you know for a fact that your supply rail is 5V?
If it has drooped to 4V, then you will get the full reading at the lower voltage. _________________ The difference between genius and stupidity is that genius has its limits... |
|
|
eliberg Guest
|
|
Posted: Fri Feb 24, 2006 6:56 am |
|
|
Yes, I'm sure my voltage is 5V, but if I set my Vdd, for example, to 5.5V, the ADC gets 1023 to 4.5V.
Do you think it cuold be a "broken" PIC?
Thanks
eli |
|
|
Ttelmah Guest
|
|
Posted: Fri Feb 24, 2006 7:41 am |
|
|
Double check that the supply is actually 'right' at pin11. This is the pin used for the analog reference.
Yes, it could be a faulty PIC, possibly in the MOSFET used to connect the reference to the ADC.
Best Wishes |
|
|
|
|
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
|