【AT91SAM3S】ADC中斷方式采集數據


板子依舊是英倍特的EK-SAM3S。ADC部分的原理圖如下:

image

PB1是一個復用引腳,在這里被用作AD功能,對應芯片上的AD5。即,使用片內ADC的5通道測VR1上2號引腳的電壓。

 

實驗采用了SysTick定時器產生中斷方式來采集ADC數據。SysTick中斷發生時,開啟ADC轉換。ADC轉換結束時,產生中斷,在ADC中斷處理函數中讀取ADC采集到的數據。轉換后,通過UART輸出,到PC端顯示。

SysTick和ADC的中斷處理函數如下:

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數據
    {
        status = ADC_GetStatus( ADC ) ;

        /* if conversion is done*/
        if ( (status & ADC_ISR_EOC5) == ADC_ISR_EOC5 )
        {
            ADC_StartConversion( ADC ) ;//開啟ADC轉換
        }
    }
}

/**
* \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;  //設置轉換完成標志

        ADC_ReadBuffer( ADC, adc_values, 1 ) ;

    }
}

主函數:

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);//等待轉換完成標志
        if ( conversionDone )
        {
            for ( i = 0 ; i < BUFFER_SIZE ; i++ )
            {
                printf( "Vol:%d mv\r\n", (adc_values[i] * 3300 /4095) ) ;  //通過串口輸出電壓值
            }
            conversionDone = 0 ;
        }
    }
}

連上串口線,PC端會看到一些電壓數據發過來。轉動變阻器,可以看到電壓值會不斷地變化,變阻器轉到底,輝縣市0mv和3300mv。說明咱們測量的還湊合了。

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM