|
最近在使用MPU6050传感器,能够顺利地读取加速度以及陀螺仪的数值。
并且通过定时器中断,每隔20ms读取一次陀螺仪的值,并积分计算角度。也使用了互补滤波获得了角度。
在各个部分分开工作时没有任何问题。
我想同时输出加速度值、陀螺仪积分角度、互补滤波角度进行比较,但是发现同时开启三个函数以后,只能传出有限的几组数据。之后单片机就会卡住,必须复位。
开始我以为是程序计算量过大,然后我精简了代码,避免了所有浮点数运算,但是没有改观。而且有时候能正常运行的时间长,有时候短。
使用的单片机是atmega128a,应该是avr较高端的芯片了。
下面附上部分的程序:
这个是读取z轴角速度
void GYRO_Z(void)
{
int DATA,gyro; //gyro存储角速度,数值是10倍的真实速度
signed char offset;
offset = GYRO_Z_OFFSET; //设置零漂移
DATA = MPU_Read(GYRO_ZOUT_H);
DATA = (DATA<<8)+MPU_Read(GYRO_ZOUT_L);
gyro = (long)DATA * GYRO_FACTOR/10000L - offset*10L; //乘除相应的系数,换算成标准单位
}
这个是定时器初始化
void TIMER1_Init(void)
{
TCCR1A = 0x00;
TCCR1B = 0x00;
TCCR1C = 0x00;
TCNT1H = 0xF6; //定时20ms
TCNT1L = 0x3C;
TIMSK |= 0x04;
TCCR1B = 0x03; //设置为64分频,定时器开始工作
}
这个是定时器中断,用来积分计算角度
#pragma interrupt_handler TIMER1_Interrupt:15
void TIMER1_Interrupt(void)
{
int DATA,gyro; //gyro存储角速度,是100倍的实际角速度
signed char offset;
TCNT1H = 0xF6;
TCNT1L = 0x3C;
offset = GYRO_Y_OFFSET;
DATA = MPU_Read(GYRO_YOUT_H);
DATA = (DATA<<8)+MPU_Read(GYRO_YOUT_L);
gyro = (long)DATA * GYRO_FACTOR/1000L - (long)offset*100L;
angle_test = (long)angle_test + (long)gyro * 20L/1000L; //
}
单独工作都没有问题,就是不能一起工作,很纳闷,有没有人能帮忙解决下,不胜感激! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|