Привет! А зачем ШИМ нужен? Через прерывания организуй точный счёт. В основном цикле программы поставь Переключатель (Switch ) который будет работать с учётом этого прерывания. В свойствах Переключателя поставь (на пример) при первом прерывании втянуть соленоид, при 10 отпустить, при 20 втянуть и держать. И так для каждой ноги. На практике определишься хватит ли для "дрыгания" интервала в 10 прерываний или нужно его изменить. Если нужно сделать несколько дрыганий - то добавь нужное количество циклов втянуть-отпустить. Только на практике соленоид такая штука, что ты не можешь его гарантированно втянуть ровно на половину, потому, что это будет соотношение напряжения (тока) времени их действия и механической нагрузки на соленоиде создающей обратное усилие, которое не бывают постоянно одинаковым. А если такое "вздрачнуть" на практике выстраивать не будешь даже приблизительно, то и точный отсчёт времени прерыванием можно не делать. Всё засандалить счётчиком в основном цикле.
Есть конечно вариант поставить оптопару на шток соленоида и "вздрачивать" точно до середины таким образом, но готов ли ты к усложнению механики и электроники мне не понятно. А вообще, совет. Сначала нужно придумать "периферию", что и как будет работать, за счёт чего работать, как позиционироваться и прочее, а уже потом думать над реализацией в программе. Потому, что программа в этом проекте не самое сложное

P.S: Сделай алгоритм для одной ноги (пина), потом засунь его в макрос, а потом добавишь в проект то количество макросов, сколько захочется иметь выходов
