LPC 824 ADC - Issue in getting it to start conversion

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LPC 824 ADC - Issue in getting it to start conversion

768 Views
flourishaprince
Contributor I

I'm trying to read an analog signal on ADC 9 & 10. The issue I'm facing here is, despite setting the start bit to 1 the ADC is not launching the conversion sequence, i.e. the interrupt service routine isn't firing and also there is not update in the flag register. Kindly help. I have mentioned the initialization function below.

void adc_init()
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<18); //Enable clock to IOCON
LPC_IOCON->PIO0_13 = 0x00000000; //Disable pull up and pull down resistors
LPC_IOCON->PIO0_17 = 0x00000000; //Disable pull up and pull down resistors

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); //Enable clock to switch matrix
LPC_SWM->PINENABLE0 |= (0<<23); //Enable ADC_10 on PIO0_13
LPC_SWM->PINENABLE0 |= (0<<22); //Enable ADC_9 on PIO0_17
LPC_SYSCON->SYSAHBCLKCTRL |= (0<<7); //Disable clock to switch matrix

LPC_SYSCON->PDRUNCFG |= (0<<4); //Power the ADC
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<24); //Enable clock to ADC

LPC_SYSCON->PRESETCTRL |= (0<<24); //RESET ADC
LPC_SYSCON->PRESETCTRL |= (1<<24);

LPC_ADC->SEQA_CTRL |= (0<<31); //Disable sequence A

LPC_ADC->CTRL = 1; //Set clock div 1

LPC_ADC->SEQA_CTRL |= (1<<10)|(1<<9)|(1<<30); //Sequence A, channel 10, channel 9, EOS enabled

LPC_ADC->FLAGS = 0X00000000; //Clear all flags

LPC_ADC->INTEN |= (1<<0); //sequence A interupt enabled

NVIC_EnableIRQ(ADC_SEQA_IRQn); //Enable NVIC interrupt

LPC_ADC->SEQA_CTRL |= (1<<31)|(1<<18); //Enable sequence A
}

void start_adc()
{
LPC_ADC->SEQA_CTRL |= (1<<26); //start sequence A
}

void ADC_SEQA_IRQHandler(void)
{
SendData0("In handler\n");

if((LPC_ADC->FLAGS & (1<<28)) == 1) //Check for Sequence completion
sequence_complete = 1;

LPC_ADC->FLAGS |= (0<<28); //clear flags
}

uint16_t get_data_adc(int chno)
{
uint16_t data;


rawvalue = LPC_ADC->DAT[chno];

data = (rawvalue & 0X0000FFF0)>>4;

rawvalue = 0;

return data;
}

int main()
{
int v1,v2;


SystemCoreClockUpdate();

GpioInit();
Uart0Init(9600,8,'N',1);


adc_init();

while(1)
{
start_adc();
while(sequence_complete != 1);
sequence_complete = 0;

v1 = get_data_adc(10);
v2= get_data_adc(9);

sprintf(result,"%d %d\n",v1,v2);
SendData0(result);
}
}

Tags (2)
2 Replies

574 Views
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Flourisha,

Regarding your code, I think you have to check the bit configuration.

1)clear bit4 to power the ADC, but you do nothing with the code. Setting bit4 to power down rather than power up.

LPC_SYSCON->PDRUNCFG |= (0<<4); //Power the ADC

modify it to:

LPC_SYSCON->PDRUNCFG &= ~(0<<4); //Power the ADC

pastedImage_1.png

2)clear the bit in PINENABLE0 to enable the ADC function for the pin, but you set the bit with the code:

LPC_SWM->PINENABLE0 |= (0<<23); //Enable ADC_10 on PIO0_13
LPC_SWM->PINENABLE0 |= (0<<22); //Enable ADC_9 on PIO0_17

pastedImage_2.png

You should use

LPC_SWM->PINENABLE0 &=~ (0<<23); //Enable ADC_10 on PIO0_13
LPC_SWM->PINENABLE0 &= ~(0<<22); //Enable ADC_9 on PIO0_17

3)for reset:


LPC_SYSCON->PRESETCTRL &= ~(0<<24); //RESET ADC
LPC_SYSCON->PRESETCTRL |= (1<<24);

Pls have a try.

BR

XiangJun Rong

574 Views
flourishaprince
Contributor I

Thanks a lot. This solved the issue.

0 Kudos