Страница 12 из 20
Re: Умножитель частоты шагов на STM32
Добавлено: 07 мар 2017, 14:27
Taganrog
MX_Master писал(а):атомарном чтении и записи
Если не секрет..Это как ?
Re: Умножитель частоты шагов на STM32
Добавлено: 07 мар 2017, 17:39
Duhas
речь про обращение к отдельному биту, вероятно
Re: Умножитель частоты шагов на STM32
Добавлено: 07 мар 2017, 18:12
MX_Master
crashzoom писал(а):Затихла как то тема. Как продвигаются дела с разными вариантами умножителя?
Много времени уходит на изучение и тестирование. Буквально вчера догрыз гранит науки по работе
DMA с таймерами

И сразу упростил механизм генерации шагов на выходе, отдав эту задачу аппаратной части. Упростил подсчёт входных шагов и периодов между ними, тем самым избавился от входного/выходного буфера. Сегодня пересмотрел способ изменения выходной частоты шагов. Сделал как в
LCNC - выходная частота интерактивно меняется раз в миллисекунду. Тем самым разгрузил проц от лишних итераций. В общем, шаг за шагом, программная часть уменьшается, а доля аппаратной растёт. Завтра доведу сей тюнинг до стабильной рабочей версии. Как будут свежие новости с тестовых полей, отпишусь
ЗЫ: Логический анализатор за 5$ окупился уже несколько раз.
Taganrog писал(а):MX_Master писал(а):атомарном чтении и записи
Если не секрет..Это как ?
Михаил Юров уже писал об этом - это когда мы читаем/пишем значения пинов порта не по одному, а сразу все - одной операцией. В идеале - за один такт МК.
Re: Умножитель частоты шагов на STM32
Добавлено: 07 мар 2017, 20:18
Taganrog
MX_Master писал(а):а сразу все - одной операцией.
Ясно,то есть читаешь не пин а порт. Просто название смутило -ранее с таким выражением не сталкивался.
Re: Умножитель частоты шагов на STM32
Добавлено: 08 мар 2017, 15:41
Serg
Атомарная операция - операция, которую нельзя ничем прервать посередине, либо она выполняется полностью, либо не выполняется вообще.
Re: Умножитель частоты шагов на STM32
Добавлено: 11 мар 2017, 22:12
u37
offtop/ Ну, вообще-то, я сделал что хотел. Лимиты отрабатываются, но смещение "за" рабочей зоной не компенсируется. Добавить - пара строк, но "зафигом не нать". ))
В остальном всё работает. Плюс 2 аналоговых джойстика.
Современное ПО, действительно, без доп. фильтрации срывает поток. Что Mach3, что planet. Mach еще умудряется выплевывать скорость гораздо выше максимума. Скажем, =его= лимит 1500, а он легко выдает 1600-1700. А то я не мог понять, почему у меня на одной модели идет срыв. Еще одно наблюдение - TB6560 действительно кал. После одного прогона одна из осей стала срываться. Срыв по любому чиху, на любой скорости. Поиск ошибки в контроллере ничего не выявил. В-конец устав, перезапустил контроллер, а баг то остался! Только пересброс TB6560 устранил проблему. Тут подумал, что гораздо проще сделать собственный контроллер шаговика, со стабилизацией движения и слежением за срывом. Тогда бы никаких "сглаживателей" не потребовалось бы. Но ... это только подумалось, делать-то не буду. На самом деле, сделать не трудно, философия близкая - векторник BLDC. Или еще наглее - многополюсный BLDC мотор вместо шаговика. Увы, для моего пластмассового станка сие избыточно. /offtop
Re: Умножитель частоты шагов на STM32
Добавлено: 12 мар 2017, 16:44
MX_Master
Ну что ж, метод вывода таймера "
Output Compare" вкупе с
DMA дают довольно быстрый и стабильный вывод. Провёл пару тестов, в последнем выставил множитель
84, соответственно, из
17 КГц получил
1.5 МГц. И, видимо, это не предел.
Re: Умножитель частоты шагов на STM32
Добавлено: 14 мар 2017, 10:33
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 шагов. Частоту этих шагов мы меняем каждую миллисекунду правкой предделителя таймера. Сам же предделитель таймера рассчитываем на основе периода между входящими шагами.
Выглядит сложно, но работает быстро
Далее хочу подогнать этот код под макетку STM32F103C8T6 за 2$, но там будет только 3 оси для умножения, т.к. на борту всего 4 таймера.
Re: Умножитель частоты шагов на STM32
Добавлено: 18 мар 2017, 19:58
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. Правильно?
Re: Умножитель частоты шагов на STM32
Добавлено: 29 мар 2017, 13:12
MX_Master
Третий способ доделал. Работает, но исполнение и итоговая скорость работы - не фонтан.
Тюнингую второй способ с DMA и таймерами, чтобы он подошёл для маленького STM32F103C8T6 за 2$. У него 4 таймера, поэтому использую всего 2 (а не 6), один для отсчёта времени в миллисекундах, а второй для вывода. Скоро покажу слайды с тестов..
Re: Умножитель частоты шагов на STM32
Добавлено: 04 апр 2017, 22:21
Крафтер
Есть системный таймер SysTick, можно его использовать для отсчета времени, и есть еще DWT - отладочный таймер, у него самое большое разрешение. Я уже все эти грабли давно топчу, можешь содрать код

