微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 两路 IIC 分别测角加速度和陀螺仪的数据,但程序总跑飞

两路 IIC 分别测角加速度和陀螺仪的数据,但程序总跑飞

时间:10-02 整理:3721RD 点击:
大家好,我用两路 IIC 分别测出角加速度和陀螺仪的数据,每10ms进入一次中断,中断中对数据经行处理,并通过usart发送数据。但是程序总是跑飞,原因可能是什么。下面是我中断的代码。
void TIM2_IRQHandler(void)
{
        if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
        {        
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);   
                GetAngle();
        }                        
}
void GetAngle(void)
{
     LX_Val.Angle+=(LX_Val.Acc)*dt;
    Angle_delta=(MZ_Val.Angle-Real_angle)*Tg;
    Real_angle+=(LX_Val.Acc+Angle_delta)*dt;
                 
         #if 1
      SendDate('1',LX_Val.Angle,100) ;
      SendDate('2',MZ_Val.Angle,100) ;
      SendDate('3',Real_angle,100) ;
          #endif
}

怎么个‘跑飞’法?
变量都是在哪里定义的?
你怎样判断就是在此处跑飞的?

建议小编给出全部的代码
一般程序跑飞是由于变量没有进行初始化就使用了  可以提高keil编译时的警告等级

我程序跑飞的情况就是,陀螺仪一直读数一直不变,卡死了,不能正常工作,我的变量基本都是全局变量,因为变量大部分都是公用的,我想问下,有人说变量少使用全局变量,封装性好一点,嵌入式的需要考虑这个问题吗

我想请问下什么keil编译时的警告等级是指,我可以设置keil的一些选项,然后keil会对一些可能产生错误的位置更加敏感吗?
下面是我的main.c 其他的太杂,太多了,不好
#include  "stm32f10x.h"
#include  "usart.h"
#include  "l3g4200.h"
#include  "tim.h"
#include  "mma7455.h"
#include  "pwm_out.h"
void  SendData(unsigned char Type,float data,float Max_Value);
void  GetAngle(void);
void Init_angle(void);
unsigned char Sendbuf[5]={0x55,0xff,0xff,0xff,float dt=0.01;                            //中断定时长度
float Tg=0.3;                                    //时间积累常数的倒数
float Angle_delta,Real_angle;        //

float Angle_ctr_P=10,Angle_ctr_D=0.3; //P常数和D常数
float ValFront=0,ValBack=0;            //前后转的标志
int CCR3_Val=0,CCR4_Val=0;                //pwm 大小控制量


MMA_Dat MX_Val={MMA_XOUT8_Addr,'X'};         //加速度数据
MMA_Dat MY_Val={MMA_YOUT8_Addr,'Y'};
MMA_Dat MZ_Val={MMA_ZOUT8_Addr,'Z'};
L3G4200_Dat LX_Val={OUT_X_H,OUT_X_L,'X',0,0};//陀螺仪数据
L3G4200_Dat LY_Val={OUT_Y_H,OUT_Y_L,'Y'};
L3G4200_Dat LZ_Val={OUT_Z_H,OUT_Z_L,'Z'};

int main(void)
{
//uarst 配置
          Usart1_Config();
//定时器配置         
          TIM2_NVIC_Configuration();
     TIM2_Configuration();
//角加速度配置
          I2C2_GPIO_Config();
          I2C_MMA_Offset();
          
         // I2C_MMA_Config();
         // I2C_MMA_Cal();
//陀螺仪配置
          I2C_GPIO_Config();
          Init_L3G4200();
//电机初始化pwm
    TIM3_PWM_Init();
   Init_angle();
      START_TIME;
          while(1)       
           {
                 
       
           Read_Mma(&MZ_Val);     //读出加速度数据,并转换为角度
               Read_L3G4200(&LX_Val);//读出陀螺仪数据,并转化为角加速度
             Angle_Ctr(&LX_Val);
            Motor();
       
                   }
}

void Init_angle(void)
{
    u8 i=100;
        float temp=0;
        while(i--)
        {
          Read_Mma(&MZ_Val);
          temp+=MZ_Val.Angle;
        }
        LX_Val.Angle=temp/100.0;
        Real_angle=LX_Val.Angle;
}

void GetAngle(void)
{
     LX_Val.Angle+=(LX_Val.Acc)*dt;
         Angle_delta=(MZ_Val.Angle-Real_angle)*Tg;
         Real_angle+=(LX_Val.Acc+Angle_delta)*dt;
         #if 1
          //SendData('1',LX_Val.Angle,100) ;
      SendData('1',MZ_Val.Angle,100) ;
      SendData('2',Real_angle,  100) ;
          SendData('4',CCR3_Val/5.0,100);
          SendData('5',CCR4_Val/5.0,100);
         #endif
}

void  SendData(unsigned char Type,float data,float Max_Value)  //发送数据到上位机
{
        int temp=0;
        char i=0;
       
    temp=(int)(data/Max_Value*32768.0);
        Sendbuf[1]=Type;
        Sendbuf[3]=(unsigned char)(temp & 0xff);     //l
        Sendbuf[2]=(unsigned char)((temp>>8) & 0xff);//gao
    for(i=0;i<5;i++)
        {
         USART_SendData(USART1, (uint8_t) Sendbuf); /*发送一个字符函数*/
     /* Loop until the end of transmission */
          while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)/*等待发送完成*/
          {
          
          }
  }
}


TIM2_IRQHandler 好像没有在返回前做清除中断标志位的工作?还是已经在 TIM_GetITStatus 中做了?
如果没有做,只要中断例程一返回,又会立即产生中断;
建议先不要直接用中断方式,用查询方式确定陀螺仪能正确运作,再加入中断方法,一步一步来。

if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
        {        
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);    //清除中断标志了
                GetAngle();
        }   
谢谢你的建议
               

谢谢大家了,之前的问题是我陀螺仪板子上的地接触不良引起的,大家的的建议我从中又学到写些新东西

谢谢小编分享!

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

网站地图

Top