CC2540 ADC实验总结(使用AIN0)

来源:互联网 发布:琳琅怎么绑定淘宝账号 编辑:程序博客网 时间:2024/05/20 05:53

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

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

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

这里写图片描述

问题出在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; }

以上。

0 0