Страница 41 из 71

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

Добавлено: 03 ноя 2019, 09:50
sidor094
sidor094 писал(а):
UAVpilot писал(а):В современных мониторах с подключением по DVI/DP/HDMI понятием развёртки можно пренебречь - оно используется лишь в маркетинговосравнительных целях
Если говорить о мерцании экрана с частотой развертки то да.Обновление же экрана происходит точно так-же ,как и в лучквых.Вместе с частотой развертки построчно(даже правильнее сказать попиксельно).
В любом случае у них все равно достаточно длительное послесвечение .Поэтому тянучки связаны не с разверткой ,а с медленным перезарядом емкостей .отсюда првный переход точки от предидущено состояния к нынешнему.
Но все это влияет особенности зрения и мало связано с реакцией игрока на события. Для нажатия на кнопку надо не только заметить изменение изображения но и успеть на него среанировать. Говоря про 100-400 мс я подразумеваю
время между изменением картинки и началом нажатия.То есть не просто заметить событие,но и успеть на него среагировать.Причем это автоматическая реакция.Когда человек уже наработал навык реагирования на данное событие и соответственно время на принятия решения не затрачивается.Неподготовленный человек(тот кто еще не автоматически реагирует на данное событие,а только знает,что нужно делать) добавит к этому еще время на принятие решения.

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

Добавлено: 03 ноя 2019, 11:45
MX_Master
Сергей Саныч писал(а):У меня в автономном контроллере 3 канала с максимальной частотой шагов 131072 Гц (больше не требовалось). Тактовая частота МК (STM32F072) - 48 МГц. Расчет и вывод - по таймерному прерыванию. На входе - значение частоты в формате с фиксированной запятой, на выходе - последовательность STEP. На расчет и вывод 1 канала тратится 35-50 тактов (без использования ассемблера).
Сергей Саныч, а можно чуток подробнее о вашем способе? С какой частотой вызывается прерывание? Для каждого канала своё прерывание или единое для всех? Каким способом дёргаются пины (бит бандинг или "ручная" правка регистра вывода порта? Используется ли DMA?

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

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

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

Фрагмент программы постараюсь выложить, как доберусь до рабочего компьютера.

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

Добавлено: 03 ноя 2019, 15:27
wldev
Сергей Саныч,
Хотел спросить:
1 Какая минимальная частота step?
2 Чем ещё занимается контроллер во время генерации.

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

Добавлено: 03 ноя 2019, 16:06
MX_Master
Bender, я надеюсь, в новой версии с STM32F4 ты выводишь шаги аппаратно? :)

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

Добавлено: 03 ноя 2019, 16:24
wldev
MX_Master писал(а):Bender, я надеюсь, в новой версии с STM32F4 ты выводишь шаги аппаратно? :)
Нет. Там Макс частота перемещения будет конечно больше.
..для шаговых большая частота и не нужна , а для сервопривод контроллеры могут выдавать квадратурный сигнал ABx4 в котором используется оба фронта в результате чего частота перемещения возрастёт в два раза при том же разрешение.

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

Добавлено: 03 ноя 2019, 16:31
Сергей Саныч
Bender писал(а):1 Какая минимальная частота step?
Ну, можно и 0Гц выдавать :) А вообще, (1/1024)Гц, то есть 1 импульс за 1024 сек. Дискретность задания частоты такая же. Неравномерность частоты - один период прерывания во всем диапазоне, что реальные ШД с драйверами не ощущают вообще никак :)
Bender писал(а):2 Чем ещё занимается контроллер во время генерации.
По второму прерыванию частотой 1024 Гц - расчетом параметров шаговой последовательности (путь, скорость, ускорение, направление), подсчет времени работы, опрос датчиков и кнопок. Прерывание имеет приоритет ниже, чем то, по которому идет генерация.
В фоновом режиме - отработка управляющих воздействий (кнопки, энкодер), зашитых программ "верхнего уровня" (это не G-код), индикация (OLED-дисплей 128х64).

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

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

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

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

