adc.c
来自「cc2430的好串口」· C语言 代码 · 共 124 行
C
124 行
/**************************************ADC.C*******************************************
文件名 : ADC.C
目标 : cc2430
创建日期: 2008/04/25
修改日期:
版本 : version 1.0
作者 : 刘旭
功能描述: 提供ADC与用户应用程序的接口,此文件提供了操作ADC的接口函数.
***************************************************************************************/
//***********************************头文件*******************************************
#include"ADC.H"
//**********************************函数声明******************************************
INT16U HalAdcSampleSingle(INT8U reference,INT8U resolution,INT8U channel); //单次AD采样
void ValueTransformBcd(FP32 value); //十进制转BCD码
void halWait(INT8U wait); //延时函数
//***********************************变量声明*****************************************
INT8U BcdData[10]={'0','0','0','0','0','0','0','0','0','\0'}; //BCD码数组
//**********************************单次AD采样******************************************
// 函数: INT16U HalAdcSampleSingle(INT8U reference,INT8U resolution,INT8U channel)
// 描述: 单次AD采样
// 参数: reference,resolution,channel
// 说明: 设置好参考电压,分辨率,采样通道开始单次的采样,这里采用查询的数据接受方式
// 例如: HalAdcSampleSingle( ADC_REF_1_25_V,ADC_8_BIT,ADC_AIN0)
//***************************************************************************************
INT16U HalAdcSampleSingle(INT8U reference,INT8U resolution,INT8U channel)
{
INT16U value; //定义采样值变量
value = ADCH; //清除标志位 ADCCON1.EOC
value = ADCL;
if(channel<=ADC_AIN6_AIN7) // 使能AD采样端口
{ if (channel<=ADC_AIN7)
ADC_ENABLE_CHANNEL(channel);
else
{
switch(channel)
{
case ADC_AIN0_AIN1: ADC_ENABLE_CHANNEL(ADC_AIN0);ADC_ENABLE_CHANNEL(ADC_AIN1);break;
case ADC_AIN2_AIN3: ADC_ENABLE_CHANNEL(ADC_AIN2);ADC_ENABLE_CHANNEL(ADC_AIN3);break;
case ADC_AIN4_AIN5: ADC_ENABLE_CHANNEL(ADC_AIN4);ADC_ENABLE_CHANNEL(ADC_AIN5);break;
case ADC_AIN6_AIN7: ADC_ENABLE_CHANNEL(ADC_AIN6);ADC_ENABLE_CHANNEL(ADC_AIN7);break;
}
}
}
halWait(10); //这个延时非常重要,因为从上拉状态切换成ADC输入状态,引脚有个反应时间
ADC_STOP(); // 关闭AD连续转换,为单次AD转换做准备
ADC_SINGLE_CONVERSION(reference | resolution | channel);// 启动单次AD转换
while(!ADC_SAMPLE_READY()); //等待转换结束
if(channel<=ADC_AIN6_AIN7) //关闭AD采样端口
{ if (channel<=ADC_AIN7)
{
ADC_DISABLE_CHANNEL(channel);
}
else
{
switch(channel)
{
case ADC_AIN0_AIN1: ADC_DISABLE_CHANNEL(ADC_AIN0);ADC_DISABLE_CHANNEL(ADC_AIN1);break;
case ADC_AIN2_AIN3: ADC_DISABLE_CHANNEL(ADC_AIN2);ADC_DISABLE_CHANNEL(ADC_AIN3);break;
case ADC_AIN4_AIN5: ADC_DISABLE_CHANNEL(ADC_AIN4);ADC_DISABLE_CHANNEL(ADC_AIN5);break;
case ADC_AIN6_AIN7: ADC_DISABLE_CHANNEL(ADC_AIN6);ADC_DISABLE_CHANNEL(ADC_AIN7);break;
}
}
}
value = ((INT16U)ADCH) << 8; //读取采样值
value |= (INT16U)ADCL;
if(value & 0x8000) //判断采样的正负
{
value =~value +1; //把负数的补码变成原码
value &=~0x8000; //清除符号位
value >>= (8 - (resolution>>3)); //移位还原
value |= 0x8000; //添加负号
return value;
}
else
{
value >>= (8 - (resolution>>3)); //移位还原
return value ;
}
}
//**********************************十进制转BCD码*****************************************
// 函数: void ValueTransformBcd(FP32 value)
// 描述: 十进制转BCD码
// 参数: value:可以为正数,也可以为浮点数
// 说明: 转换后的BCD码放在数组BcdData[]中,共有三个小数,前面不够补零
// 例如: ValueTransformBcd(4512.369)
//****************************************************************************************
void ValueTransformBcd(FP32 value)
{
INT8S i;
INT32U Data;
Data = (INT32U)(value*1000);
for(i=8;i>-1;i--)
{
BcdData[i]=Data %10+0x30;
if(i==6)
{
i=i-1;
BcdData[i]='.';
}
Data /=10;
}
}
//***********************延时函数**************************************************
// 函数: void halWait(INT8U wait)
// 描述: 延时函数
// 参数: wait
// 说明: 进行软件延续一段时间
// 例如: halWait(25);
//********************************************************************************
void halWait(INT8U wait)
{
INT32U largeWait;
if(wait==0)
return;
largeWait =((INT16U)(wait<<7));
largeWait+=114*wait;
largeWait=(largeWait>>2);
while(largeWait--);
return;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?