Ethernet контроллер для LinuxCNC (STM32, FPGA)

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
sidor094
Мастер
Сообщения: 826
Зарегистрирован: 20 фев 2014, 09:13
Репутация: 81
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение sidor094 »

sidor094 писал(а):
UAVpilot писал(а):В современных мониторах с подключением по DVI/DP/HDMI понятием развёртки можно пренебречь - оно используется лишь в маркетинговосравнительных целях
Если говорить о мерцании экрана с частотой развертки то да.Обновление же экрана происходит точно так-же ,как и в лучквых.Вместе с частотой развертки построчно(даже правильнее сказать попиксельно).
В любом случае у них все равно достаточно длительное послесвечение .Поэтому тянучки связаны не с разверткой ,а с медленным перезарядом емкостей .отсюда првный переход точки от предидущено состояния к нынешнему.
Но все это влияет особенности зрения и мало связано с реакцией игрока на события. Для нажатия на кнопку надо не только заметить изменение изображения но и успеть на него среанировать. Говоря про 100-400 мс я подразумеваю
время между изменением картинки и началом нажатия.То есть не просто заметить событие,но и успеть на него среагировать.Причем это автоматическая реакция.Когда человек уже наработал навык реагирования на данное событие и соответственно время на принятия решения не затрачивается.Неподготовленный человек(тот кто еще не автоматически реагирует на данное событие,а только знает,что нужно делать) добавит к этому еще время на принятие решения.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Сергей Саныч писал(а):У меня в автономном контроллере 3 канала с максимальной частотой шагов 131072 Гц (больше не требовалось). Тактовая частота МК (STM32F072) - 48 МГц. Расчет и вывод - по таймерному прерыванию. На входе - значение частоты в формате с фиксированной запятой, на выходе - последовательность STEP. На расчет и вывод 1 канала тратится 35-50 тактов (без использования ассемблера).
Сергей Саныч, а можно чуток подробнее о вашем способе? С какой частотой вызывается прерывание? Для каждого канала своё прерывание или единое для всех? Каким способом дёргаются пины (бит бандинг или "ручная" правка регистра вывода порта? Используется ли DMA?
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение Сергей Саныч »

MX_Master писал(а):Сергей Саныч, а можно чуток подробнее о вашем способе?
Прерывание для генерации используется одно с частотой 131072 (2^17) Гц (макс. частота шагов). Бит-бандинг для работы с GPIO не использую, поскольку есть регистр BSRR. DMA не используется.
Алгоритм такой. По прерыванию:
1. В порт, где сосредоточены все Step'ы, выводится по BSRR одной командой промежуточная переменная-заготовка, где установлены биты для тех каналов, куда надо выдать импульсы. Этим формируется передний фронт. Значение ее вычислено в фазе 2 предыдущего прерывания.
2. Производится расчет для всех каналов, надо ли будет делать шаг. В результате заготовка получает новые значения для следующего цикла. Расчет - по алгоритму типа Брезенхомовского.
3. Биты Step всех каналов сбрасываются - одной командой и тоже через BSRR.

Таким образом, время расчета (фаза 2) используется одновременно как задержка, задающая длительность импульсов Step.
Конкретно получается около 2-2,5 мкс, что достаточно для 200-кГц драйверов.

Фрагмент программы постараюсь выложить, как доберусь до рабочего компьютера.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
wldev
Мастер
Сообщения: 1639
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение wldev »

Сергей Саныч,
Хотел спросить:
1 Какая минимальная частота step?
2 Чем ещё занимается контроллер во время генерации.
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Bender, я надеюсь, в новой версии с STM32F4 ты выводишь шаги аппаратно? :)
Аватара пользователя
wldev
Мастер
Сообщения: 1639
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение wldev »

MX_Master писал(а):Bender, я надеюсь, в новой версии с STM32F4 ты выводишь шаги аппаратно? :)
Нет. Там Макс частота перемещения будет конечно больше.
..для шаговых большая частота и не нужна , а для сервопривод контроллеры могут выдавать квадратурный сигнал ABx4 в котором используется оба фронта в результате чего частота перемещения возрастёт в два раза при том же разрешение.
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение Сергей Саныч »

