ADCInit( ADC_CLK );
while(1)
{
#if CONFIG_ADC_ENABLE_BURST_MODE==1/* Interrupt driven only */
ADCBurstRead();
while ( !ADC0IntDone );
ADC0IntDone = 0;
#else/* Not burst mode */
#if CONFIG_ADC_ENABLE_ADC_IRQHANDLER==1/* Interrupt driven */
for ( i = 0; i < ADC_NUM; i++ )
{
ADCRead( i );
while ( !ADCIntDone );
ADCIntDone = 0;
}
#else /* Polling */
for ( i = 0; i < ADC_NUM; i++ )
{
ADCValue = ADCRead( i );
}
#endif/* Endif interrupt driven */
#endif/* Endif BURST mode */
#ifdef SEMIHOSTED_ADC_OUTPUT
#ifndef OUTPUT_ONLY_CH0
for ( i = 0; i < ADC_NUM; i++ )
{
ADCBar(i, ADCValue);
}
#else
debug_printf("Voltage on AD0 => %d |\n",ADCRead(0));
//ADCBar(0, ADCValue[0]);
#endif
#endif
}
}
|
void ADCInit( uint32_t ADC_Clk )
{
uint32_t i;
/* Disable Power down bit to the ADC block. */
LPC_SYSCON->PDRUNCFG &= ~(0x1<<4);
/* Enable AHB clock to the ADC. */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13);
for ( i = 0; i < ADC_NUM; i++ )
{
ADCValue = 0x0;
}
/* Unlike some other pings, for ADC test, all the pins need
to set to analog mode. Bit 7 needs to be cleared according
to design team. */
LPC_IOCON->R_PIO0_11 &= ~0x8F; /* ADC I/O config */
LPC_IOCON->R_PIO0_11 |= 0x02; /* ADC IN0 */
LPC_IOCON->R_PIO1_0 &= ~0x8F;
LPC_IOCON->R_PIO1_0 |= 0x02; /* ADC IN1 */
LPC_IOCON->R_PIO1_1 &= ~0x8F;
LPC_IOCON->R_PIO1_1 |= 0x02; /* ADC IN2 */
LPC_IOCON->R_PIO1_2 &= ~0x8F;
LPC_IOCON->R_PIO1_2 |= 0x02; /* ADC IN3 */
#ifdef __SWD_DISABLED
LPC_IOCON->SWDIO_PIO1_3 &= ~0x8F;
LPC_IOCON->SWDIO_PIO1_3 |= 0x02; /* ADC IN4 */
#endif
LPC_IOCON->R_PIO0_11 = 0x02;// Select AD0 pin function
LPC_IOCON->R_PIO1_0 = 0x02;// Select AD1 pin function
LPC_IOCON->R_PIO1_1 = 0x02;// Select AD2 pin function
LPC_IOCON->R_PIO1_2 = 0x02;// Select AD3 pin function
// LPC_IOCON->ARM_SWDIO_PIO1_3 = 0x02;// Select AD4 pin function
LPC_IOCON->PIO1_4 = 0x01;// Select AD5 pin function
LPC_IOCON->PIO1_10 = 0x01;// Select AD6 pin function
LPC_IOCON->PIO1_11 = 0x01;// Select AD7 pin function
LPC_ADC->CR = ((SystemCoreClock/LPC_SYSCON->SYSAHBCLKDIV)/ADC_Clk-1)<<8;
/* If POLLING, no need to do the following */
#if CONFIG_ADC_ENABLE_ADC_IRQHANDLER==1
NVIC_EnableIRQ(ADC_IRQn);
LPC_ADC->INTEN = 0x1FF;/* Enable all interrupts */
#endif
return;
}
|
uint32_t ADCRead( uint8_t channelNum )
{
#if CONFIG_ADC_ENABLE_ADC_IRQHANDLER!=1
uint32_t regVal, ADC_Data;
#endif
/* channel number is 0 through 7 */
if ( channelNum >= ADC_NUM )
{
channelNum = 0;/* reset channel number to 0 */
}
LPC_ADC->CR &= 0xFFFFFF00;
LPC_ADC->CR |= (1 << 24) | (1 << channelNum);
/* switch channel,start A/D convert */
#if CONFIG_ADC_ENABLE_ADC_IRQHANDLER!=1
while ( 1 )/* wait until end of A/D convert */
{
regVal = *(volatile unsigned long *)(LPC_ADC_BASE
+ ADC_OFFSET + ADC_INDEX * channelNum);
/* read result of A/D conversion */
if ( regVal & ADC_DONE )
{
break;
}
}
LPC_ADC->CR &= 0xF8FFFFFF;/* stop ADC now */
if ( regVal & ADC_OVERRUN )/* save data when it's not overrun, otherwise, return zero */
{
return ( 0 );
}
ADC_Data = ( regVal >> 6 ) & 0x3FF;
return ( ADC_Data );/* return A/D conversion value */
#else
return ( channelNum );/* if it's interrupt driven, the ADC reading is
done inside the handler. so, return channel number */
#endif
}
|
Voltage on AD0 => 465 | Voltage on AD0 => 464 | Voltage on AD0 => 492 | Voltage on AD0 => 936 | Voltage on AD0 => 682 | Voltage on AD0 => 867 | Voltage on AD0 => 465 | Voltage on AD0 => 118 | |