Решение проблемы нестабильной работы шагового двигателя через WirenBoard

В нашем оборудовании мы используем WirenBoard - управляем шаговыми двигателями через драйверы с RS485 по Modbus. Но, есть также потребность использовать и другие драйверы, управляемые по STEP/DIR. Для этого нужен высокоточный дискретный сигнал частотой до 10 кГц.
Соответственно, я хочу попробовать использовать один из выходов A для управления таким драйвером шагового двигателя.
Собственно, я это уже реализовал с помощью пакета на C, с таймером.
Но тут возникла проблема - не совсем идеальная, нестабильная работа двигателя, очевидно таймер срабатывает через разные промежутки времени. Пробовал повышать приоритет процесса через sched_setscheduler(), это помогает но всё равно есть нестабильность.

Вы не подскажете, может быть есть какой-то путь решения?
Например, изолировать одно из ядер CPU и использовать его только под мой пакет.

Добрый день.

Дергать GPIO из линукса с такой частотой — не лучшая идея. Всё-таки он не предназначен для таких задач. Как правило для решения данной проблемы используют внешний контроллер, который уже сам формирует сигналы. Вот, например, первое что попалось в гугле — Контроллер Modbus для шагового двигателя и энкодера. Контроллер управляется по протоколу MODBUS-RTU через интерфейс RS-485. Чтобы подключить к контроллеру Wiren Board — нужно написать шаблон.

К сожалению, использование такого устройства не имеет практического смысла, в таком случае, надёжнее (и дешевле) будет драйвер шагового двигателя с уже встроенным интерфейсом RS-485.
Мой вопрос касался именно прямого подключения.

При подключении напрямую вряд ли получится такое сделать. Где-то находил библиотеку, реализующую управление GPIO через память процессора, с ней управлять получится быстрее, но даже в таком случае высокой точности не добиться. Проще и надежнее использовать внешний контроллер. Если стоимость готовых решений не устраивает — можно сделать самому на той же ардуино.

1 лайк

Я бы рекомендовал попробовать дёргать из ядра, там это должно получиться.

В ядро программный ШИМ пытаются добавить прямо сейчас, патч вот: [PATCH V4 0/2] pwm: Add GPIO PWM driver - Stefan Wahren

Дальше инициализировать этот шим-интерфейс его через device tree.

юзерспейс и изоляция ядер - это taskset для процесса.
Есть ещё cpuset, чтобы раскидать разные процессы по разным ядрам. Там довольно сложный интерфейс, провозиться можно долго.
Есть параметр ядра isolcpus, но он устаревший.

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

Да, конечно, я это понимаю, поэтому, ни в коем случае, не требую готовое решение и не заявляю никаких претензий.
Я и сам занимаюсь этим вопросом в свободное от основных проектов время.
Спасибо за советы, попробую.