Управление шаговиком -- это достаточно развесистый конечный автомат
скорей полностью умещающийся в прерываниях. И получающий от
прикладного уровня комадны вроде "приехать в такую-то позицию",
"найти начальную позицию", "безостановочное движение с такой-то
скоростью"... И отдающий на прикладной уровень текущую позицию
(когда в движении), код ошибки и т.п. При этом этот автомат должен
сам следить ещё и за концевиками или датчиками положений. Вообще
удобней такой автомат вынести на отдельный мелкий контроллер, поближе к драйверу двигателя и соединяемый через I2C, RS485, CAN... В этом кстати ещё плюс, что контроллер может заменить дорогостоящий драйвер и останутся только мосфеты (у многих МК есть спец. модуль для этого -- ШИМ со сбросом от компаратора измеряющего ток в обмотке).
У автомата можно выделить по меньшей мере несколько глобальных состояний:
1) начальное, ожидание команд от прикладного уровня;
2) поиск начальной позиции;
3) движение с положительным постоянным ускорением, разгон;
4) движение с постоянной скоростью;
5) движение отрицательным постоянным ускорением, торможение;
6) останов, удержание двигателя полным током;
7) удержание двигателя малым током (не всегда применимо в случае микрошага: будет доворачиваться);
8) сбой (ожидание команды, переход на пункт 2).
Пункты 3-7 выполняются в порядке перечисления многократно в процессе работы...
Пункт 2 сложный. Он рекурсивно включает в себя пункты 3-6 для движения в сторону срабатывания флажка оптопары, например. Флажок (его край) заведомо проезжается мимо. Затем происходит возврат на границу срабатывания флажка с минимально возможной скоростью и при пересечении флажка фиксируется точка нуля координат.
В дальнейшем, при работе, в движении, сбой фиксируется только если флажок фиксируется на значительном расстоянии от ожидаемого места его нахождения (даже в варианте с ШВП всё оно на самом деле порядочно эластичное). С "лазерным диском" углового датчика аналогично, в движении он может отставать или опережать фактическое положение насколько-то и только после остановки более-менее должен соответствовать. Вообще это от механики больше зависит. Если всё посажено прямо на вал, то каких-то фокусов ожидать не стоит (хотя электрическая фаза всё равно опережает механическую).
Потерять позицию очень даже можно, если во-первых не хватило мощности при заданных ускорениях и скоростях (драйвер может не развить заданный ток, при высокой скорости вращения, из-за индуктивности ротора -- нужно увеличивать напряжение), во-вторых если есть проблемы в механике (рвётся пластик в ремнях и съезжает по корду, сам корд растягивается, высокое трение на направляющих, люфты...) Оптопара при засветке солнечным светом может срабатывать раньше или позже. Хуже того, если там большой гистерезис, оптопара может срабатывать в разных местах в зависимости от направления движения флажка.
Управлять током двигателя, как я писал, проще не по шагам, а из обработчика прерываний вызываемого через равные промежутки времени. Где производится расчёт фаз токов, в зависимости от скорости и ускорения, для текущего момента времени (даже если прерывание запоздает -- не очень страшно, нужен независимый точный счётчик времени, например аппаратный таймер) и устанавливаются нужные фазы тока на обмотках.
Как рассчитать ускорение можно почитать здесь: https://www.embedded.com/generate-stepper-motor-speed-profiles-in-real-time/
Это критически важно, если двигатель таскает нагрузку со значительной массой.
У Ридико Леонида Ивановича была статья где-то хорошая, не найти.
Да, нужно понимать, что когда пишут про падение момента от скорости, рисуют какие-то графики, часто подразумевается не работа в паре с полноценным, регулирующим ток, драйвером, а управление напряжением. С драйвером картина не настолько страшна, но напряжение питания конечно нужно в разы более высокое.
"По шагам" -- это когда в прерывании расчитывают время когда нужно сделать следующий (микро)шаг и программируют таймер. Не советую, ибо сразу возникает масса проблем и с таймером, и с неуспеванием контроллера на высоких скоростях. Но у тебя, если там сигналы типа DIR и STEP, с управлением фазами ничего не выйдет. Лучше другие драйвера, где просто задаётся ток, без всяких степов. Или вовсе с подходящего МК управлять транзисторами напрямую.