Исходников китайской прошивки для Mach3 нет, но мне кажется, что китайцы таким способом шаги и выводили. Максимальная частота получится фиг знает какая :hehehe: Делайте ваши ставки :freak: На предстоящей неделе буду пробовать и замерю...

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

Добавлено: 03 ноя 2019, 18:38
wldev
Я бы сделал для начала как у Сергея Саныча. И довел бы все до готового образца. Чтобы были решены все моменты от протокола и драйвера до вывода шагов. А уже потом постепенно доводил систему...

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

Добавлено: 03 ноя 2019, 19:00
MX_Master
Сергей, протоколы уже готовы. И на голом Ethernet, и с LwIP (UDP), и даже веб-сервер робит. Единственная для меня неизвестность - это софт вывод шагов. Надо придумать одновременно быстрый, точный и лёгкий способ. Проц у F207 не резиновый :) В качестве теста хочу попробовать сервопериодную часть драйвера разместить в МК.
В моём варианте контроллера вывод шагов практически всегда аппаратный. Энкодеры и всё остальное тоже максимально аппаратные. В этом задумка и была. Но у меня там другая трудность - железо :) В электронике я зелен.

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

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

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

Добавлено: 04 ноя 2019, 09:18
Сергей Саныч
Сергей Саныч писал(а):Фрагмент программы постараюсь выложить

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

// Генерация импульсов 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; // Сброс флага прерывания
}

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

Добавлено: 04 ноя 2019, 12:28
dpss-2
MX_Master писал(а):Проц у F207 не резиновый
Мир не заканчивается на F207. Есть, например, 28 серия у Техаса, где эвивалентная частота тактирования ШИМ достигает пары гигагерц за счет использования коммутируемых задержек, есть всевозможные бюджетные FPGA. Когда нибудь захочется несколько каналов, как у Сименса, с возможностью параллельной работы и синхронизации. Тоже все в одну STM-ку будете втискивать?
"Глобус трещит, сова пищит" :hehehe:

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

Добавлено: 04 ноя 2019, 14:05
Serg
dpss-2 писал(а):Мир не заканчивается на F207.
В данном случае (в этом ответвлении этой темы) мир ограничен вот такой "железкой": Re: Контроллер для LinuxCNC (Ethernet + STM32) #727 :)

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

Добавлено: 04 ноя 2019, 19:39
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


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

Добавлено: 04 ноя 2019, 21:18
MX_Master
Спасибо, а для микроконтроллера как? :)

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

Добавлено: 04 ноя 2019, 22:43
D.L.
MX_Master писал(а):Спасибо, а для микроконтроллера как?
Устанавливаем лог. 1 на свободную ногу на входе в прерывание, и сбрасываем на выходе.
И дальше смотрим логическим анализатором или осциллографом длительность импульса.

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

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

Прерывания, учитывая все накладные расходы, это слишком дорогое удовольствие для процессора. На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них. Тогда у процессора останется хотя бы какое-то время на разные подсчёты в сервоцикле и основной программе. Категорически непонятно зачем китайцы в своём контроллере выводят шаги программно. Это ужасно неэффективно ;)

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

Добавлено: 05 ноя 2019, 04:52
Сергей Саныч
MX_Master писал(а):На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них.
Да. Кроме того, надо правильно распределить приоритеты, чтобы прерывания не мешали друг другу и не "наступали себе на хвост". Поэтому на генерацию - одно прерывание, на сервоцикл - второе, все остальное - в фоне.
Насчет "неэффективности" - а много ли времени займут "разные подсчеты"? И что еще МК делать? Да пусть хоть полностью будет загружен, лишь бы успевал вовремя делать всё, что надо.
Полностью аппаратный вывод расточителен с точки зрения количества потребных таймеров - на каждый канал надо минимум две штуки - один на генерацию, второй на подсчет шагов. Ещё и не всякие таймеры из STM-овского зоопарка подойдут.

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

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

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

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