LPC54101 ADC

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

LPC54101 ADC

跳至解决方案
1,349 次查看
englemon
Contributor II

I am trying to get the ADC working on the LPC54101 using LPCopen. I have not successfully managed to get the ADC_SEQA_IRQHandler() interrupt to trigger. I can't seem to find where I am going wrong. I have followed all the steps that are required in the user manual and used steps similar to those in the lpcxpresso54102 ADC example.

Here is my code so far (i have not edited any of the LPCopen files from v3.03.000):

/*
* @brief LPC5410x ADC example
*
* @note
* Copyright(C) NXP Semiconductors, 2015
* All rights reserved.
*
* /

#include "chip.h"

/*****************************************************************************
* Private types/enumerations/variables
****************************************************************************/

static volatile int ticks;
static bool sequenceComplete, thresholdCrossed;

#define TICKRATE_HZ (100) /* 100 ticks per second */


#define BOARD_ADC_CH 0

/*****************************************************************************
* Public types/enumerations/variables
****************************************************************************/

/*****************************************************************************
* Private functions
****************************************************************************/

/*****************************************************************************
* Public functions
****************************************************************************/

/**
* @brief Handle interrupt from SysTick timer
* @return Nothing
*/
void SysTick_Handler(void)
{
static uint32_t count;

/* Every 1/2 second */
count++;
if (count >= (TICKRATE_HZ / 2)) {
count = 0;

/* Manual start for ADC conversion sequence A */
Chip_ADC_StartSequencer(LPC_ADC, ADC_SEQA_IDX);
Chip_GPIO_SetPinToggle(LPC_GPIO, 0, 11);
}
}

/* SEQ-A interrupt handler */
void ADC_SEQA_IRQHandler(void)
{
uint32_t pending;

/* Get pending interrupts */
pending = Chip_ADC_GetFlags(LPC_ADC);

/* Sequence A completion interrupt */
if (pending & ADC_FLAGS_SEQA_INT_MASK) {
sequenceComplete = true;
}

/* Clear any pending interrupts */
Chip_ADC_ClearFlags(LPC_ADC, ADC_FLAGS_SEQA_INT_MASK);
}

/* ADC threashold interrupt handler */
void ADC_THCMP_IRQHandler(void)
{
uint32_t pending;

/* Get pending interrupts */
pending = Chip_ADC_GetFlags(LPC_ADC);

/* Threshold crossing interrupt on ADC input channel */
if (pending & ADC_FLAGS_THCMP_MASK(BOARD_ADC_CH)) {
thresholdCrossed = true;
}

/* Clear any pending interrupts */
Chip_ADC_ClearFlags(LPC_ADC, ADC_FLAGS_THCMP_MASK(BOARD_ADC_CH));
}

/* main function (C entry point) */
int main(void)
{
int loop = 1; /* Prevents unreachable statement warning */
uint32_t rawSample;

SystemCoreClockUpdate();
Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_INPUTMUX);
Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
Chip_GPIO_Init(LPC_GPIO);

//LED init
Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 11);
Chip_GPIO_SetPinState(LPC_GPIO, 0, 11, 0);

/* Setup ADC for 12-bit mode and normal power */
Chip_ADC_Init(LPC_ADC, (ADC_CR_RESOL(3) | ADC_CR_TSAMP(ADC_TSAMP_7CLK5)));

uint32_t i;
for( i=0; i<10000000; i++);

/* FIXME: Enable ADC, should be at least 10mS after ADC is powered up */
LPC_ADC->STARTUP = 0x1;
LPC_ADC->STARTUP = 0x3; /* Dummy calibration */

/* Need to do a calibration after initialization and trim */
Chip_ADC_Calibration(LPC_ADC);

/* Setup for maximum ADC clock rate using synchronous clocking */
Chip_ADC_SetClockRate(LPC_ADC, ADC_MAX_SAMPLE_RATE);


/* Setup sequencer A for ADC channel 0, EOS interrupt */
/* Setup a sequencer to do the following:
Perform ADC conversion of ADC channels 0 */
Chip_ADC_SetupSequencer(LPC_ADC, ADC_SEQA_IDX, (ADC_SEQ_CTRL_CHANSEL(BOARD_ADC_CH)| ADC_SEQ_CTRL_MODE_EOS));

/* ADC input 0 is on PIO0_29 mapped to FUNC0 */
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 29, (IOCON_FUNC0 | IOCON_MODE_INACT |
IOCON_ANALOG_EN));

/* Setup threshold 0 low and high values to about 25% and 75% of max */
Chip_ADC_SetThrLowValue(LPC_ADC, 0, 0xf50); // ((1 * 0xFFF) / 4));
Chip_ADC_SetThrHighValue(LPC_ADC, 0, 0xf70);// ((3 * 0xFFF) / 4));

/* Clear all pending interrupts */
Chip_ADC_ClearFlags(LPC_ADC, Chip_ADC_GetFlags(LPC_ADC));

/* Enable ADC overrun and sequence A completion interrupts */
Chip_ADC_EnableInt(LPC_ADC, (ADC_INTEN_SEQA_ENABLE | ADC_INTEN_OVRRUN_ENABLE));

/* Use threshold 0 for ADC channel and enable threshold interrupt mode for
channel as crossing */
Chip_ADC_SelectTH0Channels(LPC_ADC, ADC_THRSEL_CHAN_SEL_THR1(BOARD_ADC_CH));
Chip_ADC_SetThresholdInt(LPC_ADC, BOARD_ADC_CH, ADC_INTEN_THCMP_CROSSING);

/* Enable ADC NVIC interrupt */
NVIC_EnableIRQ(ADC_SEQA_IRQn);
NVIC_EnableIRQ(ADC_THCMP_IRQn);

/* Enable sequencer */
Chip_ADC_EnableSequencer(LPC_ADC, ADC_SEQA_IDX);

/* This example uses the periodic sysTick to manually trigger the ADC,
but a periodic timer can be used in a match configuration to start
an ADC sequence without software intervention. */
SysTick_Config(SystemCoreClock / TICKRATE_HZ);

/* Endless loop */
while (loop) {
/* Sleep until something happens */
__WFI();

if (thresholdCrossed) {
thresholdCrossed = false;
}

/* Is a conversion sequence complete? */
if (sequenceComplete) {
sequenceComplete = false;

rawSample = Chip_ADC_GetDataReg(LPC_ADC, 0);

}
}

/* Should not run to here */
return 0;
}

Thanks

标签 (3)
0 项奖励
回复
1 解答
962 次查看
jeremyzhou
NXP Employee
NXP Employee

Hi Carl,

I've attached the ADC.c file which is from the LPCOpen 3.3, and in the ADC.c, I configured the P0_29 as the ADC channel 0, it can work well on the LPCxpresso board and please refer to it for details.
Have a great day,
Ping

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

在原帖中查看解决方案

0 项奖励
回复
3 回复数
963 次查看
jeremyzhou
NXP Employee
NXP Employee

Hi Carl,

I've attached the ADC.c file which is from the LPCOpen 3.3, and in the ADC.c, I configured the P0_29 as the ADC channel 0, it can work well on the LPCxpresso board and please refer to it for details.
Have a great day,
Ping

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 项奖励
回复
962 次查看
englemon
Contributor II

Got it working, thanks for the help

0 项奖励
回复
962 次查看
jeremyzhou
NXP Employee
NXP Employee

Hi Carl,

Have a brief look through the demo, I didn't figure out some errors.

I'd like to reply later after I test the code on the board.
Have a great day,
Ping

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 项奖励
回复