We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hello everyone, I'm developing software for embedded systems for medical supposes. In my latest project, I need to read the ADC value for 6 channels of LPC1768 ADC unit. I'm having some problems though. The ADC gives me some random conversions even when I connect the ADC pin to ground. Here is my code: #include <LPC17xx.H> #include "ClockConfig.h" #include <lpc17xx_pinsel.h> #include <lpc17xx_adc.h>
void ignore(void); void ADC_IRQHandler(void);
double percent = 0; double error = 0; double count = 0;
int result0 = 0; int previousResult0 = 0; int result1 = 0; int result2 = 0; int result3 = 0; int result4 = 0; int result5 = 0;
int main() { SetCoreClock();
PINSEL_SetPinFunc(PINSEL_PORT_0, PINSEL_PIN_23, PINSEL_FUNC_1); PINSEL_SetPinFunc(PINSEL_PORT_0, PINSEL_PIN_24, PINSEL_FUNC_1); PINSEL_SetPinFunc(PINSEL_PORT_0, PINSEL_PIN_25, PINSEL_FUNC_1); PINSEL_SetPinFunc(PINSEL_PORT_0, PINSEL_PIN_26, PINSEL_FUNC_1); PINSEL_SetPinFunc(PINSEL_PORT_1, PINSEL_PIN_30, PINSEL_FUNC_3); PINSEL_SetPinFunc(PINSEL_PORT_1, PINSEL_PIN_31, PINSEL_FUNC_3);
PINSEL_SetResistorMode(PINSEL_PORT_0, PINSEL_PIN_23,PINSEL_PINMODE_TRISTATE); PINSEL_SetResistorMode(PINSEL_PORT_0, PINSEL_PIN_24,PINSEL_PINMODE_TRISTATE); PINSEL_SetResistorMode(PINSEL_PORT_0, PINSEL_PIN_25,PINSEL_PINMODE_TRISTATE); PINSEL_SetResistorMode(PINSEL_PORT_0, PINSEL_PIN_26,PINSEL_PINMODE_TRISTATE); PINSEL_SetResistorMode(PINSEL_PORT_1, PINSEL_PIN_30,PINSEL_PINMODE_TRISTATE); PINSEL_SetResistorMode(PINSEL_PORT_1, PINSEL_PIN_31,PINSEL_PINMODE_TRISTATE);
ADC_Init(LPC_ADC, 5000); ADC_ChannelCmd(LPC_ADC,0,ENABLE); ADC_ChannelCmd(LPC_ADC,1,ENABLE); ADC_ChannelCmd(LPC_ADC,2,ENABLE); ADC_ChannelCmd(LPC_ADC,3,ENABLE); ADC_ChannelCmd(LPC_ADC,4,ENABLE); ADC_ChannelCmd(LPC_ADC,5,ENABLE);
ADC_IntConfig(LPC_ADC, ADC_ADINTEN0, ENABLE); ADC_IntConfig(LPC_ADC, ADC_ADINTEN1, ENABLE); ADC_IntConfig(LPC_ADC, ADC_ADINTEN2, ENABLE); ADC_IntConfig(LPC_ADC, ADC_ADINTEN3, ENABLE); ADC_IntConfig(LPC_ADC, ADC_ADINTEN4, ENABLE); ADC_IntConfig(LPC_ADC, ADC_ADINTEN5, ENABLE);
NVIC_EnableIRQ(ADC_IRQn); ADC_BurstCmd(LPC_ADC, ENABLE);
while (1); }
void ADC_IRQHandler() { if (ADC_ChannelGetStatus(LPC_ADC, ADC_CHANNEL_0, ENABLE)) { count ++; previousResult0 = result0; result0 = ADC_ChannelGetData(LPC_ADC, ADC_CHANNEL_0);
if (result0>0) error++;
percent = error/ count; }
if (ADC_ChannelGetStatus(LPC_ADC, ADC_CHANNEL_1, ENABLE)) result1 = ADC_ChannelGetData(LPC_ADC, ADC_CHANNEL_1);
if (ADC_ChannelGetStatus(LPC_ADC, ADC_CHANNEL_2, ENABLE)) result2 = ADC_ChannelGetData(LPC_ADC, ADC_CHANNEL_2);
if (ADC_ChannelGetStatus(LPC_ADC, ADC_CHANNEL_3, ENABLE)) result3 = ADC_ChannelGetData(LPC_ADC, ADC_CHANNEL_3);
if (ADC_ChannelGetStatus(LPC_ADC, ADC_CHANNEL_4, ENABLE)) result4 = ADC_ChannelGetData(LPC_ADC, ADC_CHANNEL_4);
if (ADC_ChannelGetStatus(LPC_ADC, ADC_CHANNEL_5, ENABLE)) result5 = ADC_ChannelGetData(LPC_ADC, ADC_CHANNEL_5); }
when I connect P0.23 (AD0.0 to ground, I expect the result to be zero. but ADC gives me values distributed over 0-4095 range.) This is very strange that the ADC reads 3.3 volts even when it is connected to the ground. this happens 0.5% of all conversion. for 99.5% of conversions the result is 0 as one would expect.
Thanks in advance for your help