sweet_136 发表于 2023-8-1 20:49:27

求助, 三轴MQA6100得到XYZ值,获取角度值,,程序运行一段时间死机,

这个程序是根据得到的XYZ轴值, 得到角度值. 4秒跑一次.


//读角度
//正取返回True, 失败返回FALSE
u8 QMA6100_Read_Angle(float val)
//u8 QMA6100_Read_Angle(void)
{
        int16_ttemp=0;       
        int16_tx_;
        int16_ttempK;
        float accl_in;
        //float add_tmp;
        float accl_data;
    float acc_normal,pitch,roll;
        u8 flg;

       
        //读XYZ的坐标系
        temp=I2C_read(QMA6100P_REG_XOUTL)+((u16)I2C_read(QMA6100P_REG_XOUTH)<<8);
        tempK = temp;       
        x_ = temp>>2;
       
        temp=I2C_read(QMA6100P_REG_YOUTL)+((u16)I2C_read(QMA6100P_REG_YOUTH)<<8);
        tempK = temp;       
        x_ = temp>>2;
       
        temp=I2C_read(QMA6100P_REG_ZOUTL)+((u16)I2C_read(QMA6100P_REG_ZOUTH)<<8);
        tempK = temp;       
        x_ = temp>>2;

        if( test_bit(tempK,0) && test_bit(tempK,0) && test_bit(tempK,0))
        {
                flg = TRUE ;
        }
        else
        {
                return FALSE ;
        }
       
        //求度数
        accl_in=x_*QMA6100P_SENSITITY_8G/1000.0;
        accl_in=x_*QMA6100P_SENSITITY_8G/1000.0;
        accl_in=x_*QMA6100P_SENSITITY_8G/1000.0;


        //得到Pich,和POLL坐标
    acc_normal = sqrtf(accl_in * accl_in + accl_in * accl_in + accl_in * accl_in);
          
    accl_data = accl_in/acc_normal;
    accl_data = accl_in/acc_normal;
    accl_data = accl_in/acc_normal;

        pitch = -atan2f(accl_in,accl_in);
    val = pitch * RAD_TO_DEG;//
   
    //grl_decangle = pitch * RAD_TO_DEG;
   
    acc_normal = sqrtf(accl_data * accl_data + accl_data * accl_data + accl_data * accl_data);

    roll = asinf((accl_data/acc_normal));
    val = roll * RAD_TO_DEG;//
       
    //grl_decangle = roll * RAD_TO_DEG;
        return flg;
}



定位到问题.就是 运行了这个函数,,1天/2天/3天 20%的死机(10台2台会死机重启)   而重启又是直接上电的那种,非看门狗和LVD..

怀疑是sqrtf asinf 这些函数出了问题.但是又奇怪是要2天后,或者1天后才出现
求助..
或者大家有这种角度转换函数,,分享一下给我哈..谢谢了..(不过最好定位一下问题)


wye11083 发表于 2023-8-1 21:52:57

查一下汇编,看看栈溢出的风险大不大。估计用了不少的局部变量,如果在执行atan/asin之类计算时进了系统中断,系统中断再调用一些其它函数,或者函数调用过深,栈可能会爆。默认栈我记得好像是512字节。所以很多单片机程序设计主要以全局变量/全局结构体之类的为主,就是为了避免占用过多栈空间。栈爆了之后万一把ra写成了0,函数返回时回到0地址,现象确实是单片机硬复位了。所以每4秒计算一次出错的概率确实小到可以忽略不计。。需要一大堆巧合才能触发一次。

sweet_136 发表于 2023-8-1 22:32:18

wye11083 发表于 2023-8-1 21:52
查一下汇编,看看栈溢出的风险大不大。估计用了不少的局部变量,如果在执行atan/asin之类计算时进了系统中 ...
(引用自2楼)

谢谢大神.我再研究研究, 看看汇编

陆小凤之北京 发表于 2023-8-4 11:46:47

acc_normal做除法的话需要不能等于0.

sweet_136 发表于 2023-8-4 13:32:24

陆小凤之北京 发表于 2023-8-4 11:46
acc_normal做除法的话需要不能等于0.
(引用自4楼)

好的,有道理..我加一个限制.
页: [1]
查看完整版本: 求助, 三轴MQA6100得到XYZ值,获取角度值,,程序运行一段时间死机,