Умножитель частоты шагов на STM32

Контроллеры, драйверы, датчики, управляющие устройства.
Аватара пользователя
Taganrog
Мастер
Сообщения: 1238
Зарегистрирован: 15 апр 2015, 16:32
Репутация: 284
Настоящее имя: Евгений
Откуда: Брянск
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Taganrog »

MX_Master писал(а):атомарном чтении и записи
Если не секрет..Это как ?
Duhas
Мастер
Сообщения: 1961
Зарегистрирован: 10 окт 2015, 23:25
Репутация: 285
Настоящее имя: Андрей
Откуда: Красноярск
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Duhas »

речь про обращение к отдельному биту, вероятно
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение MX_Master »

crashzoom писал(а):Затихла как то тема. Как продвигаются дела с разными вариантами умножителя?
Много времени уходит на изучение и тестирование. Буквально вчера догрыз гранит науки по работе DMA с таймерами :hottabych: И сразу упростил механизм генерации шагов на выходе, отдав эту задачу аппаратной части. Упростил подсчёт входных шагов и периодов между ними, тем самым избавился от входного/выходного буфера. Сегодня пересмотрел способ изменения выходной частоты шагов. Сделал как в LCNC - выходная частота интерактивно меняется раз в миллисекунду. Тем самым разгрузил проц от лишних итераций. В общем, шаг за шагом, программная часть уменьшается, а доля аппаратной растёт. Завтра доведу сей тюнинг до стабильной рабочей версии. Как будут свежие новости с тестовых полей, отпишусь
ЗЫ: Логический анализатор за 5$ окупился уже несколько раз.
Taganrog писал(а):
MX_Master писал(а):атомарном чтении и записи
Если не секрет..Это как ?
Михаил Юров уже писал об этом - это когда мы читаем/пишем значения пинов порта не по одному, а сразу все - одной операцией. В идеале - за один такт МК.
Аватара пользователя
Taganrog
Мастер
Сообщения: 1238
Зарегистрирован: 15 апр 2015, 16:32
Репутация: 284
Настоящее имя: Евгений
Откуда: Брянск
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Taganrog »

MX_Master писал(а):а сразу все - одной операцией.
Ясно,то есть читаешь не пин а порт. Просто название смутило -ранее с таким выражением не сталкивался.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Serg »

Атомарная операция - операция, которую нельзя ничем прервать посередине, либо она выполняется полностью, либо не выполняется вообще.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
u37
Новичок
Сообщения: 15
Зарегистрирован: 11 дек 2016, 15:03
Репутация: 1
Настоящее имя: serj
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение u37 »

offtop/ Ну, вообще-то, я сделал что хотел. Лимиты отрабатываются, но смещение "за" рабочей зоной не компенсируется. Добавить - пара строк, но "зафигом не нать". ))
В остальном всё работает. Плюс 2 аналоговых джойстика.
Современное ПО, действительно, без доп. фильтрации срывает поток. Что Mach3, что planet. Mach еще умудряется выплевывать скорость гораздо выше максимума. Скажем, =его= лимит 1500, а он легко выдает 1600-1700. А то я не мог понять, почему у меня на одной модели идет срыв. Еще одно наблюдение - TB6560 действительно кал. После одного прогона одна из осей стала срываться. Срыв по любому чиху, на любой скорости. Поиск ошибки в контроллере ничего не выявил. В-конец устав, перезапустил контроллер, а баг то остался! Только пересброс TB6560 устранил проблему. Тут подумал, что гораздо проще сделать собственный контроллер шаговика, со стабилизацией движения и слежением за срывом. Тогда бы никаких "сглаживателей" не потребовалось бы. Но ... это только подумалось, делать-то не буду. На самом деле, сделать не трудно, философия близкая - векторник BLDC. Или еще наглее - многополюсный BLDC мотор вместо шаговика. Увы, для моего пластмассового станка сие избыточно. /offtop
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение MX_Master »

Ну что ж, метод вывода таймера "Output Compare" вкупе с DMA дают довольно быстрый и стабильный вывод. Провёл пару тестов, в последнем выставил множитель 84, соответственно, из 17 КГц получил 1.5 МГц. И, видимо, это не предел.
2017-03-12_192022.png (3127 просмотров) <a class='original' href='./download/file.php?id=105689&mode=view' target=_blank>Загрузить оригинал (14.84 КБ)</a>
2017-03-12_192436.png (3127 просмотров) <a class='original' href='./download/file.php?id=105690&mode=view' target=_blank>Загрузить оригинал (17.5 КБ)</a>
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение MX_Master »

