【问题标题】:Arduino - Gyro sensor - ISR - TimeStampArduino - 陀螺仪传感器 - ISR - 时间戳
【发布时间】:2017-12-05 22:12:18
【问题描述】:

我目前正在重新创建一个四旋翼控制器。

我正在努力从我的陀螺仪传感器获取数据,为此,我正在使用 有中断的 ISR。

我的问题是,当我在主程序上调用我的函数“gyro.getX”时,它可以工作。 但是,当我从 ISR 调用此函数时,它不起作用。 我发现了错误的原因,我正在使用的函数是由“Adafruit_LSM9DS0”库(来自 ST)提供的,它使用了“时间戳”。 我认为 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;
}

【问题讨论】:

  • 我找到一条信息:“这里的主要问题是,当您处于中断例程中时,“时钟没有滴答作响”。millis() 和 micros() 不会改变(嗯, micros() 最初会,但是一旦它超过需要毫秒刻度的神奇毫秒点,它就会崩溃。)”。所以我不能在 y ISR 中使用 millis,但我需要在我的函数中使用它来从我的传感器中获取价值......

标签: arduino timestamp embedded isr interruption


【解决方案1】:

问题不在于时间。问题可能是您的传感器使用 I2C 并且在中断例程期间被禁用,或者它是依赖于中断工作的其他通信协议,因此在您的 ISR 期间被禁用。

你真的在滥用中断。这不是中断的用途。中断应该是超快的,没有时间在那里进行通信。所以真正的问题是为什么你认为你需要一个中断?

【讨论】:

  • 嗨!谢谢您的回答。我的传感器使用 SPI 进行通信。正如我了解 ISR 的用法一样,它允许我以给定的频率从传感器中获取价值。所以我想使用 ISR 从我的陀螺仪中获取值,然后在主程序中获取值。使用这个值来计算我的 PID。您能否提供更多信息以更好地使用 ISR?
  • 你不需要中断来定期做某事。使用 millis 来跟踪时间并保持循环紧密且无阻塞。请参阅 IDE 附带的 Blink without Delay 示例。它以 1 秒的间隔闪烁 LED,但您可以轻松更改间隔并放入任何代码以按时间间隔运行。
  • 谢谢。我会开始往回走。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2011-11-06
相关资源
最近更新 更多