// Handle ADC interrupts // NOTE: This could probably be less complicated... void ADC_IRQHandler(void) { elua_adc_dev_state *d = adc_get_dev_state( 0 ); elua_adc_ch_state *s = d->ch_state[ d->seq_ctr ]; //int i; // Disable sampling & current sequence channel ADC_StartCmd( LPC_ADC, 0 ); ADC_ChannelCmd( LPC_ADC, s->id, DISABLE ); ADC_IntConfig( LPC_ADC, s->id, DISABLE ); if ( ADC_ChannelGetStatus( LPC_ADC, s->id, ADC_DATA_DONE ) ) { d->sample_buf[ d->seq_ctr ] = ( u16 )ADC_ChannelGetData( LPC_ADC, s->id ); s->value_fresh = 1; if ( s->logsmoothlen > 0 && s->smooth_ready == 0) adc_smooth_data( s->id ); #if defined( BUF_ENABLE_ADC ) else if ( s->reqsamples > 1 ) { buf_write( BUF_ID_ADC, s->id, ( t_buf_data* )s->value_ptr ); s->value_fresh = 0; } #endif if ( adc_samples_available( s->id ) >= s->reqsamples && s->freerunning == 0 ) platform_adc_stop( s->id ); } // Set up for next channel acquisition if we're still running if( d->running == 1 ) { // Prep next channel in sequence, if applicable if( d->seq_ctr < ( d->seq_len - 1 ) ) d->seq_ctr++; else if( d->seq_ctr == ( d->seq_len - 1 ) ) { adc_update_dev_sequence( 0 ); d->seq_ctr = 0; // reset sequence counter if on last sequence entry } ADC_ChannelCmd( LPC_ADC, d->ch_state[ d->seq_ctr ]->id, ENABLE ); ADC_IntConfig( LPC_ADC, d->ch_state[ d->seq_ctr ]->id, ENABLE ); if( d->clocked == 1 && d->seq_ctr == 0 ) // always use clock for first in clocked sequence ADC_StartCmd( LPC_ADC, adc_trig[ d->timer_id ] ); // Start next conversion if unclocked or if clocked and sequence index > 0 if( ( d->clocked == 1 && d->seq_ctr > 0 ) || d->clocked == 0 ) ADC_StartCmd( LPC_ADC, ADC_START_NOW ); } }
void analogSensorsInit(void) { // pin configuration for AirSpeed Sensor PINSEL_CFG_Type airPin_intStr; // pin configuration for UltraSonic Distance Sensor PINSEL_CFG_Type usonicPin_intStr; //Setup Air Speed Sensor Pin airPin_intStr.Funcnum = AIR_PIN_FUNC; airPin_intStr.OpenDrain = PINSEL_PINMODE_NORMAL; airPin_intStr.Pinmode = PINSEL_PINMODE_PULLUP; airPin_intStr.Pinnum = AIR_PIN; airPin_intStr.Portnum = AIR_PORT; PINSEL_ConfigPin(&airPin_intStr); //UltraSonic Sensor Pin usonicPin_intStr.Funcnum = USON_PIN_FUNC; usonicPin_intStr.OpenDrain = PINSEL_PINMODE_NORMAL; usonicPin_intStr.Pinmode = PINSEL_PINMODE_PULLUP; usonicPin_intStr.Pinnum = USON_PIN; usonicPin_intStr.Portnum = USON_PORT; PINSEL_ConfigPin(&usonicPin_intStr); // set AD Conversion speed ADC_Init(LPC_ADC, 200000); // disable the interrupt ADC_IntConfig (LPC_ADC, ADC_ADGINTEN, SET); // enable the ADC channels ADC_ChannelCmd(LPC_ADC, AIR_CHAN, ENABLE); ADC_ChannelCmd(LPC_ADC, USON_CHAN, ENABLE); }
AnalogIn::AnalogIn(uint8_t port, uint8_t pin, float referenceVoltage, float scaleVoltage) : port(port), pin(pin), referenceVoltage(referenceVoltage), scaleVoltage(scaleVoltage) { if(this->scaleVoltage == 0.0f) this->scaleVoltage = referenceVoltage; uint8_t funcnum; if(port == 0 && pin == 23) { funcnum = 1; channel = ADC_CHANNEL_0; interrupt = ADC_ADINTEN0; } else if(port == 0 && pin == 24) { funcnum = 1; channel = ADC_CHANNEL_1; interrupt = ADC_ADINTEN1; } else if(port == 0 && pin == 25) { funcnum = 1; channel = ADC_CHANNEL_2; interrupt = ADC_ADINTEN2; } else if(port == 0 && pin == 26) { funcnum = 1; channel = ADC_CHANNEL_3; interrupt = ADC_ADINTEN3; } else if(port == 1 && pin == 30) { funcnum = 1; channel = ADC_CHANNEL_4; interrupt = ADC_ADINTEN4; } else if(port == 1 && pin == 31) { funcnum = 1; channel = ADC_CHANNEL_5; interrupt = ADC_ADINTEN5; } else { //invalid port/pin fprintf(stderr, "invalid pin specified\r\n"); throw; } PINSEL_CFG_Type PinCfg; PinCfg.Funcnum = funcnum; PinCfg.OpenDrain = PINSEL_PINMODE_NORMAL; PinCfg.Pinmode = PINSEL_PINMODE_TRISTATE; PinCfg.Portnum = port; PinCfg.Pinnum = pin; PINSEL_ConfigPin(&PinCfg); ADC_Init(LPC_ADC, 200000); ADC_IntConfig(LPC_ADC,interrupt,DISABLE); }
int platform_adc_start_sequence() { elua_adc_dev_state *d = adc_get_dev_state( 0 ); if( d->running != 1 ) { adc_update_dev_sequence( 0 ); // Start sampling on first channel d->seq_ctr = 0; ADC_ChannelCmd( LPC_ADC, d->ch_state[ d->seq_ctr ]->id, ENABLE ); ADC_IntConfig( LPC_ADC, d->ch_state[ d->seq_ctr ]->id, ENABLE ); d->running = 1; NVIC_EnableIRQ( ADC_IRQn ); if( d->clocked == 1 ) { ADC_StartCmd( LPC_ADC, adc_trig[ d->timer_id ] ); TIM_ResetCounter( tmr[ d->timer_id ] ); TIM_Cmd( tmr[ d->timer_id ], ENABLE ); } else ADC_StartCmd( LPC_ADC, ADC_START_NOW ); } return PLATFORM_OK; }
int Get_ADC_Val(char* pin) { int channel, intChannel; if(pin == "P15") { channel = ADC_CHANNEL_0; intChannel = ADC_ADINTEN0; } else if(pin == "P16") { channel = ADC_CHANNEL_1; intChannel = ADC_ADINTEN1; } else if(pin == "P17") { channel = ADC_CHANNEL_2; intChannel = ADC_ADINTEN2; } else if(pin == "P18") { channel = ADC_CHANNEL_3; intChannel = ADC_ADINTEN3; } ADC_IntConfig(LPC_ADC, intChannel, DISABLE); ADC_ChannelCmd(LPC_ADC, channel, ENABLE); ADC_StartCmd(LPC_ADC, ADC_START_NOW); while(!(ADC_ChannelGetStatus(LPC_ADC, channel, ADC_DATA_DONE))); uint32_t adcVal= ADC_ChannelGetData(LPC_ADC, channel); ADC_ChannelCmd(LPC_ADC, channel, DISABLE); return (int) adcVal; }
/*********************************************************************//** * @brief c_entry: Main ADC program body * @param[in] None * @return None **********************************************************************/ void c_entry(void) { volatile uint32_t adc_value, tmp; uint8_t quit; /* Initialize debug via UART0 * – 115200bps * – 8 data bit * – No parity * – 1 stop bit * – No flow control */ debug_frmwrk_init(); // print welcome screen print_menu(); /* Initialize ADC ----------------------------------------------------*/ /* * Init ADC pin that currently is being used on the board */ PINSEL_ConfigPin (BRD_ADC_PREPARED_CH_PORT, BRD_ADC_PREPARED_CH_PIN, BRD_ADC_PREPARED_CH_FUNC_NO); PINSEL_SetAnalogPinMode(BRD_ADC_PREPARED_CH_PORT,BRD_ADC_PREPARED_CH_PIN,ENABLE); /* Configuration for ADC : * ADC conversion rate = 400Khz */ ADC_Init(LPC_ADC, 400000); ADC_IntConfig(LPC_ADC, BRD_ADC_PREPARED_INTR, DISABLE); ADC_ChannelCmd(LPC_ADC, BRD_ADC_PREPARED_CHANNEL, ENABLE); while(1) { // Start conversion ADC_StartCmd(LPC_ADC, ADC_START_NOW); //Wait conversion complete while (!(ADC_ChannelGetStatus(LPC_ADC, BRD_ADC_PREPARED_CHANNEL, ADC_DATA_DONE))); adc_value = ADC_ChannelGetData(LPC_ADC, BRD_ADC_PREPARED_CHANNEL); //Display the result of conversion on the UART _DBG("ADC value on channel "); _DBD(BRD_ADC_PREPARED_CHANNEL); _DBG(" is: "); _DBD32(adc_value); _DBG_(""); //delay for(tmp = 0; tmp < 1000000; tmp++); if(_DG_NONBLOCK(&quit) && (quit == 'Q' || quit == 'q')) break; } _DBG_("Demo termination!!!"); ADC_DeInit(LPC_ADC); }
uint16_t getADC(int channel) { uint16_t adc_value; uint16_t adc_value1; uint16_t adc_value2; // Start conversion ADC_StartCmd(LPC_ADC,ADC_START_NOW); //Wait conversion complete ADC_IntConfig(LPC_ADC,ADC_ADINTEN2,RESET); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_2,ENABLE); while (!(ADC_ChannelGetStatus(LPC_ADC,ADC_CHANNEL_2,ADC_DATA_DONE))); adc_value = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_2); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_2,DISABLE); ADC_IntConfig(LPC_ADC,ADC_ADINTEN1,RESET); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_1,ENABLE); while (!(ADC_ChannelGetStatus(LPC_ADC,ADC_CHANNEL_1,ADC_DATA_DONE))); adc_value1 = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_1); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_1,DISABLE); ADC_IntConfig(LPC_ADC,ADC_ADINTEN0,RESET); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_0,ENABLE); while (!(ADC_ChannelGetStatus(LPC_ADC,ADC_CHANNEL_0,ADC_DATA_DONE))); adc_value2 = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_0); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_0,DISABLE); if (channel == 0) { return adc_value; } if (channel == 1) { return adc_value1; } if (channel == 2) { return adc_value2; } else { return 0; } }
/****************************************************************************** * * Description: * Initialize the trim potentiometer, i.e. ADC connected to TrimPot on * Base Board. * *****************************************************************************/ void trimpot_init(void) { // pinsel for AD0.2 on p0.25 PINSEL_ConfigPin (0, 25, 1); PINSEL_SetAnalogPinMode (0, 25, 1); ADC_Init(LPC_ADC, 400000); ADC_IntConfig(LPC_ADC, ADC_ADINTEN2, DISABLE); ADC_ChannelCmd(LPC_ADC, ADC_CH_TRIMPOT, ENABLE); }
void ADC_InitChannel(int i){ PINSEL_CFG_Type pinCfg; pinCfg.Funcnum = 1; pinCfg.OpenDrain = 0; pinCfg.Pinmode = 0; pinCfg.Portnum = 0; pinCfg.Pinnum = 23 + i; PINSEL_ConfigPin(&pinCfg); ADC_Init(LPC_ADC, 200000); ADC_IntConfig(LPC_ADC, i, DISABLE); ADC_ChannelCmd(LPC_ADC, i, ENABLE); }
void init_adc(void) { PINSEL_CFG_Type PinCfg; PinCfg.Funcnum = 1; PinCfg.OpenDrain = 0; PinCfg.Pinmode = PINSEL_PINMODE_PULLUP; PinCfg.Pinnum = 24; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); ADC_Init(LPC_ADC, 10000); ADC_IntConfig(LPC_ADC, ADC_ADINTEN0, DISABLE); ADC_ChannelCmd(LPC_ADC, ADC_CHANNEL_1, ENABLE); }
Status qAnalog_InitPin(qAnalogInput * q){ PINSEL_CFG_Type PinCfg; PinCfg.Funcnum = q->funcNum; PinCfg.OpenDrain = PINSEL_PINMODE_NORMAL; PinCfg.Pinmode = PINSEL_PINMODE_TRISTATE; PinCfg.Pinnum = q->pinNum; PinCfg.Portnum = q->portNum; PINSEL_ConfigPin(&PinCfg); ADC_IntConfig(LPC_ADC,q->adcChannel,DISABLE); return SUCCESS; }
/** * @brief Main Program body */ int c_entry(void) { PINSEL_CFG_Type PinCfg; uint32_t adc_value; /* * Initialize debug via UART */ debug_frmwrk_init(); // print welcome screen print_menu(); /* * Init ADC pin connect * AD0.2 on P0.25 */ PinCfg.Funcnum = 1; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 25; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); /* Configuration for ADC : * Frequency at 1Mhz * ADC channel 2, no Interrupt */ ADC_Init(LPC_ADC, 1000000); ADC_IntConfig(LPC_ADC,ADC_ADINTEN2,DISABLE); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_2,ENABLE); while(1) { // Start conversion ADC_StartCmd(LPC_ADC,ADC_START_NOW); //Wait conversion complete while (!(ADC_ChannelGetStatus(LPC_ADC,ADC_CHANNEL_2,ADC_DATA_DONE))); adc_value = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_2); //Display the result of conversion on the UART0 _DBG("ADC value on channel 2: "); _DBD32(adc_value); _DBG_(""); //delay 1s Timer_Wait(1000); } ADC_DeInit(LPC_ADC); return 1; }
static void platform_setup_adcs() { unsigned id; for( id = 0; id < NUM_ADC; id ++ ) adc_init_ch_state( id ); NVIC_SetPriority(ADC_IRQn, ((0x01<<3)|0x01)); ADC_Init(LPC_ADC, 13000000); // Default enables CH0, disable channel ADC_ChannelCmd( LPC_ADC, 0, DISABLE ); // Default enables ADC interrupt only on global, switch to per-channel ADC_IntConfig( LPC_ADC, ADC_ADGINTEN, DISABLE ); platform_adc_set_clock( 0, 0 ); }
void ADCInit() { ADC_Init(LPC_ADC0, 200000, 10); ADC_IntConfig(LPC_ADC0,ADC_ADINTEN1,DISABLE); }
/*********************************************************************//** * @brief c_entry: Main program body * @param[in] None * @return None **********************************************************************/ void c_entry (void) { EXTI_InitTypeDef EXTICfg; GPIO_Init(); /* Initialize debug via UART0 * – 115200bps * – 8 data bit * – No parity * – 1 stop bit * – No flow control */ debug_frmwrk_init(); PINSEL_ConfigPin(2, 10,1); ADC_Init(LPC_ADC, 100); ADC_IntConfig(LPC_ADC, BRD_ADC_PREPARED_INTR, ENABLE); ADC_ChannelCmd(LPC_ADC, BRD_ADC_PREPARED_CHANNEL, ENABLE); GPIO_SetDir(BRD_LED_1_CONNECTED_PORT, BRD_LED_1_CONNECTED_MASK, GPIO_DIRECTION_OUTPUT); GPIO_SetDir(BRD_LED_2_CONNECTED_PORT, BRD_LED_2_CONNECTED_MASK, GPIO_DIRECTION_OUTPUT); /* Initialize External 0 interrupt */ EXTI_Init(); EXTICfg.EXTI_Line = EXTI_EINT0; /* edge sensitive */ EXTICfg.EXTI_Mode = EXTI_MODE_EDGE_SENSITIVE; EXTICfg.EXTI_polarity = EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE; EXTI_Config(&EXTICfg); #if (INT_MODE == 0) //same group, different sub-levels (Tail-chaining example) //sets group priorities: 8 - subpriorities: 3 NVIC_SetPriorityGrouping(4); //000:10 (bit 7:3) assign eint0 to group 0, sub-priority 2 within group 0 NVIC_SetPriority(EINT0_IRQn, 2); NVIC_SetPriority(ADC_IRQn, 0x01); #else //different group - (Late-arriving example) ================================================== //sets group priorities: 8 - subpriorities: 3 NVIC_SetPriorityGrouping(4); //000:00 (bit 7:3) assign eint0 to group 0, sub-priority 0 within group 0 NVIC_SetPriority(EINT0_IRQn, 0); NVIC_SetPriority(ADC_IRQn, 0x04); #endif NVIC_EnableIRQ(EINT0_IRQn); /* Enable ADC in NVIC */ NVIC_EnableIRQ(ADC_IRQn); while(1) { // Start conversion ADC_StartCmd(LPC_ADC, ADC_START_NOW); /* Enable ADC in NVIC */ NVIC_EnableIRQ(ADC_IRQn); } }
/*********************************************************************//** * @brief c_entry: Main ADC program body * @param[in] None * @return int **********************************************************************/ int c_entry(void) { PINSEL_CFG_Type PinCfg; uint32_t adc_value, tmp; /* Initialize debug via UART0 * – 115200bps * – 8 data bit * – No parity * – 1 stop bit * – No flow control */ debug_frmwrk_init(); // print welcome screen print_menu(); /* Initialize ADC ----------------------------------------------------*/ /* Because the potentiometer on different boards (MCB & IAR) connect * with different ADC channel, so we have to configure correct ADC channel * on each board respectively. * If you want to check other ADC channels, you have to wire this ADC pin directly * to potentiometer pin (please see schematic doc for more reference) */ #ifdef MCB_LPC_1768 /* * Init ADC pin connect * AD0.2 on P0.25 */ PinCfg.Funcnum = 1; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 25; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); #elif defined (IAR_LPC_1768) /* * Init ADC pin connect * AD0.5 on P1.31 */ PinCfg.Funcnum = 3; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 31; PinCfg.Portnum = 1; PINSEL_ConfigPin(&PinCfg); #endif /* Configuration for ADC : * Select: ADC channel 2 (if using MCB1700 board) * ADC channel 5 (if using IAR-LPC1768 board) * ADC conversion rate = 200Khz */ ADC_Init(LPC_ADC, 200000); ADC_IntConfig(LPC_ADC,_ADC_INT,DISABLE); ADC_ChannelCmd(LPC_ADC,_ADC_CHANNEL,ENABLE); while(1) { // Start conversion ADC_StartCmd(LPC_ADC,ADC_START_NOW); //Wait conversion complete while (!(ADC_ChannelGetStatus(LPC_ADC,_ADC_CHANNEL,ADC_DATA_DONE))); adc_value = ADC_ChannelGetData(LPC_ADC,_ADC_CHANNEL); //Display the result of conversion on the UART0 #ifdef MCB_LPC_1768 _DBG("ADC value on channel 2: "); #elif defined (IAR_LPC_1768) _DBG("ADC value on channel 5: "); #endif _DBD32(adc_value); _DBG_(""); //delay for(tmp = 0; tmp < 1000000; tmp++); } ADC_DeInit(LPC_ADC); return 1; }
/** * @brief Main program body */ int c_entry(void) { PINSEL_CFG_Type PinCfg; GPDMA_Channel_CFG_Type GPDMACfg; uint32_t adc_value, tmp; // DeInit NVIC and SCBNVIC NVIC_DeInit(); NVIC_SCBDeInit(); /* Configure the NVIC Preemption Priority Bits: * two (2) bits of preemption priority, six (6) bits of sub-priority. * Since the Number of Bits used for Priority Levels is five (5), so the * actual bit number of sub-priority is three (3) */ NVIC_SetPriorityGrouping(0x05); // Set Vector table offset value #if (__RAM_MODE__==1) NVIC_SetVTOR(0x10000000); #else NVIC_SetVTOR(0x00000000); #endif /* * Initialize debug via UART */ debug_frmwrk_init(); // print welcome screen print_menu(); /* GPDMA block section -------------------------------------------- */ /* Disable GPDMA interrupt */ NVIC_DisableIRQ(DMA_IRQn); /* preemption = 1, sub-priority = 1 */ NVIC_SetPriority(DMA_IRQn, ((0x01<<3)|0x01)); /* * Init LPC_ADC pin connect * AD0.2 on P0.25 */ PinCfg.Funcnum = 1; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 25; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); /* Configuration for ADC : * Frequency at 1Mhz * ADC channel 2, generate interrupt to make a request for DMA source */ ADC_Init(LPC_ADC, 1000000); ADC_IntConfig(LPC_ADC,ADC_ADINTEN2,SET); ADC_ChannelCmd(LPC_ADC,ADC_CHANNEL_2,SET); /* Initialize GPDMA controller */ GPDMA_Init(); // Setup GPDMA channel -------------------------------- // channel 0 GPDMACfg.ChannelNum = 0; // Source memory - unused GPDMACfg.SrcMemAddr = 0; // Destination memory GPDMACfg.DstMemAddr = (uint32_t) &adc_value; // Transfer size GPDMACfg.TransferSize = DMA_SIZE; // Transfer width - unused GPDMACfg.TransferWidth = 0; // Transfer type GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_P2M; // Source connection GPDMACfg.SrcConn = GPDMA_CONN_ADC; // Destination connection - unused GPDMACfg.DstConn = 0; // Linker List Item - unused GPDMACfg.DMALLI = 0; // Setup channel with given parameter GPDMA_Setup(&GPDMACfg, GPDMA_Callback); /* Reset terminal counter */ Channel0_TC = 0; /* Reset Error counter */ Channel0_Err = 0; /* Enable GPDMA interrupt */ NVIC_EnableIRQ(DMA_IRQn); while (1) { // Enable GPDMA channel 0 GPDMA_ChannelCmd(0, ENABLE); ADC_StartCmd(LPC_ADC,ADC_START_NOW); /* Wait for GPDMA processing complete */; while ((Channel0_TC == 0) ); // Disable GPDMA channel 0 GPDMA_ChannelCmd(0, DISABLE); //Display the result of conversion on the UART0 _DBG("ADC value on channel 2: "); _DBD32(ADC_DR_RESULT(adc_value)); _DBG_(""); // Wait for a while for(tmp = 0; tmp < 1000000; tmp++); // Re-setup channel GPDMA_Setup(&GPDMACfg, GPDMA_Callback); /* Reset terminal counter */ Channel0_TC = 0; /* Reset Error counter */ Channel0_Err = 0; } ADC_DeInit(LPC_ADC); return 1; }
/*********************************************************************//** * @brief c_entry: Main ADC program body * @param[in] None * @return None **********************************************************************/ void c_entry(void) { GPDMA_Channel_CFG_Type GPDMACfg; volatile uint32_t adc_value, tmp; uint8_t quit; /* Initialize debug via UART0 * ?115200bps * ?8 data bit * ?No parity * ?1 stop bit * ?No flow control */ debug_frmwrk_init(); // print welcome screen print_menu(); /* Initialize ADC ----------------------------------------------------*/ /* Settings for AD input pin */ PINSEL_ConfigPin (BRD_ADC_PREPARED_CH_PORT, BRD_ADC_PREPARED_CH_PIN, BRD_ADC_PREPARED_CH_FUNC_NO); PINSEL_SetAnalogPinMode(BRD_ADC_PREPARED_CH_PORT,BRD_ADC_PREPARED_CH_PIN,ENABLE); /* Configuration for ADC : * ADC conversion rate = 400KHz */ ADC_Init(LPC_ADC, 400000); ADC_IntConfig(LPC_ADC, BRD_ADC_PREPARED_INTR, ENABLE); ADC_ChannelCmd(LPC_ADC, BRD_ADC_PREPARED_CHANNEL, ENABLE); /* GPDMA block section -------------------------------------------- */ /* Disable GPDMA interrupt */ NVIC_DisableIRQ(DMA_IRQn); /* preemption = 1, sub-priority = 1 */ NVIC_SetPriority(DMA_IRQn, ((0x01<<3)|0x01)); /* Initialize GPDMA controller */ GPDMA_Init(); // Setup GPDMA channel -------------------------------- // channel 0 GPDMACfg.ChannelNum = 0; // Source memory - unused GPDMACfg.SrcMemAddr = 0; // Destination memory GPDMACfg.DstMemAddr = (uint32_t) &adc_value; // Transfer size GPDMACfg.TransferSize = DMA_SIZE; // Transfer width - unused GPDMACfg.TransferWidth = 0; // Transfer type GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_P2M; // Source connection GPDMACfg.SrcConn = GPDMA_CONN_ADC; // Destination connection - unused GPDMACfg.DstConn = 0; // Linker List Item - unused GPDMACfg.DMALLI = 0; GPDMA_Setup(&GPDMACfg); /* Reset terminal counter */ Channel0_TC = 0; /* Reset Error counter */ Channel0_Err = 0; /* Enable GPDMA interrupt */ NVIC_EnableIRQ(DMA_IRQn); while (1) { // Enable GPDMA channel 0 GPDMA_ChannelCmd(0, ENABLE); ADC_StartCmd(LPC_ADC, ADC_START_NOW); /* Wait for GPDMA processing complete */ while ((Channel0_TC == 0)); // Disable GPDMA channel 0 GPDMA_ChannelCmd(0, DISABLE); //Display the result of conversion on the UART _DBG("ADC value on channel "); _DBD(BRD_ADC_PREPARED_CHANNEL); _DBG(" is: "); _DBD32(ADC_DR_RESULT(adc_value)); _DBG_(""); // Wait for a while for(tmp = 0; tmp < 1000000; tmp++); /* GPDMA Re-setup */ GPDMA_Setup(&GPDMACfg); /* Reset terminal counter */ Channel0_TC = 0; /* Reset Error counter */ Channel0_Err = 0; if(_DG_NONBLOCK(&quit) && (quit == 'Q' || quit == 'q')) break; } _DBG_("Demo termination!!!"); ADC_DeInit(LPC_ADC); }
/*********************************************************************//** * @brief c_entry: Main ADC program body * @param[in] None * @return int **********************************************************************/ int c_entry(void) { PINSEL_CFG_Type PinCfg; /* Initialize debug via UART0 * – 115200bps * – 8 data bit * – No parity * – 1 stop bit * – No flow control */ debug_frmwrk_init(); // print welcome screen print_menu(); /* * Init ADC pin connect * AD0.2 on P0.25 */ PinCfg.Funcnum = 1; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 25; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); /* * Init P2.10 * */ PinCfg.Funcnum = 1; //EINT0 PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 10; PinCfg.Portnum = 2; PINSEL_ConfigPin(&PinCfg); /* Configuration for ADC: * select: ADC channel 2 (if using MCB1700 board) * ADC channel 5 (if using IAR-LPC1768 board) * ADC conversion rate = 200KHz */ ADC_Init(LPC_ADC, 200000); ADC_IntConfig(LPC_ADC,_ADC_INT,ENABLE); ADC_ChannelCmd(LPC_ADC,_ADC_CHANNEL,ENABLE); ADC_EdgeStartConfig(LPC_ADC,ADC_START_ON_FALLING); /* preemption = 1, sub-priority = 1 */ NVIC_SetPriority(ADC_IRQn, ((0x01<<3)|0x01)); while(1) { adc_value = 0; // Start conversion on EINT0 falling edge ADC_StartCmd(LPC_ADC,ADC_START_ON_EINT0); /* Enable ADC in NVIC */ NVIC_EnableIRQ(ADC_IRQn); _DBG("Press INT0 button to start ADC conversion on AD0.2...");_DBG_(""); while(adc_value==0); //Display the result of conversion on the UART0 _DBG("ADC value on channel 2: "); _DBD32(adc_value); _DBG_(""); } ADC_DeInit(LPC_ADC); return (0); }