Bender писал(а):1 Какая минимальная частота step?
Ну, можно и 0Гц выдавать :) А вообще, (1/1024)Гц, то есть 1 импульс за 1024 сек. Дискретность задания частоты такая же. Неравномерность частоты - один период прерывания во всем диапазоне, что реальные ШД с драйверами не ощущают вообще никак :)
Bender писал(а):2 Чем ещё занимается контроллер во время генерации.
По второму прерыванию частотой 1024 Гц - расчетом параметров шаговой последовательности (путь, скорость, ускорение, направление), подсчет времени работы, опрос датчиков и кнопок. Прерывание имеет приоритет ниже, чем то, по которому идет генерация.
В фоновом режиме - отработка управляющих воздействий (кнопки, энкодер), зашитых программ "верхнего уровня" (это не G-код), индикация (OLED-дисплей 128х64).
Чудес не бывает. Бывают фокусы.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Для китайского контроллера хочу попробовать ещё один способ. Благо там свободны 10 таймеров..

Короче говоря, для каждого канала степ/дир берём по отдельному таймеру. Используем всего 1 канал от каждого в режиме Output Compare или PWM. Вывести аппаратно с таймера ничего нельзя, поэтому каждый таймер будет дёргать прерывания. На 1 период таймера будет 2 прерывания - Output Compare и Counter Update. Внутри каждого дёргаем нужный пин. И внутри любого из этих прерываний обновляем текущую позицию в шагах. Если какой-то канал степ/дир не используется, полностью отрубаем таймер.

Минус данного способа - в кол-ве прерываний. Чем больше степ/дир каналов в работе и чем выше частота, тем меньше времени на основной цикл. В котором, кстати, идёт работа с Ethernet пакетами. Из плюсов способа - можно точно выставить частоту и длительность импульса на каждом канале. Для LinuxCNC это явный плюс, ведь юзер сможет это всё менять в параметрах степген'а. Как привык.

Исходников китайской прошивки для Mach3 нет, но мне кажется, что китайцы таким способом шаги и выводили. Максимальная частота получится фиг знает какая :hehehe: Делайте ваши ставки :freak: На предстоящей неделе буду пробовать и замерю...
Аватара пользователя
wldev
Мастер
Сообщения: 1639
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение wldev »

Я бы сделал для начала как у Сергея Саныча. И довел бы все до готового образца. Чтобы были решены все моменты от протокола и драйвера до вывода шагов. А уже потом постепенно доводил систему...
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Сергей, протоколы уже готовы. И на голом Ethernet, и с LwIP (UDP), и даже веб-сервер робит. Единственная для меня неизвестность - это софт вывод шагов. Надо придумать одновременно быстрый, точный и лёгкий способ. Проц у F207 не резиновый :) В качестве теста хочу попробовать сервопериодную часть драйвера разместить в МК.
В моём варианте контроллера вывод шагов практически всегда аппаратный. Энкодеры и всё остальное тоже максимально аппаратные. В этом задумка и была. Но у меня там другая трудность - железо :) В электронике я зелен.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение Serg »

D.L. писал(а):Интересно на что? LCD был сразу подключен по DVI-D.
Тогда это очень странно...
sidor094 писал(а):Да хоть сколько.Вот самый простой алгоритм работы.например у нас выставлен делитель на 100000.Контроллер заканчивает цикл.
У меня стойкое ощущение, что мы о совершенно разных вещах спорим... Наверно лучше продолжить после хотя бы поверхностного ознакомления с устройством LinuxCNC...
sidor094 писал(а):В любом случае у них все равно достаточно длительное послесвечение .Поэтому тянучки связаны не с разверткой ,а с медленным перезарядом емкостей .отсюда првный переход точки от предидущено состояния к нынешнему.
Ёмкости там не при чём. Суть в скорости изменения ориентации (прозрачности) жидких кристаллов. На значительное изменение ориентации пикселя нужно несколько миллисекунд, а вот на поддержание ранее установленной времени практически не требуется. современные карты и мониторы с цифровым подключением умеют этим пользоваться для ускорения "регенерации". Наиболее сильно это проявляется в настоящих OLED мониторах - там изображение "мерцает" с частотой в несколько десятков килогерц (ШИМ управления яркостью). Но это уже совсем далеко от темы. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение Сергей Саныч »

Сергей Саныч писал(а):Фрагмент программы постараюсь выложить

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

