📄 adc.c
字号:
//[ADC.c]A/D转换-----------------------------------------------------------*
//本文件包含: *
// (1)ADCInit:A/D转换初始化 *
// (2)ADCvalue:获取1路A/D转换结果 *
// (3)ADCmid:获取中值滤波后的A/D转换结果 *
// (4)ADCave:获取均值滤波后的A/D转换结果 *
//硬件连接: *
// PAD1 接模拟量输入端 *
//-------------------------------------------------------------------------*
//头文件
#include "ADC.h" //A/D转换头文件
//ADCInit:A/D转换初始化----------------------------------------------------*
//功 能:初始化AD转换 *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
void ADCInit(void)
{
//ATDCTL2.ADPU = 1为打开转换电源开关
//ATDCTL2.AFFC = 1为A/D转换CCF自动清0位
ATDCTL2 = 0xC0;
//ATDCTL3.S1C = 1表示序列长度为1
//ATDCTL3.FIFO = 0为非FIFO模式
//ATDCTL3.FRZ0~FRZ1 = 11表示冻结模式进入BDM
ATDCTL3 = 0x1B;
//ATDCTL4.PRS4~PRS0 = 00111表示总线频率16分频
ATDCTL4 = 0x07;
//ATDCTL4.SRES8 = 0表示10位转换精度,1就是8位精度
ATDCTL4 &= 0x7F;
}
//ADCvalue:1路10位A/D转换函数----------------------------------------------*
//功 能:获取通道channel的10位A/D转换结果 *
//参 数:channel=通道号(0~15) *
//返 回:该通道的A/D转换结果(0~1023) *
//-------------------------------------------------------------------------*
INT16U ADCvalue(INT8U channel)
{
INT16U temp; //暂存A/D转换的结果
//ATDCTL5.DJM = 0,结果寄存器数据采用左调整
//ATDCTL5.SCAN = 1,连续转换序列
//ATDCTL5.CC~CA = channel,启动通道转换
ATDCTL5 = (0x30 | channel);
//取A/D转换结果
while (1)
{
//判断ATDSTAT0的第7位是否为1
if ((ATDSTAT0&(1<< SCFBit)) != 0)
{
temp = ATDDR0; //从A/D数据寄存器0中读10位数据
temp = (temp >> 6); //对数据调整,使低十位有效
break;
}
}
return temp;
}
//ADCmid:1路A/D转换函数(中值滤波)------------------------------------------*
//功 能:获取通道channel中值滤波后的A/D转换结果 *
//参 数:channel=通道号(0~15) *
//返 回:该通道中值滤波后的A/D转换结果(0~1023) *
//内部调用函数:ADCvalue *
//-------------------------------------------------------------------------*
INT16U ADCmid(INT8U channel)
{
INT16U i,j,k,tmp;
//1.取三次A/D转换结果
i = ADCvalue(channel);
j = ADCvalue(channel);
k = ADCvalue(channel);
//2.从三次A/D转换结果中取中值
if (i > j)
{
tmp = i; i = j; j = tmp;
}
if (k >= j)
{
tmp = j;
}
else
{
if (k >= i)
tmp = k;
else
tmp = i;
}
return tmp;
}
//ATDave:1路A/D转换函数(均值滤波)------------------------------------------*
//功 能:对通道channel的A/D转换结果求n次平均值 *
//参 数:n=均值滤波次数(0~255),channel=通道号(0~15) *
//返 回:该通道均值滤波后的A/D转换结果 *
//内部调用函数:ADCmid *
//-------------------------------------------------------------------------*
INT16U ADCave(INT8U n,INT8U channel)
{
//求n次A/D转换的平均值
INT8U i;
INT32U j;
if(0 == n) n = 1;
j = 0;
for (i=0; i<n; i++)
j += ADCmid(channel);
j /= n;
return j;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -