• Регистрация
Dorringtorr
Dorringtorr 0.00
н/д

Фильтр Калмана для аппроксимации скорости между измерениями

24.05.2020

Добрый день.

 

Помогите пожалуйста решить небольую математическую проблему.

Есть электрической мотор. Его обороты измеряются посредством измерения времени между датчиками расположенными по его окружности. датчики расположены равномерно. В зависимотсти от оборотов, интервалы срабатывания датчиков от 1мс до 170мс. Время уже измеряется и фильтруется, по сути на входе идет время между срабатыванием предыдущего датчика и текущего. Временем срабатывания можно принебречь. 

Необходим алгоритм (можно фильтр Калмана), довольно быстрый и желательно чельночисленный, то бы аппороксимировать скорость вращения, с интервалами в 1 мс, когда время срабатывания между датчиками более 1мс. Другими словами, необходимо каждую миллисекунду вычислять приблизительное время интервала до срабатывания следующего датчика. 

 

Спасибо.

 

С Уважением Михаил 

Теги

    24.05.2020

    Ответы

    • aBoomest
      aBoomest+942.89
      25.05.2020 05:51

      В реальном времени нужен прогноз о будущем времени срабатывания или у вас просто есть неравномерный массив времен срабатывания и вам из него нужно сделать равномерный?

      • Andrey Ermakov
        Andrey Ermakov +56.93
        25.05.2020 10:42

        Присоединюся к вопросу, что нужно узнать? Или вы просто скорость посчитать хотите?

        • Dorringtorr
          Dorringtorr0.00
          25.05.2020 13:11

          Добрый день

           

          Скорость и так считается.

          У нас 3 холла. тоесть 6 тиков за эл. оборот. 6 буферов, куда приходит время между тиками. Скорость вычисляется когда приходит новый тик. На медленных оборотах, скорость может меняться очень быстро. И по этому необходимо знать как она меняется между тиками.

          Вот прилагаю лог . Actual - это уже вычсленная скорость, buff - это 6 буферов времени между тиками

          • aBoomest
            aBoomest+942.89
            25.05.2020 14:15

            тоесть 6 тиков за эл. оборот.

            ясно

            6 буферов, куда приходит время между тиками.

            почти понятно, но не полностью.

            На медленных оборотах, скорость может меняться очень быстро.

            еще сильнее не понятно.

            За оборот 6 измерений. В вашем файле длинная запись во времени.
            Вопрос:
            - почему actual - скорость в милисекундах?
            - допустим возьмем buff[3]. Значение в нем - это время по отношению к чему? К buff[3] из предыдущей строки в вашем файле, или по отношению к buff[2] этой же строки? Т.е. как происходит заполнение буфера?

            Или может вы после 6 измерений по ним считаете одно значение скорости? (Которое в милисекундах)

            Алгоритм хотелось бы уточнить?

            PS: если у вас есть лог с которым вы в итоге работаете, то функция interp1.

            • Andrey Ermakov
              Andrey Ermakov +56.93
              26.05.2020 05:50

              ну как пример можете сдлеать PLL в вращающейся системе координат( google) и использовать выше холлы как угол с дискретностью pi\3 ПЛЛ при достаточно динамиченой настройке будет давать некий переходный процесс по скорости.

              А какая задча стоит? Если серво система то на около нулевых скоростях холлы не то к чему нужно стремиться=) если управление моментом то выше описанное работает. 

            • Dorringtorr
              Dorringtorr0.00
              25.05.2020 17:01

              actual - скорость в герцах с 1й точкой после запятой, считается просто - медиана из 6 буферов. Но в данном случае эта скорость нигде в расчетах не учасвтвует - чисто индикатор. В расчетах учавствуют интервалы.

              самый левый столбец - это время снятия статистики

              Каждая новая запись в буферы - это время от предыдущего тика до этого. 3 холла, они же тикают по очереди, по разу за полупериод. смотрим 0 1 ..5 , по очереди там идут интервалы срабатываний.

              Представим Вы тормозите, так как холлы тикают от скорости вращения, то скажем если вы снизите скорость с 5гц до 1гц (оборота мотора), за 1 сек, то особенно под конец, Вы не не узнаете какая скорость пока не тикнет холл, да - это всего 7,5 градуса, но и за токое расстояние скорость может в 2 раза измениться.

               

              Это лог  - прямо из пямяти МК. interp1 - под С писать надо. А готового нет ничего?

               

              • aBoomest
                aBoomest+942.89
                25.05.2020 21:06

                но и за токое расстояние скорость может в 2 раза измениться.

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

                Но все равно не о конца понимаю, что значит

                между двумя соседними тиками скорость может измениться в 2 раза?

                Это же зависит от значения. Все относительно. Если например как вы говорите у вас мотор тормозится... Вот расмотрим случай - почти застопорился. Вот один из датчиков сработал, он дальше крутится и почти следующий датчик сработал, но нет - чуток не дотянул. У вас тут не в 2 раза, а в бесконечность раз изменение. А в абсолютных величинах изменение почти никакое. Поэтому изменение м.б. абсолютное, относительное, а м.б. приведенное, т.к. не всегда можно пользоваться относительными величинами.

                interp1 - там же проще некуда. Три параметра, два исходные данные, один параметр - то к чему надо привести.

                Или готового под С вы имели ввиду?
                А если так, то МК какой у вас? Нынче библиотек готовых под самые различные МК - пруд пруди. Среду разработки поставил (хоть йар, хоть кейл, не имеет по-моему уже большого значения) и там под каждый МК нате вам фурье, и ЦОС и чего только нет. А раньше-то усе сам.

                • Dorringtorr
                  Dorringtorr0.00
                  31.05.2020 15:33

                  Спасибо за разьяснения, но мне кажеться что Вы немного не поняли вопрос. 

                  Тут нужет предиктивный калман. Для чего. У нас есть 1 вид данных, время между 2мя тиками, предыдущим и тем что произошел сейчас. Допустим Вы вышли в накат, и у вас синхронный мотор идет в свободном полете - тоесть поле статора не держит ротор. Далее по некоторому событию вам надо подхватить ротор, и начать его тащить. Логичнее всего это сделать в момент когда пришел тик холла, вы тогда знаете частоту. НО, дело в том, что там есть погрешность - это раз, и всякие БИХ ПИХ медианы и тд её не уберут на 100%. Далее поле старотора - ТОЛКАЕТ ротор, значит чутка запаздывает (на это есть мутная функция). И самое гдавное, ротор всеравно продолжает тормозить, и вы не узнаете до следующего тика - попали вы со своей частотой и амплитудой - или нет. И не дай бог вам дать частоту >= частоте ротора минус угол запоздания, ротор встанет колом.. 

                  Для того что бы правильно подхватить, надо предсказать, какая частота будет на следующем тике. Как?калманом, производной, аппроксимацией, как угодно, но приблизительно знать надо. Тогда, вы сможете в момент подачи шим, прикинуть такую частоту синуса, что бы она была точно ниже текущей, но выше будущей, и такую амплитуду - что бы поле ротора уперлось в статор, и начало его бодро толкать - а не проскальзывать, и желательно под 90*. Вот как то так.

                  А МК сам по себе роли не играет, SMT32F103 потянет если работать с целыми числами и писать в С baremetal. Для решения этой задачи, матиматик нада, с матьлабом. А в железо мы это и так загоним без проблем. Мы и так тут юзаем всякие цифровые фильтры и другую аппаратную муть, но калман он лучше предсказывает. Яссна что есть либы, но прошу не забывать, мы всетаки синусом крутим, не трапецией, не вектором, а именно чистым, родным, ассиметричным адаптивным (для компенсации взаимоиндукции) синусом. А 103 не бесконечен. И прошу без комментарием про старое барахло, и что есть круче выше сильнее.. Так нада :-)

                  • aBoomest
                    aBoomest+942.89
                    31.05.2020 18:26

                    На счет того какой калман нужен - тут может кто лучше подскажет. 

                    Но реальные системы (аналогичные тем что вы описали только для генераторов) существуют пол века наверно. Думаю вам стоит про них почитать. 

                    Давно с этой темой не сталкивался, но когда сталкивался (N лет назад) - обычное линейное прогнозирование вполне себе работало. Имеется ввиду прогнозирование угла поворота. Т.е. у вас пришло значение последнее , по нему и тому, что было до этого, линейно определяется выдержка времени до нужного момента.  Как писал надеюсь вам это поможет, но также хочется верить, что  с тех пор инженеры и ученые придумали что-то более крутое.

                    PS: Тут хочется отметить тот факт, что в научных статьях можно встретить все что угодно. Иногда такие сказки . . . ))) Точто я описал выше, это реально работающие вещи в эксплуатациии, а не что-то на уровне идей и лаборатьорных экспериментов на коленях.

                    • Dorringtorr
                      Dorringtorr0.00
                      1.06.2020 13:04

                      Все то Вы написали - я в курсе. 

                      Уже Попробовал линейную аппроксимацию, вроде работает. Ничего нового нет, точнее есть, но не в нашем случаею. Спасибо.

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