Начал делать вычисление для "равноускоренного" движения.
Сделал блок, который вычисляет "длительность следующего импульса" и решил проверить сколько тактов будет занимать это вычисление.
Проверял на двух вариантах: разгон до 5кГц и до 100кГц.
В обоих случаях время разгона 0.25 сек. Я, конечно, понимаю, что в реальности до 100кГц за 0.25сек мало кто будет разгоняться, но тут во-первых нужно проверить точность вычислений, а во-вторых, на высоких скоростях "лишнего времени нет" -- надо проверить сколько времени будет занимать "вычисление следующей длительности".
Собственно, графики. Повторюсь, графики получены из эмулятора PRU, и абсолютно всё вычисление сделано в PRU (включая квадратный корень в начале работы).
Ни один float не пострадал: в PRU нет float'ов, и там даже просто умножения нет.
Разгон до 5кГц
В целом, норм, расчётная частота 5кГц достигается не в 0.25 с, а в 0.2477 секунду. Погрешность 1% по-моему, норм.
accel_5kHz_output.png
Частота 5кГц для нашего процессора, разумеется, никаких проблем составлять не должна, ведь PRU работает на 150МГц.
Видно, что пик загруженности процессора составляет целых 0.2%
accel_5kHz_cpu_utilization.png
Попробуем зарядить 100кГц
Тоже норм. Расчётная частота 100кГц достигается не на 0.25 с, а в 0.2512 секунду. Погрешность снова укладывается в 1%
accel_100kHz_output.png
А не слишком ли сложные вычисления для 100кГц?
Да, 100кГц это более сложная задача, но и она занимает лишь 2.5% в пике.
accel_100kHz_cpu_utilization.png
На графиках не учтена работа "внешнего цикла" и "обмен данными", но очевидно, что:
1) 100кГц ШД не составляет никакой проблемы для PRU ядра
2) Вычисления можно делать прямо в PRU. Такой подход оказывается проще в тестировании, т.к. на вход тестируемому блоку даём сразу понятные величины типа "разгонись до 5кГц за 3 секунды", и в имеющемся эмуляторе смотрим что да как.
3) Вполне может получиться и вычисление "экстренной остановки", когда PRU выполнит расчёт замедления на основе текущей скорости и требуемого времени замедления
Надо ещё сделать планирование траектории, чтобы блок понимал когда начинать торможение чтобы общее движение заняло ровно указанное количество импульсов.
Потом можно будет прикрутить "плавный выход на расчётную скорость" (ну, чтобы не было разрыва ускорения при переходе от равноускоренного к равномерному движению). Будет вообще шикарно.




Ответить с цитированием