How to Read multiple ADC values on LPC11U68

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

How to Read multiple ADC values on LPC11U68

965 次查看
daisukefukuda_n
Contributor III

Hi there,

This is Daisuke FUKUDA with NEXTY Electronics Japan. Thank you for your support.

I've been developing a evaluation board for our client with LPC11U68. Now I'm implementing to read ADC values. The key point of this function is the followint.

1. I'd like to read value in PIO0_14 and PIO0_12 with a software trigger when each function is called.

E.g.

a = ReadValue(0); // -> Read in PIO0_14

b = ReadValue(1); // -> Read in PIO0_12

2. I'd like to use only ADC_SEQB_IDX because ADC_SEQA has been already used for the other function.

 

However the read function cannot go out from the infinite loop as below when ReadValue(1) is called after ReadValue(0).

- while(!ADC_DR_DONE(Chip_ADC_GetDataReg(LPC_ADC, tblADCNum[nADC])));

 

The part of codes is below. If you find something for me to check, can you let me know?

 

#define ADC_CLK_RATE 10000
#define ADC_SEQIDX ADC_SEQB_IDX
#define ADC_CH 8 // PIO0_12_ADC

unsigned int tblADCNum[MAX_MY_ADC] = {
6, // MY_ADC_1, // ADC 6 (PIO0_14)
8 // MY_ADC_2, // ADC 8 (PIO0_12)
};

void Init(void)

{

Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 14, (IOCON_FUNC2 | IOCON_MODE_INACT | IOCON_ADMODE_EN));

Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 14, (IOCON_FUNC2 | IOCON_MODE_INACT | IOCON_ADMODE_EN));

}

void Init_myADC(void)
{
// eMYADC_NUM i;

/* Setup ADC for 12-bit mode and normal power */
Chip_ADC_Init(LPC_ADC, 0);

/* Need to do a calibration after initialization and trim */
Chip_ADC_StartCalibration(LPC_ADC);
while (!(Chip_ADC_IsCalibrationDone(LPC_ADC))) {}

Chip_ADC_SetClockRate(LPC_ADC, ADC_CLK_RATE);

}

unsigned int GetValue_myADC(eMYADC_NUM nADC)
{
unsigned int val;

uint32_t rawSample;

Chip_ADC_SetupSequencer(LPC_ADC, ADC_SEQIDX,
(ADC_SEQ_CTRL_CHANSEL(tblADCNum[nADC]) | ADC_SEQ_CTRL_MODE_EOS));
Chip_ADC_EnableSequencer(LPC_ADC, ADC_SEQIDX);

while(!ADC_DR_DONE(Chip_ADC_GetDataReg(LPC_ADC, tblADCNum[nADC])));

rawSample = Chip_ADC_GetDataReg(LPC_ADC, tblADCNum[nADC]);

val = ADC_DR_RESULT(rawSample);

Chip_ADC_DisableSequencer(LPC_ADC, ADC_SEQIDX);

Chip_ADC_ClearSequencerBits(LPC_ADC, ADC_SEQIDX,
(ADC_SEQ_CTRL_CHANSEL(tblADCNum[nADC]) | ADC_SEQ_CTRL_MODE_EOS));

return val;
}

 

Best regards,

Daisuke

 

0 项奖励
回复
3 回复数

939 次查看
daisukefukuda_n
Contributor III

Hi Diego,

This is Daisuke FUKUDA with NEXTY Electronics JAPAN. Thank you for your prompt reply.

I'm going to try based on your advice. I'll get back to you.

 

Best regards,

FUKUDA

0 项奖励
回复

906 次查看
diego_charles
NXP TechSupport
NXP TechSupport

Hi @daisukefukuda_n 

Feel free to update  if you are still facing problems, or any further questions. 

Thank you.

Diego.

0 项奖励
回复

942 次查看
diego_charles
NXP TechSupport
NXP TechSupport

Hi @daisukefukuda_n 

I hope that you are doing well!

So the problem only appears with the order of which channel do you read ? If ReadValue(0) is called before ReadValue(1) the code does not get stuck?

Here I got initial recommendations

Try to force a SW triggered conversion (calling  again Chip_ADC_StartSequencer () ) , and also  check if this conversion mode is actually enabled at register level. 

Also I will recommend to test the ADCA sequencer  in the periph_dma_adc LPCopen example.I think that we could isolate the issue only testing with once SEQ, Could you adapt the example to work with SEQB and verify in your HW? Also this example works through interrupts.

Best regards, 

Diego.

 

0 项奖励
回复