LPC1788--ADC連續中斷多通道轉換程序學習分析


    LPC1788的ADC轉換可以單次轉換-也可以連續轉換---可以輪詢--也可以中斷---這裏使用的是中斷連續轉換3個通道的AD值----主要是對AD控制寄存器CR的設置與中斷函數中對AD通道的判斷。

    在主函數中只需要調用初始化函數與在循環採集中不停打開ADC中斷--因爲在中斷函數中爲了防止中斷嵌套禁止了ADC中斷

///////////////////////////////////////////////////////////

void main(void)

{

    uint32_t   i;

    ADC_Init(60000000,4000000);  //初始化---外設時鐘60M--ADC轉換頻率4M

    while(1)

    {

        NVIC_EnableIRQ(ADC_IRQn);  使能ADC中斷
        for(i=10000;i>1;i--);  //延時

    }

}

////////////////////////////////////////////////////////////////////

#include "adc_lpc1788.h"

uint8_t Data[17];

void ADC_IRQHandler(void)     //ADC中斷函數
{
    uint32_t adc_value = 0;

    if(((LPC_ADC->DR[0])&(1<<31)))  //AD0[0]轉換完成產生的中斷
    {
        adc_value = ((LPC_ADC->DR[0])>>4)&0xFFF;//獲取本次中斷的轉換值
        Data[1]=adc_value/1000+0x30;
        Data[2]=adc_value%1000/100+0x30;
        Data[3]=adc_value%100/10+0x30;
        Data[4]=adc_value%10+0x30;

        NVIC_DisableIRQ(ADC_IRQn);  //禁止ADC中斷--防止中斷嵌套
    }
    if(((LPC_ADC->DR[1])&(1<<31)))   //AD0[1]轉換完成產生的中斷
    {
        adc_value = ((LPC_ADC->DR[0])>>4)&0xFFF;//獲取本次中斷的轉換值
        Data[6]=adc_value/1000+0x30;
        Data[7]=adc_value%1000/100+0x30;
        Data[8]=adc_value%100/10+0x30;
        Data[9]=adc_value%10+0x30;

        NVIC_DisableIRQ(ADC_IRQn);
    }
    if(((LPC_ADC->DR[2])&(1<<31)))   //AD0[2]轉換完成產生的中斷
    {
        adc_value = ((LPC_ADC->DR[0])>>4)&0xFFF;//獲取本次中斷的轉換值
        Data[11]=adc_value/1000+0x30;
        Data[12]=adc_value%1000/100+0x30;
        Data[13]=adc_value%100/10+0x30;
        Data[14]=adc_value%10+0x30;

        NVIC_DisableIRQ(ADC_IRQn);
    }
}

void ADC_Init(uint32_t clk, uint32_t rate)
{
    uint32_t temp1,temp;

    LPC_IOCON->P0_23=0x01;  //關於LPC1788的AD引腳設置-AD模式-上拉無效-模擬輸入
    LPC_IOCON->P0_24=0x01;//AD0[1]
    LPC_IOCON->P0_25=0x01;//AD0[2]

    LPC_SC->PCONP |=(1<<12);//使能ADC外設時鐘
    

    LPC_ADC->CR = 0;  //清空CR控制寄存器

    temp = (1<<21);//正常工作模式--非掉電


    temp1 = rate * 31;
    temp1 = (clk * 2 + temp1)/(2 * temp1) - 1; 
    temp |= (temp1<<8);  //根據外設時鐘clk與ADC需要的轉換頻率計算出分頻係數

    LPC_ADC->CR = temp;

    LPC_ADC->INTEN &=~(1<<8);  //禁止全局DONE產生中斷
    LPC_ADC->INTEN |=(1<<0)|(1<<1)|(1<<2); //使能AD0[0]-AD0[1]-AD0[2]的DONE中斷

    LPC_ADC->CR |=(1<<0)|(1<<1)|(1<<2);//設置需要轉換的通道

    LPC_ADC->CR |=(1<<16); //設置爲連續轉換模式-將依次轉換AD0[0]-AD0[1]-AD0[2]
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章