Подправил мелкие косяки в коде и залил на гитхаб
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 и счётчик продолжает считать...
И так далее до 168. Так у нас получилось, что за эти 168 тактов таймера выходной пин дёрнулся 20 раз, а это наши 10 шагов. Частоту этих шагов мы меняем каждую миллисекунду правкой предделителя таймера. Сам же предделитель таймера рассчитываем на основе периода между входящими шагами.

Выглядит сложно, но работает быстро :hehehe:
Далее хочу подогнать этот код под макетку STM32F103C8T6 за 2$, но там будет только 3 оси для умножения, т.к. на борту всего 4 таймера.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение MX_Master »

Размышляю над третьим способом умножения. Как говорил ранее, в нём надо читать и писать сразу весь порт, а не отдельные пины. Для отлова изменений входного порта, как и прежде, используем обработчики внешних прерываний (EXTI). А вот дальнейшая обработка и умножение могут быть разными.

Первый вариант умножения довольно простой. Нужен совет, правильно ли я делаю. Допустим, у нас есть входной буфер. В него мы складываем значения входного порта, если хотя бы один пин этого порта изменился. А рядом с этими значениями храним засечку по времени, когда порт изменился

Код: Выделить всё

входной буфер
----------------
биты    штамп
порта   времени
----------------
0001    50 мкс
1010    100
0101    150
0000    200
0100    250
0001    300
1100    350
Допустим, я хочу умножить шаги на 2. Создаю выходной буфер, в котором после каждого входного значения вставляю сначала нулевое значение порта, а затем просто повторяю входное значение порта.

Код: Выделить всё

выходной буфер
множитель = 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    ..
А затем просто пишем в выходной порт эти значения. И, вроде, как шаги умножились на 2. Правильно?
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение MX_Master »

Третий способ доделал. Работает, но исполнение и итоговая скорость работы - не фонтан.

Тюнингую второй способ с 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

Сообщение MX_Master »

Крафтер писал(а):Есть системный таймер SysTick, можно его использовать для отсчета времени, и есть еще DWT - отладочный таймер, у него самое большое разрешение. Я уже все эти грабли давно топчу, можешь содрать код :) . http://www.cnc-club.com/forum/viewtopic ... 20#p335275 . Можно даже считать аппаратно выдаваемые шаги.
Посмотрел код. Какая максимальная частота шагов на выходе получилась?
Oxford
Мастер
Сообщения: 415
Зарегистрирован: 28 мар 2015, 02:55
Репутация: -21
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Oxford »

Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение aftaev »

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

Re: Умножитель частоты шагов на STM32

Сообщение Крафтер »

На выходе можно выдавать столько, сколько порт позволяет, то есть хоть 10 МГц.
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11730
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение michael-yurov »

Oxford писал(а):Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Проще, но реализован там этот режим довольно убого, и вреда от него больше чем пользы.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение MX_Master »

Крафтер писал(а):На выходе можно выдавать столько, сколько порт позволяет, то есть хоть 10 МГц.
Можно и 84 Мгц, я ж про реальные спрашиваю - по результатам тестов ;)
Аватара пользователя
Крафтер
Мастер
Сообщения: 211
Зарегистрирован: 27 мар 2015, 22:25
Репутация: 61
Настоящее имя: Андрей
Откуда: Ростов-на-Дону
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Крафтер »

Стесняюсь такие вещи рассказывать ). Собрал себе мелкий станок для опытов, на нём тонкие шпильки, плюс на драйверах микрошаг, чтобы движки не гудели, поэтому по Z выходит 8000 микрошагов/мм, максимальная скорость 5 мм/сек, дальше не хватает напряжения на драйверах (12 вольт от компьютерного бп). Если движки скрутить, можно разгонять их до больших скоростей, именно с пропуском шагов никаких проблем не возникает.
Oxford
Мастер
Сообщения: 415
Зарегистрирован: 28 мар 2015, 02:55
Репутация: -21
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Oxford »

aftaev писал(а):
Oxford писал(а):Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Oxford, проще было станок купить, а не спрашивать где правильно ШВП устанавливать Место установки ШВП #1 :)
Спасибо за совет. А какой станок советуете купить c рабочим полем A3 для фрезеровки алюминия?
Oxford
Мастер
Сообщения: 415
Зарегистрирован: 28 мар 2015, 02:55
Репутация: -21
Контактная информация:

Re: Умножитель частоты шагов на STM32

Сообщение Oxford »

michael-yurov писал(а):
Oxford писал(а):Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Проще, но реализован там этот режим довольно убого, и вреда от него больше чем пользы.
В чем проявляется убожество? В чем собственно вред? Если обсуждали практические проблемы, пруф почитаю.
Ответить

Вернуться в «Электроника»