Перейти к содержанию
    

amaora

Участник
  • Постов

    764
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

amaora стал победителем дня 2 января

amaora имел наиболее популярный контент!

Репутация

17 Хороший

Информация о amaora

  • Звание
    Знающий
    Знающий

Посетители профиля

7 328 просмотров профиля
  1. В начале расскажу как измерение делаю сейчас, а после жду отзывов и предложений. Двигатель допустим трехфазный PMSM, но это не сильно важно. Сопротивление обмоток статора порядка ~4 мОм и хочется измерять его с точностью не хуже 10-20%. Двигатель подключён к мосту из MOSFET ключей (Rdson ~ 0.8 мОм), доступны измерения тока и напряжения на всех фазных выводах. Используется симметричная ШИМ, а выборки значений тока делаются по центру периода, выборки напряжения чуть позже (+1 мкс). Частота ШИМ 28 кГц, разрешение таймера 2940. Величина DeadTime и минимального импульса около 200 нс, в зависимости от схемотехники конкретного контроллера от 70 до ~600 нс. Измерение сопротивления очевидно производится с помощью известного выражения Rs = U / I. Где, U - вычисляется исходя из напряжения звена постоянного тока и коэффициента заполнения модуляции, I - измеряется непосредственно. Основные погрешности возникают от того, что U известно не точно из-за подавления импульсов малой длительности и неопределённости во время DeadTime. Что делается для компенсации погрешности измерения U? 1) Величина заполнения модуляции поднята по всем фазам на длительность минимального импульса, таким образом исключается нелинейность на малых значениях заполнения; 2) Измерение делается на двух значения тока (20А и 5А) с помощью выражения Rs = (U1 - U0) / (I1 - I0), таким образом исключается постоянная составляющая в U, которая может появится из-за DeadTime; 3) Используются измерения фазных напряжений для восстановления фактической длительности импульсов и компенсации погрешности из-за DeadTime. Схема аналогична интегрированию напряжения в течение периода модуляции, но в моем случае вместо интегратора используется аналоговый RC фильтр (с постоянной времени ~25 мкс) перед АЦП и цифровой КИХ после АЦП, который восстанавливает среднее за период напряжение по двум последовательным выборкам. Допустим напряжение звена постоянного тока 30в. Погрешность измерения Rs без этих компенсаций составила бы (200e-9 / 35e-6) * 30 (В) / (20 - 5) (А) ~ 11 мОм, что неприемлемо много. С компенсацией есть варианты, например когда, используется п.3 и не используется разница доходит до 3 мОм. То есть видимо, одних только п.1 и п.2 недостаточно, а на п.3 я не очень рассчитываю из-за того, что там делается самокалибровка коэффициентов FIR по результатам которой можно судить лишь о дифференциальной точности измерения среднего напряжения, но не по абсолютному значению. Другими словами, достаточно точный результат получается, только когда используются все три пункта. Точность оцениваю увеличивая ток (40А, 60А, ...) зондирования и уменьшая напряжение звена постоянного тока (15в), если оценка Rs при этом не уходит больше требуемых 10-20%, то считаю измерения достаточно точными. Эталона или средств измерения таким малых сопротивлений у меня нет. Погрешности датчиков тока, температурный дрейф, и другие типичные источники ошибок здесь не рассматриваю, это все в пределах 5%. Температурный дрейф сопротивления обмоток во время измерений тоже не превышает 5%.
  2. EKF - наблюдатель положения PMSM для бездатчикового управления; SRUKF (QR) - калибровка IMU; А так же экспериментальные реализации разных численных методов на тестовых задачах.
  3. Наибольший интерес представляет оценивание неизвестных параметров недоступных для прямого измерения по измерениям других связанных с ними параметров. Для понимания я бы рекомендовал сначала ознакомится с Байесовским выводом и например фильтром частиц. А разные варианты фильтра Калмана являются удобным частным случаем при условии нормального распределения вероятностей.
  4. А каков сценарий сгорания? что такое происходит с бутстрепным питанием? даже если конденсатор разрядился, есть отключение по UVLO.
  5. Обратите внимание на то, где объявлена portBYTE_ALIGNMENT.
  6. То, что увеличение стека решает проблему, не означает, что проблема именно и только в нехватке размера стека.
  7. Включить нагрузку через подозрительный участок (что-то побольше той лампы накаливания), через какое-то время посмотреть нагрев проводки тепловизором.
  8. Гамма коррекция может быть нужна например при рисовании графических примитивов со сглаживанием (antialiasing). На границах будут полутона и результат не всегда хорошо выглядит без подстройки гамма коррекции под конкретный дисплей.
  9. В ODrive так делают. Но мне не нравится неопределённость, не знаю как часто будет происходить это прерывание, и приоритет ему надо дать высокий. В худшем случае на предельно высокой частоте издержки будут выше (на вход/выход из прерываний), чем если поллингом через DMA.
  10. Делаю обработку сигналов STEP/DIR или CW/CCW на stm32f4. Как я понял нет никакой возможности настроить таймер, так чтобы он считал импульсы STEP с учётом направления заданного уровнем DIR. Для CW/CCW можно задействовать два таймера в режиме счётчика внешних импульсов, но не сошлось по ногам (оба входа идут на один таймер), да и не важен этот режим если не работает STEP/DIR. Все, что удалось придумать это поллинг GPIO регистров с помощью DMA и дальнейший ручной анализ фронтов. Сейчас это отнимает около ~2.5 мкс (каждые 35 мкс) при частоте опроса 500 кГц. Как можно сделать лучше?
  11. Ну здесь я вижу передачу тела цикла в свой foreach который видимо работает в compile-time. Не об этом спрашивал. Для примера, если бы при обработке прерывания возникла необходимость подождать некоторого события (например сброс BUSY флажка), а после сделать ещё какие-то действия. Вот эти действия можно записать лямбдой, захватить в неё необходимый контекст и передать планировщику в качестве обработчика события "BUSY=0". Код будет похож на линейный, как если бы ждали флажок в цикле. Интересна имитация блокирующих функций в таком стиле, подписка на событие и продолжение работы в обработчике. Как бы тогда мог выглядеть какой-нибудь сильно разветвленный код с множеством вложенных вызовов? Например, реализация printf, которая на нижнем уровне вызывает putc. Не будут ли слишком велики накладные расходы на передачу контекста? Как достаточно красиво делать длинные цепочки обработчиков? Примитивный псевдокод.
  12. А кто-нибудь здесь пишет event-driven с использованием средств C++? Лямбды и замыкания напрашиваются, чтобы ими записывать цепочки callback функций с сохранением контекста. Иногда интересуюсь, но попробовать времени не хватает.
  13. Примерный расчёт для вашего A2212. Находим потокосцепление lambda = (60. / 2. / pi) / sqrt(3.) / (Kv * Zp) = 4.1767e-04 (Вб). Находим момент при 30А фазного тока M = 1.5 * Zp * lambda * 30 = 0.1128 (Н*м). Тогда, без нагрузки скорость должна меняться со скоростью S = M / J = 1.3267e+04 (рад/c^2). То есть, за 0.1с можно ожидать S * 0.1 * 60 / (2*pi) = ~12669 rpm. С учётом сопротивления винта скорость будет нарастать медленнее (но и тормозить можно быстрее). Момент мотора так же вероятно будет ниже при большом токе из-за ограниченных возможностей железа статора (повышать ток начиная с некоторого значения становится малоэффективно).
  14. Порядок величин должен быть другой, "с 30% до 70%" за ~0.1с. Что-то не то с вашими ESC, и дело не в принципе их работы по ЭДС свободн6ой фазы. Есть бездатчиковые варианты векторного управления, с помощью наблюдателя по токам и напряжениям фаз. Можно использовать ЭДС (не прямо, а её влияние на токи) либо анизотропию импеданса статора зависящую от положения ротора. Очень странные идеи про трёхмерную функцию. По возможности надо делать чисто, а неучтенные зависимости забивать в таблицы это уже последнее, когда иначе никак. Таймер для управления мостом, несколько АЦП с привязкой момента выборки к таймеру, вычисления с плавающей точкой. Можно, но для воздушного винта нет необходимости в датчике положения, достаточно хорошо можно управлять двигателем и без него т.к. нагрузка предсказуема. Датчик здесь только приносит дополнительную возможность отказа, и вес.
×
×
  • Создать...