在官方的BlueMicrosystem2例程里磁场传感器校准是通过手机界面点击一个校准图标
然后将校准指令通过手机发送到SensorTile
再由SensorTile执行校准指令
在做这个AirDrum鼓棒的时候使用单向通信
SensorTile只能向手机广播数据,而不能接收手机发来的数据
所以校准没法通过手机实现
只好在SensorTile上想办法
最后决定利用加速度传感器的指向确定是否执行校准
把鼓棒垂直指向天空,等一小会后进入校准模式
判断加速度数值,计数,calibCounter大于500时执行ReCalibration函数,亮LED灯
- //鼓锤垂直向上
- if(ACC_Value_Raw.AXIS_X < -3800 && (ACC_Value_Raw.AXIS_Y < 200 && ACC_Value_Raw.AXIS_Y > -200))
- {
- calibCounter++;
- if(calibCounter > 500)
- {
- ledToggleFlag = 0;
- calibCounter = 0;
- calibFlag = 1;
- ReCalibration();
- LedOnTargetPlatform();
- }
- }
- else
- {
- calibCounter = 0;
- }
ReCalibration函数先执行osx_MotionFX_compass_forceReCalibration然后再执行ResetCalibrationInMemory把对应的内存清零
osx_MotionFX_compass_forceReCalibration是MotionFX库里用来执行校准的函数
- static void ReCalibration(void)
- {
- /* Only if connected */
- if(1) {
- /* Reset the Compass Calibration */
- isCal=0;
- /* Reset the Calibration */
- osx_MotionFX_compass_forceReCalibration();
- MDM_PayLoadLic_t *PayLoad = (MDM_PayLoadLic_t *) MDM_LicTable[OSX_MOTION_FX].Address;
- ResetCalibrationInMemory(PayLoad->ExtraData);
- /* Reset Calibation offset */
- magOffset.magOffX = magOffset.magOffY= magOffset.magOffZ=0;
- /* Switch off the LED */
- LedOffTargetPlatform();
- }
- }
执行完osx_MotionFX_compass_forceReCalibration后城要在ComputeQuaternions函数里
把加速度和磁场数据通过osx_MotionFX_compass_saveAcc和osx_MotionFX_compass_saveMag函数保存
然后执行osx_MotionFX_compass_run函数
通过isCal = osx_MotionFX_compass_isCalibrated();判断是否完成校准
当校准完成后isCal为1
- if(isCal == 0x01){
- /* Get new magnetometer offset */
- osx_MotionFX_getCalibrationData(&magOffset);
- /* Save the calibration in Memory */
- {
- MDM_PayLoadLic_t *PayLoad = (MDM_PayLoadLic_t *) MDM_LicTable[OSX_MOTION_FX].Address;
- SaveCalibrationToMemory(PayLoad->ExtraData);
- calibFlag = 0;
- ledToggleFlag = 1;
- }
- /* Switch on the Led */
- LedOnTargetPlatform();
- }
通过osx_MotionFX_getCalibrationData函数把校准后的数据读取到magOffset
再调用SaveCalibrationToMemory函数保存校准后的数据
完成校准后关掉LED提示校准完成