📄 adc.c
字号:
/*********************************************************************************************************
**文件名称: ADC.c
**功能说明: ADC操作软件包
**使用说明:
********************************************************************************************************/
#include "config.h"
#include "ADC.h"
static uint8 g_CHn = 0;
/*********************************************************************************************************
**函数名称:uint8 SetADnCH(uint8 CHn)
**函数功能:设置AD转换通道
**入口参数:CHn AD通道0~7
**出口参数:0 :参数错误
** 1 :操作成功
**说明:
********************************************************************************************************/
uint8 SetADnCH(uint8 CHn)
{
if(CHn > 7)
{
return 0;
}
switch(CHn) //进行引脚连接
{
case 0:
PINSEL1 = PINSEL1|(3<<12);
break;
case 1:
PINSEL1 = PINSEL1|(3<<14);
break;
case 2:
PINSEL1 = PINSEL1|(3<<16);
break;
case 3:
PINSEL0 = PINSEL0|(3<<20);
break;
case 4:
PINSEL0 = PINSEL0|(3<<22);
break;
case 5:
PINSEL0 = PINSEL0|(3<<24);
break;
case 6:
PINSEL1 = PINSEL1|(3<<18);
break;
case 7:
PINSEL1 = PINSEL1|(3<<20);
break;
default : break;
}
g_CHn = CHn;
AD0CR = (AD0CR & 0xFFFFFF00)|(1<<CHn);
return 1;
}
/*********************************************************************************************************
**函数名称:uint8 ADC_InitToSW(uint8 nCH, uint32 Fadc, uint8 StartMode, uint8 bEdge)
**函数功能:AD初始化操作
**入口参数:CHn AD通道,0~7
** Fadc ADC的转换时钟 ≤4.5MHz
** StartMode AD启动方式:
0 不启动
1 立即启动转换
2 bEdge选择的边沿出现在P0.16/EINT0/ MAT0.2脚时启动转换
4 bEdge选择的边沿出现在MAT0.1时启动转换
5 bEdge选择的边沿出现在MAT0.3时启动转换
6 bEdge选择的边沿出现在MAT1.0时启动转换
7 bEdge选择的边沿出现在MAT1.1时启动转换
bEdge 边沿方式选择:bEdge > 0 :在所选CAP/MAT信号的上升沿启动转换
bEdge = 0 : 在所选CAP/MAT信号的下降沿启动转换
**出口参数:0 :参数错误
** 1 :初始化成功
**说明:
********************************************************************************************************/
uint8 ADC_InitToSW(uint8 CHn, uint32 Fadc, uint8 StartMode, uint8 bEdge)
{
uint8 edge;
if(Fadc > 4500000)
{
Fadc = 4500000; //最大的转换速率为4.5M
}
if(StartMode > 7)
{
return 0;
}
if(bEdge > 0)
{
edge = 0;
}
else
{
edge = 1;
}
if(SetADnCH(CHn) == 0) //设置通道
{
return 0;
}
//软件模式
AD0CR = (AD0CR & 0x000000FF)|
((Fpclk/Fadc - 1)<<8)| //转换时钟最大为4.5MHz
(0<<16)| //BURST=0,软件控制转换操作
(0<<17)| //CLKS=0,使用11 clock转换
(1<<21)| //PDN=1.正常方式
(0<<22)| //TEST1:0=00,正常工作模式
(StartMode<<24)| //设置启动模式
(edge<<27); //设置边沿模式
//edge > 0 :在所选CAP/MAT信号的下降沿启动转换
//edge = 0 : 在所选CAP/MAT信号的上升沿启动转换
return 1;
}
/*********************************************************************************************************
**函数名称:uint8 ADC_InitToHW(uint8 Ch,uint32 Fadc, uint8 Accurate)
**函数功能:将AD初始化成硬件扫描模式.
**入口参数:Ch 通道设置,按位操作:
bit0: 1 使能AD通道0 0 不使能AD通道0
bit1: 1 使能AD通道1 0 不使能AD通道1
bit2: 1 使能AD通道2 0 不使能AD通道2
bit3: 1 使能AD通道3 0 不使能AD通道3
bit4: 1 使能AD通道4 0 不使能AD通道4
bit5: 1 使能AD通道5 0 不使能AD通道5
bit6: 1 使能AD通道6 0 不使能AD通道6
bit7: 1 使能AD通道7 0 不使能AD通道7
Fadc ADC的转换时钟 ≤4.5MHz
Accurate 转换精度,范围3~10bits
**出口参数:0 : 参数错误
** 1 : 初始化成功
**说明:
********************************************************************************************************/
uint8 ADC_InitToHW(uint8 Ch,uint32 Fadc, uint8 Accurate)
{
uint8 i;
if(Fadc > 4500000)
{
Fadc = 4500000; //最大的转换速率为4.5M
}
if(Accurate > 10)
{
Accurate = 10; //转换精度最高为10bits
}
else if(Accurate < 3)
{
Accurate = 3; //转换精度最低为3bits
}
for(i = 0; i < 8; i++)
{
if(Ch & (1<<i))
{
switch(i) //进行引脚连接
{
case 0:
PINSEL1 = PINSEL1|(3<<12);
break;
case 1:
PINSEL1 = PINSEL1|(3<<14);
break;
case 2:
PINSEL1 = PINSEL1|(3<<16);
break;
case 3:
PINSEL0 = PINSEL0|(3<<20);
break;
case 4:
PINSEL0 = PINSEL0|(3<<22);
break;
case 5:
PINSEL0 = PINSEL0|(3<<24);
break;
case 6:
PINSEL1 = PINSEL1|(3<<18);
break;
case 7:
PINSEL1 = PINSEL1|(3<<20);
break;
default : break;
}
}//endof if(Ch & (1<<i))
}
//硬件扫描模式
AD0CR = Ch| //设置通道
((Fpclk/Fadc - 1)<<8)| //转换时钟最大为4.5MHz
(1<<16)| //BURST=0,软件控制转换操作
((10-Accurate)<<17)| //CLKS
(1<<21)| //PDN=1.正常方式
(0<<22)| //TEST1:0=00,正常工作模式
(0<<24)| //硬件扫描模式下必须为000,否则AD不能启动
(0<<27); //硬件扫描模式下无效
return 1;
}
/*********************************************************************************************************
**函数名称:void ADC_PowerDown(uint8 bPD)
**函数功能:ADC掉电控制
**入口参数:bPD 0: ADC正常工作
>0: ADC掉电
**出口参数:无
**说明: 控制ADC的掉电
********************************************************************************************************/
void ADC_PowerDown(uint8 bPD)
{
if(bPD > 0)
{
AD0CR &= ~(1<<21); //ADC 掉电
}
else
{
AD0CR |= 1<<21; //ADC正常工作
}
}
/*********************************************************************************************************
**函数名称:uint8 Read_ADC(uint32 *ADC_Data)
**函数功能:读取AD转换值
**入口参数:ADC_Data 读取出来的AD结果
**出口参数:0:参数错误
1:操作成功
**说明:
********************************************************************************************************/
uint8 Read_ADC(uint32 *ADC_Data)
{
uint32 Val;
AD0CR |= (1<<24); //启动转换
while((AD0STAT & (0x00000001 << g_CHn))==0); //等待转换结束
Val = *((volatile unsigned long *)(0xE0034010+g_CHn*4)); //读取指定通道的AD0DR(0~7)
*ADC_Data = (Val>>6) & 0x3ff; //处理转换值
return 1;
}
/*********************************************************************************************************
**函数名称:uint8 SetADnIntEn(uint8 CHn)
**函数功能:使能指定AD通道产生中断标志
**入口参数:CHn AD通道,0~7 当CHn = 8时表示仅使能ADDR中的全局DONE标志来产生中断。
**出口参数:0:参数错误
1:操作成功
**说明:
********************************************************************************************************/
uint8 SetADnIntEn(uint8 CHn)
{
if(CHn > 8)
{
return 0;
}
AD0INTEN = 1<<CHn;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -