Arduino - 陀螺仪传感器 - ISR - 时间戳
Arduino - Gyro sensor - ISR - TimeStamp
我目前正在努力重建一个四轴飞行器控制器。
我正在努力从我的陀螺仪传感器获取数据,为此,我正在使用
带有中断的 ISR。
我的问题是,当我在主程序上调用我的函数 "gyro.getX" 时,它起作用了。
但是,当我从 ISR 调用此函数时,它不起作用。
我发现错误的原因是,我正在使用的函数是由 "Adafruit_LSM9DS0" 库(来自 ST)提供的,它使用了 "timestamp"。
我认为 ISR 的当前时间与主程序的当前时间不同,但我不知道如何解决它。
这是我程序的快捷方式:
void loop(){
/*main prog*/
}
/*
*Reserve interrupt routine service (ISR) by Arduino
*/
ISR(TIMER2_OVF_vect)
{
TCNT2 = 256 - 250; // 250 x 16 µS = 4 ms
if (varCompteur++ > 25)// 25 * 4 ms = 100 ms (half-period)
{
varCompteur = 0;
SensorGet(pX, pY);//Feed gyro circular buffers
}
}
void SensorGet(float * pRollX, float * pPitchY)
{
lsm.getEvent(&accel, &mag, &gyro, &temp);
GiroX_Feed(pX, gyro.gyro.x);
GiroY_Feed(pPitchY, gyro.gyro.y);
}
bool Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
sensors_event_t *magEvent,
sensors_event_t *gyroEvent,
sensors_event_t *tempEvent)
{
/* Grab new sensor reading and timestamp. */
read();
uint32_t timestamp = millis();
/* Update appropriate sensor events. */
if (accelEvent) getAccelEvent(accelEvent, timestamp);
if (magEvent) getMagEvent(magEvent, timestamp);
if (gyroEvent) getGyroEvent(gyroEvent, timestamp);
if (tempEvent) getTempEvent(tempEvent, timestamp);
return true;
}
问题不在于时间。问题很可能是您的传感器使用 I2C 并且它在中断例程期间被禁用,或者它是一些其他依赖中断运行的通信协议,因此在您的 ISR 期间被禁用。
你真的是在滥用中断。这不是中断的目的。中断应该超快,没有时间在那里进行通信。所以真正的问题是为什么你认为你需要为此中断?
我目前正在努力重建一个四轴飞行器控制器。
我正在努力从我的陀螺仪传感器获取数据,为此,我正在使用 带有中断的 ISR。
我的问题是,当我在主程序上调用我的函数 "gyro.getX" 时,它起作用了。 但是,当我从 ISR 调用此函数时,它不起作用。 我发现错误的原因是,我正在使用的函数是由 "Adafruit_LSM9DS0" 库(来自 ST)提供的,它使用了 "timestamp"。 我认为 ISR 的当前时间与主程序的当前时间不同,但我不知道如何解决它。
这是我程序的快捷方式:
void loop(){
/*main prog*/
}
/*
*Reserve interrupt routine service (ISR) by Arduino
*/
ISR(TIMER2_OVF_vect)
{
TCNT2 = 256 - 250; // 250 x 16 µS = 4 ms
if (varCompteur++ > 25)// 25 * 4 ms = 100 ms (half-period)
{
varCompteur = 0;
SensorGet(pX, pY);//Feed gyro circular buffers
}
}
void SensorGet(float * pRollX, float * pPitchY)
{
lsm.getEvent(&accel, &mag, &gyro, &temp);
GiroX_Feed(pX, gyro.gyro.x);
GiroY_Feed(pPitchY, gyro.gyro.y);
}
bool Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
sensors_event_t *magEvent,
sensors_event_t *gyroEvent,
sensors_event_t *tempEvent)
{
/* Grab new sensor reading and timestamp. */
read();
uint32_t timestamp = millis();
/* Update appropriate sensor events. */
if (accelEvent) getAccelEvent(accelEvent, timestamp);
if (magEvent) getMagEvent(magEvent, timestamp);
if (gyroEvent) getGyroEvent(gyroEvent, timestamp);
if (tempEvent) getTempEvent(tempEvent, timestamp);
return true;
}
问题不在于时间。问题很可能是您的传感器使用 I2C 并且它在中断例程期间被禁用,或者它是一些其他依赖中断运行的通信协议,因此在您的 ISR 期间被禁用。
你真的是在滥用中断。这不是中断的目的。中断应该超快,没有时间在那里进行通信。所以真正的问题是为什么你认为你需要为此中断?