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 + -
显示快捷键?