完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友

|
大家好,我用两路 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 } |
|
相关推荐
8个回答
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我程序跑飞的情况就是,陀螺仪一直读数一直不变,卡死了,不能正常工作,我的变量基本都是全局变量,因为变量大部分都是公用的,我想问下,有人说变量少使用全局变量,封装性好一点,嵌入式的需要考虑这个问题吗 |
|
|
|
|
|
我想请问下什么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 中做了?
如果没有做,只要中断例程一返回,又会立即产生中断; 建议先不要直接用中断方式,用查询方式确定陀螺仪能正确运作,再加入中断方法,一步一步来。 |
|
|
|
|
woodmice 发表于 2014-4-25 18:04 if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) { TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update); //清除中断标志了 GetAngle(); } 谢谢你的建议 |
|
|
|
|
|
谢谢大家了,之前的问题是我陀螺仪板子上的地接触不良引起的,大家的的建议我从中又学到写些新东西
|
|
|
|
|
|
谢谢楼主分享!!!
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 19:33 , Processed in 0.604090 second(s), Total 56, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
9215