微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > Sensortag 读出的磁场信息不准

Sensortag 读出的磁场信息不准

时间:10-02 整理:3721RD 点击:

最近在做sensortag的测试,需要读tag磁场的信息,但读出的数据明显不准,x轴总是1800+,倒转tag也不见读数倒转。我觉得不应该是我的app程序的问题,磁场强度换算的代码都是官网的,而且就是官方app,磁场信息也不准,为啥按一下calibrate就归零?

大家遇到过这个问题吗?数据还要经过什么换算吗?

请问用的是默认的SensorTag的代码吗?用的是TI的SensorTag的app吗?

我的代码参考了TI的读数据这块:

if (UUID_MAG_DATA.equals(characteristic.getUuid()))
{
// int Magcode=(characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8,0) );

float x = shortSignedAtOffset(characteristic, 0) * (2000f / 65536f) * -1;
float y = shortSignedAtOffset(characteristic, 2) * (2000f / 65536f) * -1;
float z = shortSignedAtOffset(characteristic, 4) * (2000f / 65536f);

}

另外TI的app都是playstore 和Applestore下的,安卓苹果的都试了下,晃tag,读数都是有反应的,但翻转tag读数并不是变相反,那至少说明偏差比较大。另外我按上面那个得到的读数典型的一个就是1800+,40+,60+,当然晃tag会有浮动,是不是我式子代错了?

您说的是手机APP这一侧的数据处理吧?SensorTag端的软件是TI默认的程序吗?

从TI提供的SensorTag iOS的源码看,处理似乎是下面的代码

  if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:[self.d.setupData valueForKey:@"Magnetometer data UUID"]]]) {
       
        float x = [self.magSensor calcXValue:characteristic.value];
        float y = [self.magSensor calcYValue:characteristic.value];
        float z = [self.magSensor calcZValue:characteristic.value];
       
        self.mag.accValueX.text = [NSString stringWithFormat:@"X: % 0.1fuT",x];
        self.mag.accValueY.text = [NSString stringWithFormat:@"Y: % 0.1fuT",y];
        self.mag.accValueZ.text = [NSString stringWithFormat:@"Z: % 0.1fuT",z];
      
        self.mag.accValueX.textColor = [UIColor blackColor];
        self.mag.accValueY.textColor = [UIColor blackColor];
        self.mag.accValueZ.textColor = [UIColor blackColor];
       
        self.mag.accGraphX.progress = (x / [sensorMAG3110 getRange]) + 0.5;
        self.mag.accGraphY.progress = (y / [sensorMAG3110 getRange]) + 0.5;
        self.mag.accGraphZ.progress = (z / [sensorMAG3110 getRange]) + 0.5;
       
        self.currentVal.magX = x;
        self.currentVal.magY = y;
        self.currentVal.magZ = z;
       
    }

从CC2541的SensorTag的源码来看则是下面的代码

bool HalMagRead(uint8 *pBuf)
{
  uint8 tmp[MAG_REG_READ_ALL_LEN];
  bool f;

  HalMagSelect();

  f = HalSensorReadReg(MAG_REG_ADDR_READ_START,tmp,MAG_REG_READ_ALL_LEN);
  if (f)
  {
    // Swap bytes in each value-pair
    pBuf[0] = tmp[1];
    pBuf[1] = tmp[0];
    pBuf[2] = tmp[3];
    pBuf[3] = tmp[2];
    pBuf[4] = tmp[5];
    pBuf[5] = tmp[4];
  }
  sensorState = MAG3110_IDLE;

  return f;
}

 

Sensortag端没改过,我写的是安卓的,但看ios这段代码,5段除了第一段都是写怎么显示数据的吧。。第一段我也看不出来咋算的。。。

TI的android app程序按一下magnetic数据会calibrate到全零,按说如果显示的绝对磁场强度的话不应该有这么个设置的吧?

这玩意本来就应该是有固有偏差的吧?例如外界有磁场,电路板本身也会引起。不过数值有没有你这么大,忘了

所以好象手机之类的常用什么8字校正法之类的来实现指南针校准

谢谢Fuzhong,这个问题排出了,1800+的偏差应该不是你说的这个问题,最重要的是TI官方android的app还有一个calibrate功能,让所有轴读数以当时为基准(变全零)让我怀疑是不是读数压根不是磁场强度的绝对值?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top