Умножитель частоты шагов на STM32
- MX_Master
- Мастер
- Сообщения: 6590
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 2766
- Настоящее имя: Миша
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Механизм отлова внешних прерывания работает отлично! А вот моя опторазвязка на монтажке явно теряет шаги. Выяснил это, поиграв с переменными резисторами. Где-то с 2 КГц это очень заметно по текущей позиции оси в шагах.
Последний раз редактировалось MX_Master 20 янв 2017, 22:40, всего редактировалось 1 раз.
-
- Мастер
- Сообщения: 949
- Зарегистрирован: 23 фев 2011, 01:50
- Репутация: 33
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Выгоднее измерять период сигналов шага.MX_Master писал(а):Далее для отладки нужен счетчик шагов и замер частоты,
Период характеризует основной параметр движения - мгновенную скорость. Перед умножением необходимо отфильтровать скачки скорости превышающие параметр максимального ускорения. Эти скачки - отражение недостатка операционной системы в плане реалтайма. Для этой цели наиболее подходящим является медианный фильтр который уберет эти скачки.
Но проще и правильнее сделать свою подсистему управления движением на основе получаемых из ЕМС заданий скорости или координат.
Эта задача наиболее эффективно реализуется на плисине.
- Сергей Саныч
- Мастер
- Сообщения: 9026
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2815
- Откуда: Тюмень
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Ключевое слово - EMC. В системах с закрытым кодом такое не всегда проходит. Приходится работать с тем сигналом, что есть. Не зря тот же Степмастер пользуется неплохим спросом.Impartial писал(а):Но проще и правильнее сделать свою подсистему управления движением на основе получаемых из ЕМС заданий скорости или координат.
Чудес не бывает. Бывают фокусы.
- MX_Master
- Мастер
- Сообщения: 6590
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 2766
- Настоящее имя: Миша
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Проверял вчера быстродействие последней версии кода на STM32F4. Скорость работы всего кода получается на уровне 1 Мгц при постоянном STEP входе в 17 КГц для одной оси и умножителе = 2. Думаю, если все 5 осей подключить, то скорость работы будет в разы меньше.
Закралась мысль проверить как вообще падает скорость работы МК на простейших операциях. Создал чистый проект в Кубике, выставил все частоты на максимум (168Мгц) и в основной цикл программы добавил всего одну строчку
это глобальная переменная, объявленная чуть выше как
компилирую, заливаю прошивку в МК и в STM Studio через ST-Link 2 SWD отслеживаю значение этой переменной.
За 1 минуту насчитывает примерно 1 680 000 000 циклов, т.е. в секунду это 28 000 000. Что теоретически можно считать за 28 МГц, что в 6 раз меньше максимума. Далее добавляем в главный цикл еще 4 паразитных операции (всего 5) и смотрим сколько насчитает на этот раз
на этот раз в секунду отработало примерно 6 500 000 циклов. Что в теории 6.5 МГц. Получается уже в 24 раза меньше максимума. Далее добавил 8 паразитных действий (всего 9).
на этот раз в секунду отработало примерно 3 500 000 циклов. Что в теории 3.5 МГц. И получается уже в 48 раз меньше максимума (168 Мгц).
На этом наглядном примере видно, что STM32F4 (168МГц), конечно, быстрее Меги2560 (16 Мгц). Но получить на нем отлов, обработку, умножение и вывод STEP сигналов на частоте более 1 МГц это из разряда фантастики (: Это надо на ассемблере прошивку писать, оптимизируя любую мелочь, чтобы добиться приемлемых результатов. Помню кто-то писал, что перестал считать такты МК, когда пересел на STM32
У меня так не получилось, я теперь каждую мелочь должен считать. Пойду делать ревизию на предмет ускорения...
Закралась мысль проверить как вообще падает скорость работы МК на простейших операциях. Создал чистый проект в Кубике, выставил все частоты на максимум (168Мгц) и в основной цикл программы добавил всего одну строчку
Код: Выделить всё
for (;;) {
++cnt;
}
Код: Выделить всё
volatile uint32_t cnt = 0;
За 1 минуту насчитывает примерно 1 680 000 000 циклов, т.е. в секунду это 28 000 000. Что теоретически можно считать за 28 МГц, что в 6 раз меньше максимума. Далее добавляем в главный цикл еще 4 паразитных операции (всего 5) и смотрим сколько насчитает на этот раз
Код: Выделить всё
for (;;) {
++cnt;
--cnt;
++cnt;
--cnt;
++cnt;
}
Код: Выделить всё
for (;;) {
++cnt;
--cnt;
++cnt;
--cnt;
++cnt;
--cnt;
++cnt;
--cnt;
++cnt;
}
На этом наглядном примере видно, что STM32F4 (168МГц), конечно, быстрее Меги2560 (16 Мгц). Но получить на нем отлов, обработку, умножение и вывод STEP сигналов на частоте более 1 МГц это из разряда фантастики (: Это надо на ассемблере прошивку писать, оптимизируя любую мелочь, чтобы добиться приемлемых результатов. Помню кто-то писал, что перестал считать такты МК, когда пересел на STM32

- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1119
- Откуда: юг России
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Сгенерированный ассемблерный листинг не смотрели? Оптимизацию для компилятора указывали?
- Serg
- Мастер
- Сообщения: 21744
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5107
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Надо не просто значения в регистрах менять, а выводить данные в порты - это ещё медленнее будет...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
- Кандидат
- Сообщения: 52
- Зарегистрирован: 24 дек 2016, 22:54
- Репутация: 8
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
я извиняюсь но у меня есть идея )
есть такой себе драйвер TMC2100 https://www.trinamic.com/fileadmin/asse ... asheet.pdf
, и у него есть фишка - он шаг 16 размножает внутри cебя до 256
Так вот , сам драйвер слаботочный, до 2х ампер, но вот если к нему прикрутить внешние ключи
или не пройдет
??
есть такой себе драйвер TMC2100 https://www.trinamic.com/fileadmin/asse ... asheet.pdf
, и у него есть фишка - он шаг 16 размножает внутри cебя до 256
Так вот , сам драйвер слаботочный, до 2х ампер, но вот если к нему прикрутить внешние ключи


Последний раз редактировалось ozzy_sv 12 фев 2017, 16:13, всего редактировалось 1 раз.
-
- Кандидат
- Сообщения: 52
- Зарегистрирован: 24 дек 2016, 22:54
- Репутация: 8
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
индусы накодили HAL на славуСоздал чистый проект в Кубике

попробуйте перелезть на CMSIS
- selenur
- Почётный участник
- Сообщения: 4352
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1525
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Что-бы выжать максимальную производительность, ассемблер не поможет, нужно с уметь правильно организовать логику, распределив операции которые выполняются на МК, и периферии. Т.к. некоторые вещи периферия может делать с большей частотой, чем это будет делать МК.
- selenur
- Почётный участник
- Сообщения: 4352
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1525
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
индусы тут ни причем, это особенность работы МК, вот представим что у нас есть всего одна ассемблерная команда NOP, а частота МК 168 МГц, частота выполнения одной команды составит 84 Мгц, т.к. один такт на выполнение команды, и один на переход в начало программы, если код будет состоять из 2-х команд NOP то уже будет расходоваться на один цикл 3 такта МК, но с ростом количества команд, время выполнения одной команды не будет так резко падать.ozzy_sv писал(а):индусы накодили HAL на славуСоздал чистый проект в Кубике![]()
попробуйте перелезть на CMSIS
- michael-yurov
- Почётный участник
- Сообщения: 11350
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4491
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
А еще можно, выводя значение в порт менять состояние сразу 16 линий.
- MX_Master
- Мастер
- Сообщения: 6590
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 2766
- Настоящее имя: Миша
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Для боевого кода оптимизация -O3, а в примере - только по размеру (-Os). Листинг не смотрел.AndyBig писал(а):Сгенерированный ассемблерный листинг не смотрели? Оптимизацию для компилятора указывали?
Я так делал в проекте на ардуине. Но на макетке с STM32F4 на любом порту всегда найдутся хотя бы пара пинов, которые чем-то заняты, то под отладку, то под светодиоды, то под кнопки. Так что слёту не получилось найти два абсолютно свободных порта под вход и выход. Но это всё поправимо, если надо - физически очищу занятые пиныmichael-yurov писал(а):А еще можно, выводя значение в порт менять состояние сразу 16 линий.

А какая периферия в этой задаче поможет кроме встроенных таймеров/счетчиков и обработки внешних прерываний (EXTI)?selenur писал(а):Что-бы выжать максимальную производительность, ассемблер не поможет, нужно с уметь правильно организовать логику, распределив операции которые выполняются на МК, и периферии. Т.к. некоторые вещи периферия может делать с большей частотой, чем это будет делать МК.
- Serg
- Мастер
- Сообщения: 21744
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5107
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Битбандинг работает так-же быстро...MX_Master писал(а):Но на макетке с STM32F4 на любом порту всегда найдутся хотя бы пара пинов, которые чем-то заняты, то под отладку, то под светодиоды, то под кнопки.
Но проблема не в скорости записи бита или слова, проблема в частоте тактирования gpio.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 6590
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 2766
- Настоящее имя: Миша
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Недавно читал пару статей с тестами частоты тактирования gpio (например). Мой код все равно работает куда медленней ))UAVpilot писал(а):Битбандинг работает так-же быстро...MX_Master писал(а):Но на макетке с STM32F4 на любом порту всегда найдутся хотя бы пара пинов, которые чем-то заняты, то под отладку, то под светодиоды, то под кнопки.
Но проблема не в скорости записи бита или слова, проблема в частоте тактирования gpio.
- MX_Master
- Мастер
- Сообщения: 6590
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 2766
- Настоящее имя: Миша
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Убрал всё из основного цикла. Любой, даже мелкий, кодик в основном цикле мешает процессору нормально работать. Взамен перешёл на более продуманную работу со встроенным таймером. Причем, прерывания по переполнению счётчика таймера происходят не чаще, чем требуется для генерации выходного сигнала. Например, если частота на входе у нас до 20 КГц от LinuxCNC, а выходной множитель = 8 (для получения 160 КГц), то прерывание по таймеру происходит с частотой 20 * 8 * 2 = 320 КГц. Проц будет занят не сильно и позволит проводить доп. обработку буфера входа/выхода.
-
- Новичок
- Сообщения: 15
- Зарегистрирован: 11 дек 2016, 15:03
- Репутация: 1
- Настоящее имя: serj
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Нет нужды разгружать фоновый процесс. Его задача - управление. Прерывания от таймеров (и др.) работают одинаково стабильно и при разгруженном и полностью заваленном фоновом процессе.
Просто перераспределите приоритеты - что должно выполняться вначале (в первую очередь), а что может немного подождать.
Кстати, вы в курсе, что у NVIC есть приоритеты прерываний. В том числе, разделение их на "группы". Нюанс - в возможности прерывать или не прерывать чужие прерывания того-же уровня.
Просто перераспределите приоритеты - что должно выполняться вначале (в первую очередь), а что может немного подождать.
Кстати, вы в курсе, что у NVIC есть приоритеты прерываний. В том числе, разделение их на "группы". Нюанс - в возможности прерывать или не прерывать чужие прерывания того-же уровня.
- michael-yurov
- Почётный участник
- Сообщения: 11350
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4491
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Можно еще и свое же собственное прерывание прерывать или не прерывать, в зависимости от задачи.
Т.е. процедура обработки прерывания может быть запущена во времы выполнения этого же самого прерывания.
Т.е. процедура обработки прерывания может быть запущена во времы выполнения этого же самого прерывания.
- MX_Master
- Мастер
- Сообщения: 6590
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 2766
- Настоящее имя: Миша
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Спасибо всем за советы. Прерывания изучил в самую первую очередь, еще до первой рабочей версии кода.
Ну что ж, последняя моя задумка оказалось самой живучей 
Тестировал только одну ось, т.к. опторазвязка на остальные еще не прилетела из Китая. Для тестов использовал тот же китайский CNC USB Controller MK1 (максимум 17 КНz). Умножение наблюдал только в STM Studio, т.к. логический анализатор также в пути.
Задача минимум для меня была - размножить шаги, выдаваемые LinuxCNC (20 КГц) до 200 КГц, которые поддерживает шаговый драйвер. Попробовал множитель = 8 при входящей частоте 17 КГц. При продолжительном тесте на одной из программок, не один шаг на входе и выходе не был потерян. Все чётко множилось и в итоге вернулось в 0. Полноценные масштабные тесты в живую будут по прибытии опторазвязки и логического анализатора. Заодно и осцилом потом глянем.
Код можно глянуть здесь - https://github.com/MX-Master/STEP_DIR_multiplier. Подробности в двух словах..
Используются только три файла:
- shared.h - общак с настройками и переменными
- main.c - краткая инициализация
- stm32f4xx_it.c - всё, что касается прерываний
Код: Выделить всё
#define AXES 5 // 1..5
#define MULT 8 // output steps multiplier
#define INPUT_MAX_FREQUENCY 20000 // Hz
// direction change delays
#define OUTPUT_DIR_DELAY_BEFORE 50 // us
#define OUTPUT_DIR_DELAY_AFTER 50 // us
Заказал еще макетку с STM32F103C8Tx на борту (2$). Под нее код будет доработан и выложен чуть позже.
- MX_Master
- Мастер
- Сообщения: 6590
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 2766
- Настоящее имя: Миша
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Забыл в двух словах принцип работы объяснить..
Входные шаги и смену направлений у нас ловят обработчики внешних прерываний (EXTI). Шаги ловят 5 первых отдельных линий EXTI (от 0 до 4) по фронту или спаду (на выбор). Смену направлений ловит общая линия EXTI (от 5 до 9). Соответственно, можно умножать шаги для 5-ти осей. Каждое входное прерывание добавляет данные сразу в выходной буфер.
Выходом занимается отдельное прерывание по таймеру, в котором идёт генерация шагов и направлений на основе выходного буфера. Прерывание запускается с частотой 2 * МНОЖИТЕЛЬ * МАКС. ВХОДНУЮ ЧАСТОТУ. Например, для множителя = 8 и 20 КГц на входе, генерация выхода будет работать на частоте 320 КГц. Сделано так, чтобы не отнимать у процессора больше времени, чем нужно.
Фильтров на входе/выходе пока никаких нет. Поэтому, если скважность входного сигнала будет плясать влево/вправо, на выходе будет примерно также
Со временем чё-ньть придумаем с фильтрами..
Входные шаги и смену направлений у нас ловят обработчики внешних прерываний (EXTI). Шаги ловят 5 первых отдельных линий EXTI (от 0 до 4) по фронту или спаду (на выбор). Смену направлений ловит общая линия EXTI (от 5 до 9). Соответственно, можно умножать шаги для 5-ти осей. Каждое входное прерывание добавляет данные сразу в выходной буфер.
Выходом занимается отдельное прерывание по таймеру, в котором идёт генерация шагов и направлений на основе выходного буфера. Прерывание запускается с частотой 2 * МНОЖИТЕЛЬ * МАКС. ВХОДНУЮ ЧАСТОТУ. Например, для множителя = 8 и 20 КГц на входе, генерация выхода будет работать на частоте 320 КГц. Сделано так, чтобы не отнимать у процессора больше времени, чем нужно.
Фильтров на входе/выходе пока никаких нет. Поэтому, если скважность входного сигнала будет плясать влево/вправо, на выходе будет примерно также

- Serg
- Мастер
- Сообщения: 21744
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5107
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Умножитель STEP/DIR на STM32 F1/F4
Это какие 5 топоров?.. Ты вроде умножитель для осей (AXIS) делал...MX_Master писал(а):#define AXES 5 // 1..5

Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...