LPC23xx的ADC功能实现
{
UINT32 ADC_Data=0;
PCONP=PCONP|(1<12); /*ADC上电 */
/*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;
}
LPC23xxADC功 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)