A/D转化器的功用是将模仿输入信号采样得到能够供给计算机进行处理的数字信号。LPC1788的ADC是一个12位的逐次迫临型模数转化器,有8个复用的输入管脚,它的时钟运用PCLK分频得到。开发板的A/D输入模块电路图如下
要运用ADC转化,也要装备PCONP寄存器,装备ADC的时钟以及管脚和中止等。A/D转化操控寄存器AD0CR用来设置ADC的通道,时钟分频,作业形式和发动A/D转化的方法。开发板运用的是AIN2即A/D转化通道2,管脚为P0[25]。依据之前的文章,装备了体系的PCLK位60M,所以设置时钟分频5分频,将ADC的时钟设置成12M,而ADC完结一次转化需求31个时钟,所以ADC的转化频率约为400KHZ。AD0CR的START和EDGE用来操控ADC转化的触发方法,咱们能够装备成经过定时器和外部中止来触发AD转化以及触发的边缘的方法。
ADC转化完结后,转化的成果保存在A/D数据寄存器,有两个数据寄存器,他们分别是大局数据寄存器AD0GDR和每个通道的数据寄存器AD0DR0~AD0DR7,他们包含了数据转化成果和一些转化的状况标志。
ADC中止使能寄存器AD0INTEN,操控每个通道转化完结后是否发生中止,以及大局数据寄存器AD0GDR中的DONE标志是否发生中止。
下面的程序中,我将ADC装备成P2[10]外部中止触发AD转化,AD转化完结后会触发AD中止,在中止中进行数据的处理。
- #include”LPC1788_REG.h”
- #include”uart.h”
- #definerIOCON_P0_25(*(volatileunsigned*)(0x4002C064))
- #definerIOCON_P2_10(*(volatileunsigned*)0x4002C128)
- #definerEXTINT(*(volatileunsigned*)0x400FC140)
- #definerEXTMODE(*(volatileunsigned*)0x400FC148)
- #definerEXTPOLAR(*(volatileunsigned*)0x400FC14C)
- #definerAD0CR(*(volatileunsigned*)(0x40034000))
- #definerAD0INTEN(*(volatileunsigned*)(0x4003400C))
- #definerADGDR(*(volatileunsigned*)(0x40034004))
- #definerAD0DR2(*(volatileunsigned*)(0x40034018))
- #definerAD0STAT(*(volatileunsigned*)(0x40034030))
- #definerAD0TRM(*(volatileunsigned*)(0x40034034))
- unsignedintadc_value;
- voidEINT0_IRQHandler()
- {
- rEXTINT|=(0x1<<0);//中止发生之后有必要铲除改位
- Uart2SendS(“SW6ON!\r\n”);
- }
- voidADC_IRQHandler()
- {
- if(rAD0DR2&(1UL<<31))
- {
- adc_value=((rAD0DR2)>>4)&0xFFF;
- Uart2SendD(adc_value);
- Uart2SendS(“\r\n”);
- }
- else
- {
- Uart2SendC(x);
- }
- }
- voidEINT_INIT()
- {
- rEXTMODE|=0x1<<0;//装备成边缘触发
- rEXTPOLAR&=~(0x1<<0);//下降沿触发
- rISER0=(0x1<<18);//翻开EINT0中止使能
- }
- intmain()
- {
- charmenu[]={“PressSW6togetaADC_Value.\r\n”};
- Init_Uart2();
- EINT_INIT();
- rPCONP|=0x1<<12;//使能PCADC功率操控
- rIOCON_P2_10=(rIOCON_P2_10&(~0x7))|(0x1<<0);//装备FUNC字段为EINT0形式
- rIOCON_P0_25&=~(0x1<<7);//P0[25]做模仿管脚
- rIOCON_P0_25&=~(0x3<<3);//无效上下拉电阻
- rIOCON_P0_25&=~0x7;//P0[25]作为ADC[2]功用
- rIOCON_P0_25|=0x1;
- rAD0CR|=0x1<<2;//运用通道2
- rAD0CR|=0x4<<8;//A/D转化时钟设置成12M
- rAD0CR|=0x1<<21;//A/D作业在正常形式
- rAD0INTEN|=0x1<<2;//使能A/D通道2转化完中止
- rAD0INTEN&=~(0x1<<8);//无视大局数据寄存器的DONE标志
- rAD0CR|=0x1<<27;
- rAD0CR&=~(0x7<<24);
- rAD0CR|=0x2<<24;//P2[10]下降沿出现时发动转化
- rISER0|=0x1<<22;//使能A/D中止
- Uart2SendS(menu);
- while(1);
- }
程序运转的作用是,按下操控P2[10]的按键,每按一次得到一个AD采样的成果,改动R94的输入,能够得到不同的结构,最大最小分别是0和4095。
程序中需求留意的有如下几点:
1,P2[10]有必要装备成EINT0形式,才干用于在边缘上触发ADC转化。
2,有必要封闭ADC输入管脚的上拉或下拉电阻,不然AD采样会有误差。
3,ADC转化完结的中止使能,最好把AD0INTEN的最高位无效,不然需求在ADC转化完结后一起铲除通道数据寄存器AD0DRn和大局数据寄存器AD0GDR中的DONE标志(该标志经过读取数据寄存器铲除)。能够测验把程序中的rAD0INTEN &= ~(0x1<<8)屏蔽,能够看到串口一向在输出x,即AD数据没转化完结,也有中止一向发生。原因便是AD0GDR中的DONE标志引起。