CC2540 ADC实验总结(使用AIN0)

本实验基于Blue博文与部分代码。

http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4298381.html

没有测试原博主的代码,但原博主的代码在我这里使用AIN0通道时读取数据有错误,原因是原博主忽视了ADCH的符号位(因ADCL与ACDH合起来为一个signed int,详情看下图,手册p135)

CC2540 ADC实验总结(使用AIN0)_第1张图片

问题出在Oops处:

uint GetAdcValue(void)
{
  uint AdValue=0;

  ADCCON1 |= 0x40;
  while(!(ADCCON1 & 0x80));
  AdValue = ADCL >>4;//Oops
  AdValue |= ADCH <<4;//Oops
  return AdValue; 
}

经过修改后测试可用的代码如下:

int GetAdcValue(void)
{
  int AdValue=0;
  ADCCON1 |= 0x40;
  while(!(ADCCON1 & 0x80));
  AdValue = ADCL;
  AdValue |= ADCH<<8;
  AdValue >>= 4;//取12位有效(包括一位符号位),ADCL最后两位为00,保留位
  return AdValue; 
}

完整代码放出:

void AdcInit(void)//内部温度传感器
{
  ADCCON1 = 0x33;//软件启动转换
  ADCCON3 = 0x70;//P0.7为参考电压,12位分辨率,选择AIN0通道输入
  APCFG = 0x01;//P0.0 使能
  P0SEL = 0x01;//P0.0 复用为其他功能
  P0DIR = 0x00;//P0 输入模式
  P0INP = 0x01;//P0.0 P0.0高阻态
}
int GetAdcValue(void)
{
  int AdValue=0;
  ADCCON1 |= 0x40;
  while(!(ADCCON1 & 0x80));
  AdValue = ADCL;
  AdValue |= ADCH<<8;
  AdValue >>= 4;
  return AdValue; 
}

以上。

你可能感兴趣的:(CC2540,单片机)