微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC23xx的ADC功能实现

LPC23xx的ADC功能实现

时间:11-10 来源:互联网 点击:
UINT32 ADC_Init( BYTE unit)

{
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;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top