大家好,我用两路 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会对一些可能产生错误的位置更加敏感吗?
下面是我的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)/*等待发送完成*/
{
}
}
}
一周热门 更多>