在进行传感器的无线收发数据测试时,CO传感器的返回值具有巨大的异常误差,它的值基本稳定在6590ppm~6597ppm之间。然而我需要的是趋近于0的返回值(此时CO的测量环境是室内,空气中CO的含量稀少)。追根溯源,发现程序数据不符期愿的原因出现在ADC的模拟值转换中,当它返回的值具有符号位(有效位数12位,最高位第12位)时,程序不能自动识别,把此数据当作无符号数进行运算,返回值自然产生巨大误差。比如第十二位为1,传感器返回的是一个负数,但是ZigBee的ADC当成211加入总值。
对此程序进行修改,把read_value(ADC读取模拟有效值)设为int类型,加入区分符号位的语句,使模拟量转换值变为正确的输入量。所用ZigBee的芯片为CC2530。
未修改前的代码如下:
float CO_Val()//P0_4作为测量电压的引脚
{
int i;
int read_value;
int read_sum=0;
float read_aver;
float val_aver;
for(i=0;i<10;i++)
{
P0DIR &=~(1<<4);//P0_4设置为输入
P0SEL |=(1<<