Если не секрет..Это как ?MX_Master писал(а):атомарном чтении и записи
Умножитель частоты шагов на STM32
- Taganrog
- Мастер
- Сообщения: 1238
- Зарегистрирован: 15 апр 2015, 16:32
- Репутация: 284
- Настоящее имя: Евгений
- Откуда: Брянск
- Контактная информация:
Re: Умножитель частоты шагов на STM32
-
Duhas
- Мастер
- Сообщения: 1961
- Зарегистрирован: 10 окт 2015, 23:25
- Репутация: 285
- Настоящее имя: Андрей
- Откуда: Красноярск
- Контактная информация:
Re: Умножитель частоты шагов на STM32
речь про обращение к отдельному биту, вероятно
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Много времени уходит на изучение и тестирование. Буквально вчера догрыз гранит науки по работе DMA с таймерамиcrashzoom писал(а):Затихла как то тема. Как продвигаются дела с разными вариантами умножителя?
ЗЫ: Логический анализатор за 5$ окупился уже несколько раз.
Михаил Юров уже писал об этом - это когда мы читаем/пишем значения пинов порта не по одному, а сразу все - одной операцией. В идеале - за один такт МК.Taganrog писал(а):Если не секрет..Это как ?MX_Master писал(а):атомарном чтении и записи
- Taganrog
- Мастер
- Сообщения: 1238
- Зарегистрирован: 15 апр 2015, 16:32
- Репутация: 284
- Настоящее имя: Евгений
- Откуда: Брянск
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Ясно,то есть читаешь не пин а порт. Просто название смутило -ранее с таким выражением не сталкивался.MX_Master писал(а):а сразу все - одной операцией.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Атомарная операция - операция, которую нельзя ничем прервать посередине, либо она выполняется полностью, либо не выполняется вообще.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
u37
- Новичок
- Сообщения: 15
- Зарегистрирован: 11 дек 2016, 15:03
- Репутация: 1
- Настоящее имя: serj
- Контактная информация:
Re: Умножитель частоты шагов на STM32
offtop/ Ну, вообще-то, я сделал что хотел. Лимиты отрабатываются, но смещение "за" рабочей зоной не компенсируется. Добавить - пара строк, но "зафигом не нать". ))
В остальном всё работает. Плюс 2 аналоговых джойстика.
Современное ПО, действительно, без доп. фильтрации срывает поток. Что Mach3, что planet. Mach еще умудряется выплевывать скорость гораздо выше максимума. Скажем, =его= лимит 1500, а он легко выдает 1600-1700. А то я не мог понять, почему у меня на одной модели идет срыв. Еще одно наблюдение - TB6560 действительно кал. После одного прогона одна из осей стала срываться. Срыв по любому чиху, на любой скорости. Поиск ошибки в контроллере ничего не выявил. В-конец устав, перезапустил контроллер, а баг то остался! Только пересброс TB6560 устранил проблему. Тут подумал, что гораздо проще сделать собственный контроллер шаговика, со стабилизацией движения и слежением за срывом. Тогда бы никаких "сглаживателей" не потребовалось бы. Но ... это только подумалось, делать-то не буду. На самом деле, сделать не трудно, философия близкая - векторник BLDC. Или еще наглее - многополюсный BLDC мотор вместо шаговика. Увы, для моего пластмассового станка сие избыточно. /offtop
В остальном всё работает. Плюс 2 аналоговых джойстика.
Современное ПО, действительно, без доп. фильтрации срывает поток. Что Mach3, что planet. Mach еще умудряется выплевывать скорость гораздо выше максимума. Скажем, =его= лимит 1500, а он легко выдает 1600-1700. А то я не мог понять, почему у меня на одной модели идет срыв. Еще одно наблюдение - TB6560 действительно кал. После одного прогона одна из осей стала срываться. Срыв по любому чиху, на любой скорости. Поиск ошибки в контроллере ничего не выявил. В-конец устав, перезапустил контроллер, а баг то остался! Только пересброс TB6560 устранил проблему. Тут подумал, что гораздо проще сделать собственный контроллер шаговика, со стабилизацией движения и слежением за срывом. Тогда бы никаких "сглаживателей" не потребовалось бы. Но ... это только подумалось, делать-то не буду. На самом деле, сделать не трудно, философия близкая - векторник BLDC. Или еще наглее - многополюсный BLDC мотор вместо шаговика. Увы, для моего пластмассового станка сие избыточно. /offtop
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Ну что ж, метод вывода таймера "Output Compare" вкупе с DMA дают довольно быстрый и стабильный вывод. Провёл пару тестов, в последнем выставил множитель 84, соответственно, из 17 КГц получил 1.5 МГц. И, видимо, это не предел.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Подправил мелкие косяки в коде и залил на гитхаб
https://github.com/MX-Master/steps-freq ... /v1.0-beta
Вкратце принцип работы..
Входящие шаги ловим, как и прежде, с помощью EXTI. Для замера периодов между входящими шагами используем отдельный аппаратный таймер. Для вывода шагов каждой оси используются отдельные аппаратные таймеры. У каждого таймера есть 4 канала, используем только один в режиме Output Compare.
Output Compare - это режим канала таймера, при котором можно дёргать выходной пин при совпадении значения счётчика с заданным числом. К примеру, в настройках мы указали, что таймер будет считать от 0 до 168, а число для сравнения будет 84. Как только счетчик досчитает до 84, выходной пин поменяет состояние на обратное. Для нашего случая надо, чтобы выходной пин дёргался не один раз в 168 тактов таймера, а еще чаще. Чтобы получить умножение на 10, надо выходной пин дёрнуть 20 раз за эти 168 тактов таймера. В этом нам поможет DMA.
Для DMA нам нужно заранее состряпать массив вида {8,16,24,32,40,48,...,160,168}. Настраиваем DMA так, чтобы при совпадении значения счетчика с заданным числом, это число заменялось на следующее из массива. Работает это так:
Выглядит сложно, но работает быстро
https://github.com/MX-Master/steps-freq ... /v1.0-beta
Вкратце принцип работы..
Входящие шаги ловим, как и прежде, с помощью EXTI. Для замера периодов между входящими шагами используем отдельный аппаратный таймер. Для вывода шагов каждой оси используются отдельные аппаратные таймеры. У каждого таймера есть 4 канала, используем только один в режиме Output Compare.
Output Compare - это режим канала таймера, при котором можно дёргать выходной пин при совпадении значения счётчика с заданным числом. К примеру, в настройках мы указали, что таймер будет считать от 0 до 168, а число для сравнения будет 84. Как только счетчик досчитает до 84, выходной пин поменяет состояние на обратное. Для нашего случая надо, чтобы выходной пин дёргался не один раз в 168 тактов таймера, а еще чаще. Чтобы получить умножение на 10, надо выходной пин дёрнуть 20 раз за эти 168 тактов таймера. В этом нам поможет DMA.
Для DMA нам нужно заранее состряпать массив вида {8,16,24,32,40,48,...,160,168}. Настраиваем DMA так, чтобы при совпадении значения счетчика с заданным числом, это число заменялось на следующее из массива. Работает это так:
- Счетчик таймера досчитал до 8 и дёрнул выходной пин
- DMA поменял 8 на 16 и счётчик продолжает считать дальше
- Счетчик досчитал до 16 и еще раз дёрнул выходной пин
- DMA поменял 16 на 24 и счётчик продолжает считать дальше
- Счетчик досчитал до 24 и опять дёрнул выходной пин
- DMA поменял 24 на 32 и счётчик продолжает считать...
Выглядит сложно, но работает быстро
Далее хочу подогнать этот код под макетку STM32F103C8T6 за 2$, но там будет только 3 оси для умножения, т.к. на борту всего 4 таймера.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Размышляю над третьим способом умножения. Как говорил ранее, в нём надо читать и писать сразу весь порт, а не отдельные пины. Для отлова изменений входного порта, как и прежде, используем обработчики внешних прерываний (EXTI). А вот дальнейшая обработка и умножение могут быть разными.
Первый вариант умножения довольно простой. Нужен совет, правильно ли я делаю. Допустим, у нас есть входной буфер. В него мы складываем значения входного порта, если хотя бы один пин этого порта изменился. А рядом с этими значениями храним засечку по времени, когда порт изменился
Допустим, я хочу умножить шаги на 2. Создаю выходной буфер, в котором после каждого входного значения вставляю сначала нулевое значение порта, а затем просто повторяю входное значение порта.
А затем просто пишем в выходной порт эти значения. И, вроде, как шаги умножились на 2. Правильно?
Первый вариант умножения довольно простой. Нужен совет, правильно ли я делаю. Допустим, у нас есть входной буфер. В него мы складываем значения входного порта, если хотя бы один пин этого порта изменился. А рядом с этими значениями храним засечку по времени, когда порт изменился
Код: Выделить всё
входной буфер
----------------
биты штамп
порта времени
----------------
0001 50 мкс
1010 100
0101 150
0000 200
0100 250
0001 300
1100 350
Код: Выделить всё
выходной буфер
множитель = 2
----------------
биты штамп
порта времени
---------------
0001 50 мкс
0000 50+16
0001 50+32
1010 100
0000 100+16
1010 100+32
0101 150
0000 ..
0101 ..
0000 200
0000 ..
0000 ..
0100 250
0000 ..
0100 ..
0001 300
0000 ..
0001 ..
1100 350
0000 ..
1100 ..
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Третий способ доделал. Работает, но исполнение и итоговая скорость работы - не фонтан.
Тюнингую второй способ с DMA и таймерами, чтобы он подошёл для маленького STM32F103C8T6 за 2$. У него 4 таймера, поэтому использую всего 2 (а не 6), один для отсчёта времени в миллисекундах, а второй для вывода. Скоро покажу слайды с тестов..
Тюнингую второй способ с DMA и таймерами, чтобы он подошёл для маленького STM32F103C8T6 за 2$. У него 4 таймера, поэтому использую всего 2 (а не 6), один для отсчёта времени в миллисекундах, а второй для вывода. Скоро покажу слайды с тестов..
- Крафтер
- Мастер
- Сообщения: 211
- Зарегистрирован: 27 мар 2015, 22:25
- Репутация: 61
- Настоящее имя: Андрей
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Есть системный таймер SysTick, можно его использовать для отсчета времени, и есть еще DWT - отладочный таймер, у него самое большое разрешение. Я уже все эти грабли давно топчу, можешь содрать код
. http://www.cnc-club.com/forum/viewtopic ... 20#p335275 . Можно даже считать аппаратно выдаваемые шаги.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Посмотрел код. Какая максимальная частота шагов на выходе получилась?Крафтер писал(а):Есть системный таймер SysTick, можно его использовать для отсчета времени, и есть еще DWT - отладочный таймер, у него самое большое разрешение. Я уже все эти грабли давно топчу, можешь содрать код. http://www.cnc-club.com/forum/viewtopic ... 20#p335275 . Можно даже считать аппаратно выдаваемые шаги.
-
Oxford
- Мастер
- Сообщения: 415
- Зарегистрирован: 28 мар 2015, 02:55
- Репутация: -21
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Oxford, проще было станок купить, а не спрашивать где правильно ШВП устанавливать Место установки ШВП #1Oxford писал(а):Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Крафтер
- Мастер
- Сообщения: 211
- Зарегистрирован: 27 мар 2015, 22:25
- Репутация: 61
- Настоящее имя: Андрей
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Умножитель частоты шагов на STM32
На выходе можно выдавать столько, сколько порт позволяет, то есть хоть 10 МГц.
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Проще, но реализован там этот режим довольно убого, и вреда от него больше чем пользы.Oxford писал(а):Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Можно и 84 Мгц, я ж про реальные спрашиваю - по результатам тестовКрафтер писал(а):На выходе можно выдавать столько, сколько порт позволяет, то есть хоть 10 МГц.
- Крафтер
- Мастер
- Сообщения: 211
- Зарегистрирован: 27 мар 2015, 22:25
- Репутация: 61
- Настоящее имя: Андрей
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Стесняюсь такие вещи рассказывать ). Собрал себе мелкий станок для опытов, на нём тонкие шпильки, плюс на драйверах микрошаг, чтобы движки не гудели, поэтому по Z выходит 8000 микрошагов/мм, максимальная скорость 5 мм/сек, дальше не хватает напряжения на драйверах (12 вольт от компьютерного бп). Если движки скрутить, можно разгонять их до больших скоростей, именно с пропуском шагов никаких проблем не возникает.
-
Oxford
- Мастер
- Сообщения: 415
- Зарегистрирован: 28 мар 2015, 02:55
- Репутация: -21
- Контактная информация:
Re: Умножитель частоты шагов на STM32
Спасибо за совет. А какой станок советуете купить c рабочим полем A3 для фрезеровки алюминия?aftaev писал(а):Oxford, проще было станок купить, а не спрашивать где правильно ШВП устанавливать Место установки ШВП #1Oxford писал(а):Проще драйвер купить сразу с этим режимом, а не DQ860MA.
-
Oxford
- Мастер
- Сообщения: 415
- Зарегистрирован: 28 мар 2015, 02:55
- Репутация: -21
- Контактная информация:
Re: Умножитель частоты шагов на STM32
В чем проявляется убожество? В чем собственно вред? Если обсуждали практические проблемы, пруф почитаю.michael-yurov писал(а):Проще, но реализован там этот режим довольно убого, и вреда от него больше чем пользы.Oxford писал(а):Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.