×
单片机 > 单片机程序设计 > 详情

LPC1788--ADC连续中断多通道转换程序学习分析

发布时间:2020-06-04 发布时间:
|

    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]
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项