Ардупилот на платах OpenPilot Revolution / RevoMini (записей: 1756)

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 4 мес. назад

    Давным-давно, еще во времена АрдуКоптера 3.0, кем-то был написан HAL для Ardupilot для платформы OpenPilot Revolution. К сожалению, этот код не поддерживался в течение многих лет и поэтому безнадежно устарел.

    Некоторое время назад, я привел этот код к текущему состоянию Ardupilot и сделал PR на GitHub-е, дабы включить этот HAL в официальный репозиторий.

    С тех пор прошло 2 версии ArduCopter-а, но это PR до сих пор висит.

    UPD (20.02.2018) HAL в мастере! Однако еще есть причины пользоваться этим форком

     

    По сравнению с исходным HAL:

    • Почти весь код полностью переписан
    • Добавлена ​​проверка для всех входных параметров функций - нет более HardFault при установке  неправильных значений параметров
    • Внешняя шина I2C переехала с FlexiPort на драйвер Soft_I2C, поэтому есть по крайней мере 3 UARTа
    • Добавлен еще 1 полнофункциональный UART (только для квадрокоптеров) и 1 только RX UART для DSM сателлита на разъеме Oplink
    • Добавлена ​​поддержка пищалки (требуется дополнительный транзистор)
    • стек перемещен в CCM память
    • PPM и PWM входы работает через обработчики драйвера таймера - устранены все конфликты
    • Добавлена возможность принимать DSM, SUMD и SBUS на входе PPM 
    • Все таблицы описания аппаратуры  теперь константные и размещаются во флеше, а не в оперативке
    • Более надежный сброс зависаний шины I2C
    • Все драйверы поддерживают вызов set_retries ()
    • Все задержки - даже микросекунды - очень точные, реализуются с помощью аппаратных часов (счетчик DWT_CYCCNT) в автономном режиме
    • Разделенных порты USB и драйверы UART
    • Новый SoftwareSerial драйвер на основе аппнота от ST
    • используется вывод  DRDY MPU6000
    • Устранены предупреждения компилятора
    • Портирован и слегка доработан загрузчик для поддержки пришивки, размещаемой по адресам 8010000 и 8020000 (2 нижние 16k страницы флэш-памяти используются для эмуляции EEPROM)
    • Эмуляция EEPROM доработана для обеспечения надежности хранения данных при сбоях питания
    • Оптимизировано использование EEPROM путем изменения размера записи с 1 байта до 2 байт
    • Все внутренние вызовы используют статические приватные методы - нет оверхеда на обращения к членам класса
    • Удален многие неиспользуемые файлы
    • функция micros() использует 32-bit аппаратный таймер вместо сложной, тяжелой и глючной systick_micros()
    • добавлена поддержка параметров HAL
    • OneShot работает! При этом добавлен слой трансляции из режимов коптера в режимы HAL
    • добавлены дескрипторы всего набортного оборудования
    • добавлена поддержка перезагрузки в режим аппаратного DFU  (через MP "force PX4 bootloader" )
    • после любого HardFault или Panic() происходит автоматическая загрузка в режим аппаратного DFU
    • Поддержка режима diversity в RC_Input! Можно подключать два (даже разных!) приемника RC
    • отменены идиотские изменения из апстрима в интерфейсе Periodic
    • добавлена возможность использования вывода компаса DataReady 
    • унифицирована обработка всех исключений
    • добавлена возможность бинда Спектрумовских сателлитов без управляемого стабилизатора 3.3в (требует кратковременного отключения питания)
    • Добавлена ​​поддержка последовательности сброса Arduino32 - спад DTR на 1200 бод или пакет «1eaf» с высоким DTR
    • Исправлено зависание при сбое флеш-памяти
    • Соединение с USB идет без потери символов и  без зависания при отключении
    • Добавлена сработка FailSafe при зависании приемника - если ни один канал не меняется за 60 секунд
    • Добавлена ​​поддержка параметров HAL
    • Проект доработан для упрощения поддержки немного разных плат - например. AirbotF4
    • Полная поддержка AirbotF4 (отдельные двоичные файлы)
    • Добавлена ​​поддержка сервоприводов на неиспользуемых входных пинах
    • Добавлена ​​обработка битов ошибок FLASH_SR, включая автоматическую очистку защиты от записи
    • Добавил Arduino-подобную поддержку реле на произвольном выводе
    • Упрощен драйвер UART, буферизация теперь используется даже в неблокирующем режиме
    • Эмуляция EEPROM блокирует флеш после каждой записи с прерыванием в случае недопустимой записи
    • Обработка ошибок EEPROM
    • Исправлено похищение Ардупилотом Сервоприводов, даже если они отмечены как «Неиспользованные»,
    • Добавлена ​​дата и время компиляции для вывода в консоль
    • Добавлен вход SBUS через USART, например на платах Airbot
    • Добавлены файлы read_me.md для каждой платы
    • Режим DMA для больших передач SPI
    • Виртуальный COM-порт USB может быть подключен к любому UART - например. Для настройки модемов OSD или 3DR
    • Любой UART может быть подключен к ESC для 4-way интерфейса
    • Поддержка логов на SD-карте для платы AirbotV2
    • Время ожидания I2C ограничено 0,3 с - больше не зависает навечно от ошибок внешнего компаса
    • FlexiPort может быть переключен между UART и I2C согласно параметрам
    • Модуль RCoutput полностью переписан.
    • для выходов PWM скомпенсирована ошибка в настройке частоты таймера
    • Добавлен параметр для установки режима PWM
    • Добавлена ​​информация о используемой памяти
    • Добавлена ​​отчетность об ошибках I2C
    • Реализовано малопотребляющее состояние бездействия с WFE, TIMER6 используется для генерации событий рас в 1uS
    • Добавлен параметр HAL_RC_INPUT, позволяющий принудительно назначить модуль ввода RC
    • Добавлена ​статистика об использовании памяти и стека
    • Добавлено создание файла .DFU
    • Долгие операции перемещены с уровня прерывания на уровень ввода-вывода с минимально возможным приоритетом - теперь не теряются пакеты SBUS во время обработки
    • Добавлена ​​поддержка системы безопасности задающего генератора - если HSE (кварц) отказал в воздухе, контроллер станет использовать HSI вместо него
    • Добавлен EmergencyHandler, который будет вызвана при любой ошибке или вызове Panic() перед остановкой - например, Выпустить парашют
    • Индивидуальная раскладка моторов для каждой платы
    • Индивидуальное назначение консоли для каждой платы
    • HAL переведен на новый DMA API с прерываниями завершения обмена, и драйвер SD этим пользуется
    • Плата AirbotV2 полностью поддерживается  - SD-карта и OSD (OSD работает!)
    • Добавлена ​​поддержка чтения с SD-карты через USB, что позволяет использовать USB MassStorаge (задается через параметр HAL)
    • Добавлена ​​проверка переполнения стека для всех задач через MemoryProtectionUnit
    • Все платы могут форматировать внутренний флеш-чип в FAT и обеспечить доступ через USB
    • Добавлено автораспознавание SPI Flash
    • Добавлена ​​поддержка команды TRIM для Dataflash, форматированного в FAT
    • Переписана библиотека SD для поддержки «errno» и раннего различения файла и каталога, также вдвое уменьшен расход памяти
    • Преемптивная многозадачность, все драйверы работают в собственной задаче
    • Добавлено переформатирование DataFlash в случае жестких ошибок файловой системы, что устраняет ошибку FatFs, когда не освобождается место после переполнения файлов, а затем его удаления
    • Добавлено автоопределение для всех известных типов баронов на внешней шине I2C
    • Добавлено автоопределение для всех известных типов соединений на внешней шине I2C
    • Добавлена ​​проверка на I2C_Mgr для повторного создания устройства на одной шине с тем же адресом - для предотвращения ложного автоопределения, например MS5611 (уже инициализированного) как BMP_085
    • Добавлен параметр HAL "TIME_SHIFT" - разница времени между GMT и местным временем
    • Добавлена синхронизация времени между временем платы и временем GPS - так что в журналах теперь будет отображаться реальные локальные даты и время
    • добавлен параметр, позволяющий отложить сохранение EEPROM до арминга
    • компас и барометр отпускают семафор шины сразу после чтения, чтобы разрешить работу других драйверов во время вычислений
    • полный статус только на 2 светодиодах - подсчет спутниковв GPS, режим Failsafe, калибровка компаса, режим Autotune и т. д.
    • добавлена ​​возможность подключения пищалки к произвольному выводу (параметр NTF_BUZZ_PIN)
    • добавлен приоритет для пересылок SPI DMA
    • поддержка оверклокинга!
    • добавлена трансляция декодированных последовательных данных из входного порта PPMn в софтверные UARTы
    • Драйвер SoftSerial может использовать любой вывод с таймером для RX и любой вывод для TX, и может быть любое количество SoftSerial UART
    • добавлена ​​поддержка критических секций шедулера, которые защищают задачу от переключения без запрета прерываний
    • ...
    • Множество мелких улучшений

    Так что если кого-нибудь интересует ArduPlane / ArduCopter на контроллере  весом 5 грамм (с корпусом), а не только на огромном и тяжелом PixHawk - код и бинарники тут.  Описание подключения

    Проверено, летает!

    При этом обеспечиваются многие возможности, отсутствующие у официальной прошивки!

    • USB порт может быть подсоединен к любому UART, например к ОСД для настройки.
    • Любой УАРТ может быть подключен к ESC для их программирования
    • SD карта может быть подключена к USB в режиме MassStorage - нет необходимости вынимать ее из корпуса для чтения логов

    Вышеприведенные пункты позволяют разместить контроллер в корпусе и не разбирать его для настройки/чтения логов. А также:

    • автодетект компасов и барометров на внешней шине I2C позволяет подключить любую платку сенсоров для Ардуины серии GY-
    • автодетект протоколов SBUS/DSM/SUMD/PPM 
    • есть FailSafe при зависании приемника, если ни один канал не меняется за 60 секунд - теперь это не вызовет улета
    • возможность подключения 2х приемников - либо одновременно LRS и 2.4, либо как Diversity. Также это заметно увеличивает надежность
    • используется система безопасности кварца - контроллер не зависает при его отказе
    • возможен оверклок процессора - стабильно работает до 240 МГц!
    • возможно практически произвольное использование свободных выводов
    • возможно использование аналогового датчика воздушной скорости
    • пищалка может быть назначена на любую ногу
    • полная индикация состояния на 2х диодах: подсчет спутниковв GPS, режим Failsafe, калибровка компаса, режим Autotune и т. д.
    • процессор ~65% времени проводит во сне - что значительно снизило потребление и нагрев

    Вся коптерная электроника кучей - 15 грамм.

     

    А вот вся электроника на коптере

     

     

    Поблагодарить можно тут:
    USD
    EUR

     Или переводом - PayPal на vde@ykoctpa.ru, Qiwi 9173480717

    UPD. Добавлена поддержка барометра на внешней I2C.  Теперь можно взять такой контроллер на Ф4 за 15 баксов, к нему такой  или такой модуль - и вот у нас полный контроллер для Ардупилота за $23 или даже $19

    UPD2. Протестирована работа всей перефирии на SoftI2C и SoftSPI - теперь любые 2 ноги контроллера могут быть назначены как внешняя шина I2С, и любые 4 ноги - как внешняя шина SPI. Что, помимо наличия выведенной наружу SPI3, позволяет подключить произвольное оборудование в практически произвольном количестве.

    UPD3. Добавлена возможность легко добавлять произвольные платы на похожих процессорах, отличающиеся только назначением выводов

    ПРОШИВКА.

    OPBL образы не поддерживаются, ибо бинарник должен жить на другом адресе, поэтому для перепрошивки нужно перевести проц в режим DFU - для этого замкнуть выыодв платы BOOT и включить USB. А затем выполнить команду

    dfu-util -a 0 --dfuse-address 0x08000000 -D /path/to/firmware.bin 

    где firmware.bin это прошивка для вашей платы.

     

  • Аватар профиля macrokernel macrokernel в 7 г., 4 мес. назад

    Круто! На каких платах работает? Барометр, компас, GPS поддерживаются? Было бы интересно запустить на чём-нибудь типа этого: http://www.banggood.com/F3-EVO-Cleanflight-10DOF-Flight-Controller-Oem-Version-for-Multirotor-Racing-with-4G-MicroSD-p-1064058.html

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 4 мес. назад

    На F4 , ведущих  родословную от OpenPilot Revoluton - то есть на ней самой,  RevoMini (на фото, самая перспективная), Airbot F4 (с внешней платой барометра и магнитометра, придется пересобирать). Ни на каких F3 работать не будет просто по определению - принципиально разное железо в камне.

    Поддерживается все что поддерживает Ардупилот

    UPD. Пересобиранть не придется, барометр на внешней шине I2C поддерживается "из коробки"

  • Аватар профиля kozin Алексей Козин в 7 г., 4 мес. назад

    Приветствую, удивительная работа! Есть ли планы присоединить и поддерживать проект в официальном репозитории арду?

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 4 мес. назад
    [2016-12-31 11:11:33] kozin писал(а): Есть ли планы присоединить и поддерживать проект в официальном репозитории арду?

    Присоединить - да, делалось уже 3 ПР на гитхабе, результат в точности как у вас.

    Поддерживать - нет, ибо в отличие от вас нет личной заинтересованности, и какая мне разница где поддерживать - свой форк или официальный?

  • Аватар профиля kozin Алексей Козин в 7 г., 4 мес. назад

    сделанные вами изменения крайне интересны, я давно пытался убедить коллег в необходимости использования вывода  DRDY MPU6000
    тем более что аппаратно он у нас уже заведен
    если вам будет интересно поэкспериментировать я бы мог вам бесплатно выслать экземпляр актуальной версии нашего контроллера.
    получение этого контроллера не будет отягощено какими либо обязательствами с вашей стороны
    связаться со мной можно kozin@mail.ru

     

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 4 мес. назад
    [2017-01-01 07:47:14] kozin писал(а): я давно пытался убедить коллег в необходимости использования вывода  DRDY MPU6000тем более что аппаратно он у нас уже заведен

    сейчас драйвер Invensense поддерживает использование вывода DRDY, достаточно определить "#define INVENSENSE_DRDY_PIN где_он_там"

    [2017-01-01 07:47:14] kozin писал(а): если вам будет интересно поэкспериментировать я бы мог вам бесплатно выслать экземпляр актуальной версии нашего контроллера.

    Спасибо за предложение, но я пока не вижу смысла. У вас ХАЛ для него давно отлажен и работает,  а камень у вас имеет 2МБ флеша и оттого не нуждается в "кроилове" и отказе от ОС на борту.

    У меня же основная задача была - заставить Ардушный код работать на самом мелком (4 грамма без корпуса) и самом дешевом ($34 в розницу), но при этом полноценном F4 контроллере, который к тому же хорошо оттестирован на всяческих Бета/Клин/зеленыйсыр-флаях и зарекоменовал себя весьма надежным. 

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 4 мес. назад

    Видео первого полета где-то в Италии

  • Аватар профиля kozin Алексей Козин в 7 г., 4 мес. назад

    спасибо, нашел

    https://github.com/night-ghost/ardupilot/blob/master/libraries/AP_HAL/board/revomini.h#L26

     

     

     

  • Аватар профиля kozin Алексей Козин в 7 г., 4 мес. назад

    ИМХО  не критики ради а от непонимания,

    несколько странно написана обработка пина  DRDY в драйвере.

    - тупо чтение состояния пина - вместо того чтобы поставить внешнее прерывание на ногу и вызывать считывание регистров, а затем осуществлять перезапуск цикла вычисления .

    при необходимости из внешнего контролирующего цикла следить за таймаутом процесса

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Это не  я, я только ХАЛ пилю :)

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    а хал то великолепный вышел! ни субмодулей, ни натикса, ни слоя драйверов. Это в разы облегчает процесс адаптации нового контроллера.
    С точки зрения использования - наличие натикса - врядли дает какое то преимущество, другое дело если бы под ос юзер сам бы выбирал какие приложения он будет запускать, по сути если использовать ваш хал для f4by нужно создать конфиг платы, выбрать проц и расставить датчики по пинам? теоретически ваш хал может вернуть возможность вернуть проект в изначальное "арду" русло, когда широкий круг лиц мало мальски знакомых с С++ мог дополнить проект своим функционалом

     

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-02 06:58:56] kozin писал(а): по сути если использовать ваш хал для f4by нужно создать конфиг платы, выбрать проц и расставить датчики по пинам?

    Именно. Свой файл платы (или #if) в AP_HAL/board и своя папка платы в AP_HAL_REVOMINI/wirish/boards с распиновкой камня. 

    [2017-01-02 06:58:56] kozin писал(а): еоретически ваш хал может вернуть возможность вернуть проект в изначальное "арду" русло, когда широкий круг лиц мало мальски знакомых с С++ мог дополнить проект своим функционалом

    Я как раз старался именно это и получить. Возврат к истокам, так сказать - ибо мне непонятно, зачем на борту нужен интерпретатор командной строки... 

    Проект начинался с Ардуины - и самым логичным развитием был бы переход на платформу Ардуино32. Вот только ээээ... слегка извращенная структура контроллера PX4, на коий и был первый 32-бит порт, оставила свой отпечаток на всем проекте. Более поздние ХАЛ, например Линукс, уже гораздо проще идеологически. Да и практически все датчики для PX4 являются особым случаем - AP_InertialSensor_PX4 вместо AP_InertialSensor_Invensense, и так далее.

    Единственное что пока есть один косяк - все работает при (не)оптимизации -O0,  а даже -Og ломает опрос MPU6000 :( Сейчас вроде выловил пострадавшие файлы, по мере свободного времени постараюсь поймать.

     

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    наверное пременные не объявлены volatile а обработка в прерываниях. лично мне других причин не приходит в голову

    шедулер на прерываниях?

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Ну таки обычно да, вот только в данном случае я ничего похожего не вижу. SPI вообще не использует прерываний, а вся обработка таймеров не использует переменных, общих с основным потоком.

    6 файлов, требующих -O0 чтобы все работало, я сегодня выделил в TODO, но убей Бог лаптем не могу понять связь SPI и таймеров..

     

    [2017-01-02 12:23:43] kozin писал(а): шедулер на прерываниях?

    Естественно, прерывания от 7 таймера 8КГц, но все проходится по шагам и вроде правильно, в том числе и все интервалы - а из MPU читается мусор или нули.

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    я встречал пару раз необъяснимое мне поведение в коде запускаемом по таймеру

    например если сделать вывод в дебаг вывод состояний из функции зарегистрированной в таймере так

    hal.scheduler->register_timer_process(FUNCTOR_BIND_MEMBER(&AP_Camera::feedback_pin_timer, void));

    то при частоте вызовов 1кгц я в консоли получаю 1-символьные значения крайне нестабильно, раз у несколько сек.

    если в этой же функции стоит что либо быстрое например переброс выхода 0-1-0-1 то все отрабатывает - вижу на пине генерацию 500гц.

    из чего чисто теоретически делаю вывод что если функция не успела отработать за отведенный период ее прерывают и перезапускают.

    собственно кто таков этот функтор и в чем его специфика - для меня темный лес

    в доке другой пример http://ardupilot.org/dev/docs/learning-ardupilot-threading.html

    hal.scheduler->register_timer_process(AP_HAL_MEMBERPROC(&AP_Baro_MS5611::_update));

    кстати в олед индикаторе после того как тиджел его включил в свою версию - тоже стало все рассыпаться именно тогда когда он повесил обновление на таймер

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-02 15:03:15] kozin писал(а): то при частоте вызовов 1кгц я в консоли получаю 1-символьные значения крайне нестабильно, раз у несколько сек.

    Там везде стоит проверка что вывод в консоль запрещен из таймерных функций, так что вывод получается ТОЛЬКО если по какой-то причине прерывание было отложено и затем вызвано из основного потока.

    [2017-01-02 15:03:15] kozin писал(а): если функция не успела отработать за отведенный период ее прерывают и перезапускают

    Это вопросы реализации конкретного шедулера, я так не делаю.

     

    [2017-01-02 15:03:15] kozin писал(а): обственно кто таков этот функтор и в чем его специфика - для меня темный лес

    Просто обертка для того чтобы можно было унифицированно вызвать метод любого класса без возни с оператором ->*

    [2017-01-02 15:03:15] kozin писал(а): в доке другой пример

    Дока ни о чем, если в двух словах то нужны 2 дополнительных потока - высокого приоритета и желательно реалтайм, и низкого приоритета. Звязываться с настоящей многозадачностью было лениво, поэтому реалтайм поток реализован как и в АПМ на таймере, а низкоприоритетный на простой кооперативной многозадачности во время исполнения разнообразных dalay()

    [2017-01-02 15:03:15] kozin писал(а): тоже стало все рассыпаться именно тогда когда он повесил обновление на таймер

    Но у меня-то при -O0 работает! Хотя явно выполняется дольше чем без оптимизации.

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    возможно у вас есть полная вспомогательная табличка соответствия названий портов проца и условных номеров портов используемых для этого хала

    https://github.com/night-ghost/ardupilot/blob/master/libraries/AP_HAL_REVOMINI/wirish/boards/revomini_MP32V1F4/revomini_MP32V1F4.h

    #define BOARD_USART5_RX_PIN 26 // PD2            т.е.  PD2 = 26

     хотел попробовать свои силы в том чтобы затестить ваш хал на f4by, но уперся в сопоставление портов

     

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    у меня кстати ряд варнингов показывает эклипс

    втч https://github.com/night-ghost/ardupilot/blob/master/libraries/AP_InertialSensor/AP_InertialSensor_Invensense.cpp#L811

    Description    Resource    Path    Location    Type
    No break at the end of case    AP_InertialSensor_Invensense.cpp    /ardupilot/libraries/AP_InertialSensor    line 811    Code Analysis Problem

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-03 07:17:40] kozin писал(а): табличка соответствия названий портов проца и условных номеров портов

    это PIN_MAP, находится в https://github.com/night-ghost/ardupilot/blob/master/libraries/AP_HAL_REVOMINI/wirish/boards/revomini_MP32V1F4/revomini_MP32V1F4.cpp

    [2017-01-03 07:36:44] kozin писал(а): ряд варнингов показывает эклипс

    Он ввобще дурной и умудряется найти проблемы там где из нет.UPD но таки да, тут баг похоже

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    [pinmap] спасибо! классно!

    если я не надоел еще тут своим "нудежом" то какие есть мысли по DRDY.

    если пин не заведен на процессор - то тут при  чтении регистров мпу наобум лишняя нагрузка на проц, спиай и саму мпу, поэтому цель поймать цикл готовности данных и в этот момент их забрать. т.е. важно забрать за один цикл измерения забрать 1 сэмпл, не 2 или больше и в то же время не пропустить.

    в ситуации когда используется drdy - идеально поставить легковесную функцию в аппаратное прерывание, для регистрации фронта импульса. Если же проверять пин DRDY циклически из таймера, то чтобы гарантировано попасть в момент близкий к фронту импульса состояние пина нужно проверять с частотой на порядок выше чем частота сигнала, т.е. при частоте измерения мпу 1кгц нужно опрашивать пин как минимум на 10 кгц. Причем в случае если фронт импульса зарегистрирован то важно не запускать повторные измерения пока пин в активном сотоянии, следует дождаться нового фронта. При этом можно установить таймер на паузу чуть меньше чем цикл измерения мпу, а затем проверять пин с высокой частотой.

    если же пин готовности мпу проверять тупо с частотой измерений, т.е. 1кгц то проверка пина может придтись не на начало импульса а гдето к его концу и велика вероятность что чтение  регистров может совпасть с процессом их переустановки в результате измерения. зы. я не знаток мпу, чисто по аналогии с другими спи устройствами

     

     

     

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Я совершенно согласен, но... если начать менять саму логику работы Ардупилота то с мыслью попасть в мейнстрим можно попрощаться. Хотя вся работа с железом там настолько через жо...

    Иногда кажется что взять драйверы и устройство цикла из Инав, и туда  припилить поддержку ардушных библиотек разных фич было бы намного правильнее...

    Все что проверяется в ХАЛе уже и так опрашивается с частотой 8кгц

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Вдогонку про Пинмап. Есть еще таблица таймеров в pwm_in.c и еще одна таблица таймеров в timer.c. По уму их тоже надо бы в описатель платы засунуть, но вроде бы в пределах семейства они остаются неизменными

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    вроде как тут регистрируется

    https://github.com/night-ghost/ardupilot/blob/master/libraries/AP_InertialSensor/AP_InertialSensor_Invensense.cpp#L465

    _dev->register_periodic_callback(1000, FUNCTOR_BIND_MEMBER(&AP_InertialSensor_Invensense::_poll_data, bool));

    1кгц

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-03 09:10:11] kozin писал(а): вроде как тут регистрируется

    Это да, как я уже сказал я стараюсь по максимуму не трогать код ВНЕ ХАЛа. 

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Если уж заниматься оптимизацией то ВЕСЬ опрос ВСЕХ  датчиков должен делаться внутри ХАЛ, а основной поток должен брать готовые даные из очереди - как это сделано с УАРТами. Тогда можно было бы и предывания юзать с пользой а не как сейчас, тупо дожидаясь окончания, и DMA, и прочие вкусности камня. 

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-03 09:10:11] kozin писал(а): 1кгц

    Кстати о :) получение данных с МПУ совмещено с их не самой легкой обработкой, так что иногда эта _poll_data выполняется аж 1286uS - так что килогерц это весьма оптимистично.

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    вот еще интересное наблюдение

    метод

    bool AP_InertialSensor_Invensense::_data_ready()
    {
        if (_drdy_pin) {
            return _drdy_pin->read() != 0;
        }
        uint8_t status = _register_read(MPUREG_INT_STATUS);
        return (status & BIT_RAW_RDY_INT) != 0;
    }

    используется только в инициализации

    https://github.com/night-ghost/ardupilot/blob/master/libraries/AP_InertialSensor/AP_InertialSensor_Invensense.cpp#L880

    по идее он конечно же публичный и может проверяться снаружи, но ненашел

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    ради интереса посмотрел используют ли аппаратные прерывания в клинфлайте.

    https://github.com/cleanflight/cleanflight/blob/master/src/main/drivers/accgyro_mpu.c#L216

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-03 10:34:49] kozin писал(а): используется только в инициализации

    совершенно верно. Цикл опроса выбран так что данные гарантированно уже есть, так что толку от этой ноги около 0. 

    [2017-01-03 11:01:07] kozin писал(а): используют ли аппаратные прерывания в клинфлайте.

    Я уже говорил что их модель работы с железом нравится мне намнооого больше, а что поделаешь? Вообще, сравнивая развитие  за последний год  ардупилота и семейства клин/бета/етс-флайт напрашиваются грустные мысли, и вспоминается ОпенПилот, царствие ему небесное.

← Форум группы   Все форумы К последней записи
Постов на странице:

Вы автоматически вступите в эту группу, когда ответите в теме.

Добавить ответ:

-
Рейтинг@Mail.ru