IMU-сенсор (Troyka-модуль) и сложности с delay

Тема в разделе "Arduino & Shields", создана пользователем sheynmanyu, 8 окт 2017.

  1. sheynmanyu

    sheynmanyu Нерд

    Всем привет!
    Подключила библиотеку и модуль к ардуино-микро-про. Запускаю пример из wiki. Задержку между выводами в СОМ-порт ставлю равной 100 мс (delay(100)), а в итоге данные получаю примерно 2 раза в секунду. При этом millis() считает, что прошло именно 100 мс...
    Кто-нибудь сталкивался? Подскажите, куда копать?
    #include <GOST4401_81.h>
    #include <l3g4200d.h>
    #include <lis331dlh.h>
    #include <lis3mdl.h>
    #include <LPS331.h>
    #include <MadgwickAHRS.h>
    #include <stmhw.h>
    //#include <troyka-imu.h>
    #include <TroykaIMU.h>

    // создаём объект для работы с гироскопом
    Gyroscope gyro;

    void setup()
    {
    // открываем последовательный порт
    Serial.begin(115200);
    // выводим сообщение о начале инициализации
    Serial.println("Gyroscope init...");
    // инициализация гироскопа
    gyro.begin();
    // устанавливаем чувствительность гироскопа
    // 250dps — по умолчанию, 500dps, 2000dps
    gyro.setRange(RANGE_2000DPS);
    // выводим сообщение об удачной инициализации
    Serial.println("Initialization completed");
    }

    void loop()
    {
    // вывод угловой скорости в градусах в секунду относительно оси X
    Serial.print(gyro.readDegPerSecX());
    Serial.print("\t\t");
    // вывод угловой скорости в градусах в секунду относительно оси Y
    Serial.print(gyro.readDegPerSecY());
    Serial.print("\t\t");
    // вывод угловой скорости в градусах в секунду относительно оси Z
    Serial.print(int(gyro.readDegPerSecZ()+0.5));
    Serial.print("\t\t");
    Serial.println("");
    delay(100);
    }
     
  2. ORLENOK

    ORLENOK Гик

    millis() в коде не видно. delay() и millis() разные вещи. Если стоит delay(100) - это не значит, что данные будут выводиться точно через 100мс. Ещё тратиться время на обработку других команд.
     
  3. sheynmanyu

    sheynmanyu Нерд

    Я добавляла вывод millis()в четвертый столбик:
    Serial.print(int(gyro.readDegPerSecZ()+0.5));
    Serial.print("\t\t");
    Serialprint(millis());
    Serial.println("");
    delay(100);
    Сначала скопировала код, а потом, до того, как отправить, проверила результат выполнения millis(). Я знаю, что delay() не умеет давать точную задержку, посколько нужно время на выполнение других операций. Но обновление данных о положении гироскопа и чтение по i2c проходит достаточно быстро, особенно если выставить минимальную чувствительность гироскопа. И вывод на uart тоже ну никак не может затянуться на 400 мс...
     
  4. sheynmanyu

    sheynmanyu Нерд

    А какие fuse-bits у arduino pro micro? Бит деления внешней частоты на 8 должен быть запрограммирован или нет? Микроконтроллер atmega32u4