📄 adc.c
字号:
/****************************************************************************
* 文 件 名:ADC.c
* 功 能:初始化ADC模块,并读出ADC的值,AD通道uint8 Int_AIN,选择单路通道,
有效值:LPC2124:0x01~0x04,LPC2200:0x01~0x08
****************************************************************************/
#include "cfg.h"
void Func_InitADC(void);
uint32 Func_ReadADC(uint8 Int_AIN);
//PINSEL1=0X01400000; //P0.27=AIN0,P0.28=AIN1
/****************************************************************************
* 名 称:void Func_InitADC(void)
* 功 能:对ADC进行初始化,没有选择通道,转换时钟为1MHz,正常模式,正常工作,
没有启动,下降沿启动转换
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Func_InitADC(void)
{ ADCR=0<<0 | //AIN0通道选择,0不选择,1选择
0<<1 | //AIN1通道选择,0不选择,1选择
0<<2 | //AIN2通道选择,0不选择,1选择
0<<3 | //AIN3通道选择,0不选择,1选择
0<<4 | //AIN4通道选择,0不选择,1选择
0<<5 | //AIN5通道选择,0不选择,1选择
0<<6 | //AIN6通道选择,0不选择,1选择
0<<7 | //AIN7通道选择,0不选择,1选择
/*
1<<8 | //[15:8]分频设置,小于或等于4.5MHZ
1<<9 |
1<<10 |
0<<11 |
0<<12 |
0<<13 |
0<<14 |
0<<15 |
*/
((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
0<<16 | //0:软件方式;1:突发方式
0<<17 | //[19:17]转换精度 =000:10位精度 001:9位精度
0<<18 | //010:8位;011:7位;100:6位;101:5位;
0<<19 | //110:4位;111:3位
0<<20 | //无定义
1<<21 | //1:正常工作,0:掉电
0<<22 | //[23:22]=00:正常模式;01:数字测试;
0<<23 | //10:DAC测试;11:一次转换测试模式
0<<24 | //[26:24]=000:不启动;001:立即启动
0<<25 | //
0<<26 | //
0<<27 | //EDGE,0:CAP\MAT\AIN下降沿启动转换;1:上升沿启动
0<<28 ; //[32:28]无定义
ADDR=0<<0 | //[5:0]无定义
0<<6 | //[15:6]10位ADC数据,计算公式:VIN=RESULT*(VSSA/0X3FFF)
0<<16 | //[23:16]=0,连续AD值经过256个值累加不会溢出到CHN[26:24]字段
0<<24 | //[26:24]CHN:最低位的转换通道,不需要设置
0<<25 |
0<<26 |
0<<27 | //[29:27]无定义
0<<30 | //OVERUN:
0<<31 ; //DONE:完成标志位,读ADDR、ADCR被写时清0
}
/****************************************************************************
* 名 称:uint32 Func_ReadADC(uint8 Int_AIN)
* 功 能:启动ADC转换并读出结果
* 入口参数:uint8 Int_AIN,选择单路通道,
有效值:0x01~0x08,LPC2124:0x01~0x04,LPC2200:0x01~0x08
* 出口参数:uint32 Int32_ADCData,已读出电压值
****************************************************************************/
uint32 Func_ReadADC(uint8 Int_AIN)
{ uint32 Int32_ADCData;
PINSEL1=(PINSEL1 & 0X003FFFFF |0X01<<22)<<(Int_AIN-1)*2 ; //P0.27=AIN0,P0.28=AIN1
ADCR =(ADCR & 0XFFFFFF00 ) |
1<<(Int_AIN-1) | //选择通道
1<<24 ; //启动
while((ADDR & 0X80000000)==0);
Int32_ADCData=ADDR;
Int32_ADCData=(Int32_ADCData>>6) & 0x3FF; //右移6位,并清掉高22位
Int32_ADCData=Int32_ADCData*3300 /0x3FF;
return Int32_ADCData;
}
/****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -