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