// Генерация импульсов Step по таймерному прерыванию (частота 131072 Гц)
// Частота задается элементом Channels[x].Vstep 
// Формат - 32-битный в доп. коде со знаком и с фикс. запятой (22.10)
// Справка. Операции сложения/вычитания с фикс. запятой производятся точно так же,
// как с целыми числами. Отличие только в интерпретации значения. В данном случае 
// самый младший бит имеет "цену" 1/1024 Гц.
// Элемент Channels[x].gencnt - накопительный счетчик. Если при очередном прибавлении Vstep в gencnt меняется значение бита 27, то надо генерировать очередной Step.
// Channels[0].StepCurPos - счетчик шагов  перемещения с учетом направления, которое задается знаком Vstep (Физический сигнал Dir формируется отдельно).

void TIM7_IRQHandler(void)
{
int_fast32_t t;
static uint32_t stepout; // Заготовка для вывода Step'ов


  GPIOC->BSRR = stepout;// Выдача Step-ов
  stepout = 0; // Зачистка заготовки

// Генерация шагов
  t = Channels[0].gencnt;
  Channels[0].gencnt += Channels[0].Vstep;
  if((t ^ Channels[0].gencnt) & (1<<27)) { // Для Fbase = 131072
    stepout |= SM1_STEP_Pin << 16; // Заготовка вывода шагов по BSRR (инверсно)
    if(Channels[0].Vstep < 0) // Подсчет
      Channels[0].StepCurPos--;
    else
      Channels[0].StepCurPos++;
  }
  t = Channels[1].gencnt;
  Channels[1].gencnt += Channels[1].Vstep;
  if((t ^ Channels[1].gencnt) & (1<<27)) { // Для Fbase = 131072
    stepout |= SM2_STEP_Pin << 16; // Заготовка вывода шагов по BSRR (инверсно)
    if(Channels[1].Vstep < 0) // Подсчет
      Channels[1].StepCurPos--;
    else
      Channels[1].StepCurPos++;
  }
  t = Channels[2].gencnt;
  Channels[2].gencnt += Channels[2].Vstep;
  if((t ^ Channels[2].gencnt) & (1<<27)) { // Для Fbase = 131072
    stepout |= SM3_STEP_Pin << 16; // Заготовка вывода шагов по BSRR (инверсно)
    if(Channels[2].Vstep < 0) // Подсчет
      Channels[2].StepCurPos--;
    else
      Channels[2].StepCurPos++;
  }

  GPIOC->BSRR = SM1_STEP_Pin | SM2_STEP_Pin | SM3_STEP_Pin; // Сброс всех Step'ов

  TIM7->SR &= ~TIM_SR_UIF; // Сброс флага прерывания
}
Чудес не бывает. Бывают фокусы.
dpss-2
Мастер
Сообщения: 628
Зарегистрирован: 02 сен 2018, 15:15
Репутация: 305
Настоящее имя: Alex
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение dpss-2 »

MX_Master писал(а):Проц у F207 не резиновый
Мир не заканчивается на F207. Есть, например, 28 серия у Техаса, где эвивалентная частота тактирования ШИМ достигает пары гигагерц за счет использования коммутируемых задержек, есть всевозможные бюджетные FPGA. Когда нибудь захочется несколько каналов, как у Сименса, с возможностью параллельной работы и синхронизации. Тоже все в одну STM-ку будете втискивать?
"Глобус трещит, сова пищит" :hehehe:
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение Serg »

dpss-2 писал(а):Мир не заканчивается на F207.
В данном случае (в этом ответвлении этой темы) мир ограничен вот такой "железкой": Re: Контроллер для LinuxCNC (Ethernet + STM32) #727 :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
going
Мастер
Сообщения: 523
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение going »

MX_Master писал(а): ....быстрый способ подсчитать какую часть времени процессора съедают ...
powertop покажет сколько времени процессора потрачено программой за 1 сек.
MX_Master писал(а): сколько кушает программный ногодрыг
Это не только прерывания, а также программное расширение таймера до 1 нс.

