|
这个程序是根据得到的XYZ轴值, 得到角度值. 4秒跑一次.
- //读角度
- //正取返回True, 失败返回FALSE
- u8 QMA6100_Read_Angle(float val[2])
- //u8 QMA6100_Read_Angle(void)
- {
- int16_t temp=0;
- int16_t x_[3];
- int16_t tempK[3];
- float accl_in[3];
- //float add_tmp[2];
- float accl_data[3];
- float acc_normal,pitch,roll;
- u8 flg;
-
- //读XYZ的坐标系
- temp=I2C_read(QMA6100P_REG_XOUTL)+((u16)I2C_read(QMA6100P_REG_XOUTH)<<8);
- tempK[0] = temp;
- x_[0] = temp>>2;
-
- temp=I2C_read(QMA6100P_REG_YOUTL)+((u16)I2C_read(QMA6100P_REG_YOUTH)<<8);
- tempK[1] = temp;
- x_[1] = temp>>2;
-
- temp=I2C_read(QMA6100P_REG_ZOUTL)+((u16)I2C_read(QMA6100P_REG_ZOUTH)<<8);
- tempK[2] = temp;
- x_[2] = temp>>2;
- if( test_bit(tempK[0],0) && test_bit(tempK[1],0) && test_bit(tempK[2],0))
- {
- flg = TRUE ;
- }
- else
- {
- return FALSE ;
- }
-
- //求度数
- accl_in[0]= x_[0]*QMA6100P_SENSITITY_8G/1000.0;
- accl_in[1]= x_[1]*QMA6100P_SENSITITY_8G/1000.0;
- accl_in[2]= x_[2]*QMA6100P_SENSITITY_8G/1000.0;
- //得到Pich,和POLL坐标
- acc_normal = sqrtf(accl_in[0] * accl_in[0] + accl_in[1] * accl_in[1] + accl_in[2] * accl_in[2]);
-
- accl_data[0] = accl_in[0]/acc_normal;
- accl_data[1] = accl_in[1]/acc_normal;
- accl_data[2] = accl_in[2]/acc_normal;
- pitch = -atan2f(accl_in[0],accl_in[2]);
- val[0] = pitch * RAD_TO_DEG; //
-
- //grl_decangle[0] = pitch * RAD_TO_DEG;
-
- acc_normal = sqrtf(accl_data[0] * accl_data[0] + accl_data[1] * accl_data[1] + accl_data[2] * accl_data[2]);
- roll = asinf((accl_data[1]/acc_normal));
- val[1] = roll * RAD_TO_DEG; //
-
- //grl_decangle[1] = roll * RAD_TO_DEG;
- return flg;
- }
复制代码
定位到问题.就是 运行了这个函数,, 1天/2天/3天 20%的死机(10台2台会死机重启) 而重启又是直接上电的那种, 非看门狗和LVD..
怀疑是sqrtf asinf 这些函数出了问题. 但是又奇怪是要2天后,或者1天后才出现
求助..
或者大家有这种角度转换函数,,分享一下给我哈..谢谢了..(不过最好定位一下问题)
|
|