|
|
View previous topic :: View next topic |
Author |
Message |
elphi
Joined: 17 Apr 2007 Posts: 20 Location: tijuana,bajacalifornia,mexico
|
ADC inconsistencies |
Posted: Mon Jul 02, 2007 12:33 pm |
|
|
I have a little problem, I connected an LCD with a 18f4420 , I just tried to emulate a digital voltmeter.
It works, but with some inconsistencies, I mean, it shows a measure, but it changes in a range of +-70mV, I don't know why, but this behavior is not adequate to my project.
I also measured the same voltage at same time with my digital Multimeter (in parallel), and the voltage never changes in the multimeter but in the LCD it changes.
I tried to put a capacitor in parallel with the ADC pin, but it still varies.
Any help will be well came.
this is may code:
Code: |
#include <18F4420.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
//#FUSES XT //Crystal osc <= 4mhzUT
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=4000000)
#include <hplcd.C>
#include <stdio.h>
#include <stdlib.h>
#use fast_io(d)
#use standard_io(c)
int16 vi=0;
float va;
#int_EXT
EXT_isr()
{
}
#int_EXT1
EXT1_isr()
{
}
void main()
{
set_tris_d(0);
set_tris_c(1);
output_c(0xff);
delay_ms(1000);
output_c(0x0);
setup_adc_ports(AN0|VSS_VDD);
// setup_adc_ports(AN0|VSS_VREF);
setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_2);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(GLOBAL);
setup_low_volt_detect(FALSE);
// setup_oscillator(FALSE);
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);
//my code
lcd_init();
printf(lcd_putc,"\f");
printf(lcd_putc,"VOLTAGE:");
while (true)
{
lcd_gotoxy(1,2);
vi=read_adc();
va=(vi*5/1023.0);
printf(lcd_putc,"%.6f",va);
}
}
|
_________________ Every little thing gonna be alright |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jul 02, 2007 12:47 pm |
|
|
Quote: |
#FUSES LVP
#use delay(clock=4000000)
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);
setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_2);
|
You need to fix the problems shown above.
Do you have a low voltage programmer ? 99% of all people have
a high-voltage programmer. In that case, the fuse must be NOLVP.
You have the #use delay() set for one frequency, but you have
the oscillator set to a different frequency.
Look in the A/D section of the 18F4420 data sheet. What clock divisor
does it say to use for 4 MHz operation ?
Where's the line of code to set the channel ? Example:
Code: | set_adc_channel(0); |
At least two or three of the problems above could be the cause of
your problem. |
|
|
elphi
Joined: 17 Apr 2007 Posts: 20 Location: tijuana,bajacalifornia,mexico
|
sorry |
Posted: Mon Jul 02, 2007 6:44 pm |
|
|
OK, I post a bad version of may software, sorry , the #use delay is 8000000 as in the setting of the internal oscillator.
The datasheet says that I must use an 8TOSC, but I don’t understand that. Does it means some like :
Quote: | setup_adc(ADC_CLOCK_DIV_8|ADC_TAD_MUL_8); |
and sincerely I don’t know what is the channel in the adc.
It’s embarrassing but, i will need more support _________________ Every little thing gonna be alright |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jul 02, 2007 7:27 pm |
|
|
Quote: | I don’t know what is the channel in the adc. |
Here, in your code, you setup the A/D to use channel 0:
Quote: | setup_adc_ports(AN0|VSS_VDD); |
That's why I said you must add this line of code:
Code: | set_adc_channel(0); |
|
|
|
elphi
Joined: 17 Apr 2007 Posts: 20 Location: tijuana,bajacalifornia,mexico
|
ok |
Posted: Mon Jul 02, 2007 10:23 pm |
|
|
Ok, i get it, i made the change, but regarding the other seccion of your answer:
Quote: |
Look in the A/D section of the 18F4420 data sheet. What clock divisor
does it say to use for 4 MHz operation ?
|
The datasheet says that I must use an 8TOSC, but I don’t understand that. Does it means some like :
Quote: | setup_adc(ADC_CLOCK_DIV_8|ADC_TAD_MUL_8); |
but remember that i am using the 8mhz internal clock.
tnks it advance for your help. _________________ Every little thing gonna be alright |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jul 03, 2007 1:39 am |
|
|
That would work. According to the data sheet, the minimum Tad is 0.7 us.
Using the 8 MHz internal oscillator and dividing it by 8 gives you a 1 MHz
Tad clock, which gives a period of 1.0 us. That satisfies the minimum
requirement for Tad.
According to the data sheet, the minimum acquisition time is 2.4 us.
That means you could use ADC_TAD_MUL_4 to set the acquisition time,
because with a Tad of 1.0 us, this would give 4.0 us and it would satisfy
the Tacq requirement. But the ADC_TAD_MUL_8 value would still work.
It's longer than you need, but I doubt if it would make much difference
in the result. |
|
|
|
|
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
|