Небольшой кусок вывода powertop

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

             554,3 µs/s      55,0        Timer          tick_sched_timer
             2,1 ms/s      17,1        Process        /usr/bin/konsole -session 1014d100d5ec000152765945700000025040010_1572718172_59924
             28,7 µs/s      15,9        Timer          ehci_hrtimer_func
              7,1 ms/s      11,3        Process        /usr/bin/Xorg -br :0 vt7 -nolisten tcp -seat seat0 -auth /var/lib/kdm/AuthFiles/A:0-JYSrZb
             83,7 µs/s      11,1        Process        [xfsaild/sdb7]
             75,2 µs/s       9,2        Process        [rcu_sched]
            330,0 µs/s       8,6        Interrupt      [0] HI_SOFTIRQ
              3,1 ms/s       7,3        Process        qdbus
              4,6 ms/s       6,7        Process        ksysguardd
            389,2 µs/s       4,6        Interrupt      [7] sched(softirq)
             75,8 µs/s       4,7        Interrupt      [25] i915
             40,5 µs/s       4,3        Process        /usr/sbin/haveged -w 1024 -v 0 -F
              6,4 ms/s       1,6        Process        plasmashell
            517,7 µs/s       3,8        Process        /usr/lib/udisks2/udisksd --no-debug
             51,0 µs/s       3,6        Process        [i915/signal:0]
             82,3 µs/s       3,4        kWork          cache_reap
            411,6 µs/s       1,0        Process        /usr/lib/mission-control-5
              5,6 µs/s       1,0        kWork          intel_unpin_work_fn
              2,7 µs/s       1,0        Timer          sched_rt_period_timer

Платы: BPI-M3, BPI-A64, OPI-PC2
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Спасибо, а для микроконтроллера как? :)
D.L.
Мастер
Сообщения: 474
Зарегистрирован: 25 авг 2018, 10:11
Репутация: 152
Настоящее имя: Дмитрий
Откуда: Киров
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение D.L. »

MX_Master писал(а):Спасибо, а для микроконтроллера как?
Устанавливаем лог. 1 на свободную ногу на входе в прерывание, и сбрасываем на выходе.
И дальше смотрим логическим анализатором или осциллографом длительность импульса.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Накатал для теста простой софт генератор шагов на прерываниях. Частота проца 120 МГц. Запустил всего 1 канал вывода шагов на частоте 192192 Гц. Используются 2 прерывания, каждое на частоте 192192 Гц. Вывод довольно точный. Но у процессора это отнимает целую треть всего времени. Оценку времени сделал простую. В основном цикле прибавляю по единице к переменной. Смотрю какое число набегает за минуту со включенным выводом шагов и без него.

Прерывания, учитывая все накладные расходы, это слишком дорогое удовольствие для процессора. На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них. Тогда у процессора останется хотя бы какое-то время на разные подсчёты в сервоцикле и основной программе. Категорически непонятно зачем китайцы в своём контроллере выводят шаги программно. Это ужасно неэффективно ;)
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение Сергей Саныч »

MX_Master писал(а):На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них.
Да. Кроме того, надо правильно распределить приоритеты, чтобы прерывания не мешали друг другу и не "наступали себе на хвост". Поэтому на генерацию - одно прерывание, на сервоцикл - второе, все остальное - в фоне.
Насчет "неэффективности" - а много ли времени займут "разные подсчеты"? И что еще МК делать? Да пусть хоть полностью будет загружен, лишь бы успевал вовремя делать всё, что надо.
Полностью аппаратный вывод расточителен с точки зрения количества потребных таймеров - на каждый канал надо минимум две штуки - один на генерацию, второй на подсчет шагов. Ещё и не всякие таймеры из STM-овского зоопарка подойдут.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Контроллер для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Для проца всегда есть работа. Поэтому, если есть возможность не грузить проц, надо так и сделать.

По два таймера на канал - это в идеале. Я уже давно придумал способ, где используется только 1 таймер для вывода и DMA в роли счетчика. Шина к памяти и периферии при этом нагружены сильно, но на F103C8T6 таким способом я стабильно выводил по мегагерцу на каждом из 4-х каналов. А на F407 - по 2 МГц. Стессна, при условии, что всё разведено на пины аппаратных таймеров. Однако, в китайском контроллере всё иначе. Зато 10 таймеров полностью свободны.

Надо попробовать ещё один способ. На этот раз с DMA. Посижу сегодня вечером над реализацией.
Ответить

Вернуться в «LinuxCNC»