.
http://www.cnc-club.com/forum/viewtopic ... 20#p335275 . Можно даже считать аппаратно выдаваемые шаги.
Re: Умножитель частоты шагов на STM32
Добавлено: 05 апр 2017, 07:38
MX_Master
Крафтер писал(а):Есть системный таймер SysTick, можно его использовать для отсчета времени, и есть еще DWT - отладочный таймер, у него самое большое разрешение. Я уже все эти грабли давно топчу, можешь содрать код

.
http://www.cnc-club.com/forum/viewtopic ... 20#p335275 . Можно даже считать аппаратно выдаваемые шаги.
Посмотрел код. Какая максимальная частота шагов на выходе получилась?
Re: Умножитель частоты шагов на STM32
Добавлено: 05 апр 2017, 19:49
Oxford
Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Re: Умножитель частоты шагов на STM32
Добавлено: 05 апр 2017, 21:39
aftaev
Oxford писал(а):Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Oxford, проще было станок купить, а не спрашивать где правильно ШВП устанавливать
Место установки ШВП #1 
Re: Умножитель частоты шагов на STM32
Добавлено: 05 апр 2017, 21:39
Крафтер
На выходе можно выдавать столько, сколько порт позволяет, то есть хоть 10 МГц.
Re: Умножитель частоты шагов на STM32
Добавлено: 05 апр 2017, 21:42
michael-yurov
Oxford писал(а):Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Проще, но реализован там этот режим довольно убого, и вреда от него больше чем пользы.
Re: Умножитель частоты шагов на STM32
Добавлено: 05 апр 2017, 21:45
MX_Master
Крафтер писал(а):На выходе можно выдавать столько, сколько порт позволяет, то есть хоть 10 МГц.
Можно и 84 Мгц, я ж про реальные спрашиваю - по результатам тестов

Re: Умножитель частоты шагов на STM32
Добавлено: 05 апр 2017, 22:26
Крафтер
Стесняюсь такие вещи рассказывать ). Собрал себе мелкий станок для опытов, на нём тонкие шпильки, плюс на драйверах микрошаг, чтобы движки не гудели, поэтому по Z выходит 8000 микрошагов/мм, максимальная скорость 5 мм/сек, дальше не хватает напряжения на драйверах (12 вольт от компьютерного бп). Если движки скрутить, можно разгонять их до больших скоростей, именно с пропуском шагов никаких проблем не возникает.
Re: Умножитель частоты шагов на STM32
Добавлено: 06 апр 2017, 00:10
Oxford
aftaev писал(а):Oxford писал(а):Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Oxford, проще было станок купить, а не спрашивать где правильно ШВП устанавливать
Место установки ШВП #1 
Спасибо за совет. А какой станок советуете купить c рабочим полем A3 для фрезеровки алюминия?
Re: Умножитель частоты шагов на STM32
Добавлено: 06 апр 2017, 11:52
Oxford
michael-yurov писал(а):Oxford писал(а):Автор делает режим мультистеппинга реализованный в драйверах DM от Leadshine. Проще драйвер купить сразу с этим режимом, а не DQ860MA.
Проще, но реализован там этот режим довольно убого, и вреда от него больше чем пользы.
В чем проявляется убожество? В чем собственно вред? Если обсуждали практические проблемы, пруф почитаю.