新闻中心

EEPW首页>嵌入式系统>设计应用> LPC23xx的ADC功能实现

LPC23xx的ADC功能实现

作者: 时间:2016-11-10 来源:网络 收藏
UINT32 ADC_Init( BYTE unit)

{
UINT32 ADC_Data=0;

PCONP=PCONP|(1<<12); /*ADC上电 */

本文引用地址://m.amcfsurvey.com/article/201611/317226.htm

/*The PCONP register allows turning off selected peripheral functions for the purpose of
saving power. This is accomplished by gating off the clock source to the specified
peripheral blocks.Some peripherals, particularly those that include analog functions, may consume power
that is not clock dependent. These peripherals may contain a separate disable control that
turns off additional circuitry to reduce power.If a peripheral control bit is 1, that peripheral is enabled.

If a peripheral bit is 0, that peripheral’s clock is disabled (gated off) to conserve power */
switch(unit)
{
case 0:
PINSEL1 |= (1<<14); /* AD0.0 *//*引脚功能配置*/
AD0CR=(1<<0) | /* SEL =0,选择通道0*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR0;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x01|(1<<24) ; /* 设置通道0,并进行第一次转换*/
//DelayNS(20);
while((AD0DR0&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR0&0x80000000)==0);/*等待转换结束 */
ADC_Data=AD0DR0;/*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF;/*数值转换*/
/********************************************************/

break;

case 1:
PINSEL1 |= (1<<16); /* AD0.1 */
AD0CR=(1<<1) | /* SEL =1,选择通道1*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR1;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x02|(1<<24) ; /* 设置通道1,并进行第一次转换*/
//DelayNS(20);
while((AD0DR1&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR1&0x80000000)==0);/*等待转换结束 */
ADC_Data=AD0DR1;/*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF;/*数值转换*/
/********************************************************/

break;

case 2:
PINSEL1 |= (1<<18); /* AD0.2 */
AD0CR=(1<<2) | /* SEL =2,选择通道2*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR2;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x04|(1<<24) ; /* 设置通道2,并进行第一次转换*/
//DelayNS(20);
while((AD0DR2&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR2&0x80000000)==0);/*等待转换结束 */
ADC_Data=AD0DR2;/*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF;/*数值转换*/
/********************************************************/

break;

case 3:
PINSEL1 |= (1<<20); /* AD0.3 */
AD0CR=(1<<3) | /* SEL =3,选择通道3*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR3;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x08|(1<<24) ; /* 设置通道3,并进行第一次转换*/
//DelayNS(20);
while((AD0DR3&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR3&0x80000000)==0);/*等待转换结束 */
ADC_Data=AD0DR3;/*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF;/*数值转换*/
/********************************************************/

break;
case 4:
PINSEL3 |= (3<<28); /* AD0.4 */
AD0CR=(1<<4) | /* SEL =4,选择通道4*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR4;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x10|(1<<24) ; /* 设置通道4,并进行第一次转换*/
//DelayNS(20);
while((AD0DR4&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR4&0x80000000)==0);/*等待转换结束 */
ADC_Data=AD0DR4;/*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF;/*数值转换*/
/********************************************************/

break;
case 5:
PINSEL3|=0xc0000000; /* AD0.5 */
AD0CR=(1<<5) | /* SEL =5,选择通道5*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR5;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x20|(1<<24) ; /* 设置通道5,进行第一次转换*/
//DelayNS(20);
while((AD0DR5&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR5&0x80000000)==0);/*等待转换结束 */
ADC_Data=AD0DR5;/*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF;/*数值转换*/
/********************************************************/

break;
case 6:
PINSEL0 |= (3<<24); /* AD0.6 */
AD0CR=(1<<6) | /* SEL =6,选择通道6*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR6;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x40|(1<<24) ; /* 设置通道6,进行第一次转换*/
//DelayNS(20);
while((AD0DR6&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR6&0x80000000)==0); /*等待转换结束 */
ADC_Data=AD0DR6; /*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF; /*数值转换*/
/********************************************************/

break;
case 7:
PINSEL0 |= (3<<26); /* AD0.7 */
AD0CR=(1<<7) | /* SEL =7,选择通道7*/
((Fpclk/1000000-1)<<8) | /* CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz*/
(0<<16) | /* BURST=0,软件控制转换操作 */
(0<<17) | /* CLKS=0, 使用11clock转换 */
(1<<21) | /* PDN=1, 正常工作模式 (非掉电转换模式)*/
(0<<22) | /* Reversed*/
(1<<24) | /* START=1, 直接启动AD转换 */
(0<<27);
//DelayNS(0x10);
ADC_Data=AD0DR7;
/**************************************************/
AD0CR=(AD0CR&0x00FFFF00)|0x40|(1<<24) ; /* 设置通道6,进行第一次转换*/
//DelayNS(20);
while((AD0DR7&0x80000000)==0); /*等待转换结束 */
//DelayNS(20);
AD0CR=AD0CR|(1<<24); /*再次启动转换 */
while((AD0DR7&0x80000000)==0);/*等待转换结束 */
ADC_Data=AD0DR7;/*读取转换结果 */
ADC_Data=(ADC_Data>>6)&0x3FF;/*数值转换*/
/********************************************************/

break;

default:
break;
}

//ADC_result = ((ADC_Data*1.0/1023)/0.4*3.3);
return(ADC_Data);

}



关键词:LPC23xxADC功

评论


技术专区

关闭