【AT91SAM3S】ADC中斷方式采集數(shù)據(jù)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
板子依舊是英倍特的EK-SAM3S。ADC部分的原理圖如下:
PB1是一個(gè)復(fù)用引腳,在這里被用作AD功能,對應(yīng)芯片上的AD5。即,使用片內(nèi)ADC的5通道測VR1上2號引腳的電壓。
實(shí)驗(yàn)采用了SysTick定時(shí)器產(chǎn)生中斷方式來采集ADC數(shù)據(jù)。SysTick中斷發(fā)生時(shí),開啟ADC轉(zhuǎn)換。ADC轉(zhuǎn)換結(jié)束時(shí),產(chǎn)生中斷,在ADC中斷處理函數(shù)中讀取ADC采集到的數(shù)據(jù)。轉(zhuǎn)換后,通過UART輸出,到PC端顯示。
SysTick和ADC的中斷處理函數(shù)如下:
uint32_t time_stamp = 0;
WEAK void SysTick_Handler( void )
{
uint32_t status;
time_stamp++;
/* simply to get 1s interval*/
if (time_stamp % 1000 == 0) //1秒采集一次ADC數(shù)據(jù)
{
status = ADC_GetStatus( ADC ) ;
/* if conversion is done*/
if ( (status & ADC_ISR_EOC5) == ADC_ISR_EOC5 )
{
ADC_StartConversion( ADC ) ;//開啟ADC轉(zhuǎn)換
}
}
}
/**
* brief Default SUPC interrupt handler for ADC.
*/
WEAK void ADC_IrqHandler( void )
{
uint32_t status;
status = ADC_GetStatus(ADC);
if ( (status & ADC_ISR_RXBUFF) == ADC_ISR_RXBUFF )
{
conversionDone = 1; //設(shè)置轉(zhuǎn)換完成標(biāo)志
ADC_ReadBuffer( ADC, adc_values, 1 ) ;
}
}
主函數(shù):
int main()
{
int i;
WDT_Disable(WDT);
SysTick_Config(BOARD_MCK / 1000); //配置SysTick
ADC_Initialize(ADC,ID_ADC); //初始化ADC
ADC_cfgFrequency(ADC,15,4);
ADC_check(ADC,BOARD_MCK);
ADC_EnableChannel(ADC,ADC_CHANNEL_5); //使能5號通道 PB1
NVIC_EnableIRQ(ADC_IRQn); //使能ADC中斷
ADC_StartConversion(ADC);
ADC_ReadBuffer(ADC,adc_values,BUFFER_SIZE);
ADC_EnableIt(ADC,ADC_IER_RXBUFF);
while(1)
{
while(!conversionDone);//等待轉(zhuǎn)換完成標(biāo)志
if ( conversionDone )
{
for ( i = 0 ; i < BUFFER_SIZE ; i++ )
{
printf( "Vol:%d mvrn", (adc_values[i] * 3300 /4095) ) ; //通過串口輸出電壓值
}
conversionDone = 0 ;
}
}
}
連上串口線,PC端會(huì)看到一些電壓數(shù)據(jù)發(fā)過來。轉(zhuǎn)動(dòng)變阻器,可以看到電壓值會(huì)不斷地變化,變阻器轉(zhuǎn)到底,輝縣市0mv和3300mv。說明咱們測量的還湊合了。