Рис. 33. Процесс ШИМ-стабилизации тока.
Нужно сказать, что аналоговая часть системы ШИМ-стабилизации тока фаз двигателя является довольно «капризной». Дело в том, что сигнал, снимаемый с датчика тока, содержит большое количество помех. Помехи возникают в основном в моменты коммутации обмоток двигателя, причем как «своей», так и «чужой» фазы. Для правильной работы схемы требуется корректная разводка печатной платы, особенно это касается земляных проводников. Возможно, придется подобрать номиналы ФНЧ на входе компаратора или даже ввести в компаратор небольшой гистерезис. Как уже отмечалось выше, при управлении маломощными двигателями от ШИМ-стабилизации тока можно вовсе отказаться, применив обычную L/R-схему питания обмоток. Для исключения ШИМ-стабилизации достаточно просто не подключать входы INT0 и INT1 микроконтроллера, естественно, при этом можно вообще не устанавливать компаратор и датчики тока. В данной программе периодичность вычисления новых значений скорости и периода выбрана равной 15.625мс. Такое значение выбрано не случайно. Этот интервал составляет 1/64с, а главное, он содержит целое число периодов переполнения таймера 0 (25мкс). Удобно, если значения скорости и ускорения задаются в естественных единицах, т.е. в шагах в секунду и в шагах, деленных на секунду в квадрате. Для того чтобы иметь возможность в целочисленной арифметике вычислять мгновенную скорость 64 раза в секунду, нужно перейти к внутреннему представлению скорости, увеличенному в 64 раза. Умножение и деление на 64 сводится к обычным сдвигам и поэтому требует очень мало времени. Заданную периодичность вычислений обеспечивает еще один программный таймер URCNT, который декрементируется в прерывании таймера 0 (раз в 25мкс). Этот таймер всегда загружается постоянной величиной, что обеспечивает неизменный период его переполнений, равный 15.625мс. При переполнении этого таймера устанавливается битовый флаг UPD, который сигнализирует основной программе, что «пора-бы обновить значения скорости и периода». Основная программа (рис. 34) выполняет вычисление мгновенных значений скорости и периода следования шагов, обеспечивая необходимую кривую разгона. В данном случае разгон и торможение осуществляются с постоянным ускорением, поэтому скорость меняется линейно. Период при этом меняется по гиперболическому закону, и его вычисление – основная работа программы.
Рис. 34. Блок-схема основного цикла программы.
Обновление значений скорости и периода следования шагов основная программа делает периодически, периодичность задается флагом UPD. Обновление программа делает на основе сравнения значений двух переменных: мгновенной скорости VC и требуемой скорости VR.
Значение требуемой скорости также определяется в основной программе. Это делается на основе анализа управляющих сигналов и сигналов с концевых выключателей. В зависимости от этих сигналов, основная программа загружает переменную VR значением требуемой скорости. В данной программе это V для движения вперед, -V для движения назад и 0 для остановки. В общем случае, набор скоростей (а также ускорений и токов фаз) может быть сколь угодно большим, в зависимости от требований. Если скорости VC и VR равны, значит, шаговый двигатель работает в стационарном режиме и обновления не требуется. Если же скорости не равны, то значение VC с заданным ускорением приближается к VR, т.е. двигатель ускоряется (или замедляется) до достижения номинальной скорости. В случае, когда даже знаки VR и VC отличаются, двигатель замедляется, реверсируется и потом достигает требуемой скорости. Происходит это как бы само собой, благодаря структуре программы. Если при очередной проверке обнаруживается, что скорости VR и VC не равны, то к значению VC прибавляется (или вычитается) значение ускорения A. Если в результате этой операции происходит превышение требуемой скорости, то полученное значение корректируется путем замены на точное значение требуемой скорости.
Затем происходит вычисление периода T (рис. 35).
Рис. 35. Блок-схема подпрограммы вычисления периода.
Вначале вычисляется модуль текущей скорости. Затем происходит ограничение минимальной скорости. Это ограничение необходимо по двум причинам. Во-первых, бесконечно малой скорости соответствует бесконечно большой период, что вызовет ошибку в вычислениях. Во-вторых, шаговые двигатели имеют довольно протяженную по скорости зону старта, поэтому нет необходимости стартовать на очень маленькой скорости, тем более что вращение на малых скоростях вызывает повышенный шум и вибрацию. Значение минимальной скорости VMIN должно выбираться исходя из конкретной задачи и типа двигателя. После ограничения минимальной скорости производится вычисление периода по формуле T = 2560000/|VC|. На первый взгляд формула не очевидна, но если учесть, что период необходимо получить в 25мкс-интервалах, а внутреннее представление VC – это умноженное на 64 ее истинное значение, то все становится на свои места. При вычислении T требуется операция беззнакового деления формата 24/24, которое AVR на тактовой частоте 10МГц делает примерно за 70мкс. Учитывая, что вычисления периода происходят не чаще, чем один раз в 15.625мс, загрузка процессора получается очень низкой. Основную загрузку производит прерывание таймера 0, да и оно в основном выполняется по короткой ветке (без переполнения STCNT) длительностью примерно 3мкс, что соответствует 12%-й загрузке процессора. Это означает, что имеются значительные резервы вычислительных ресурсов.
Печатная плата контроллера шагового двигателя приведена на рис. 36.
Рис. 36. Печатная плата контроллера шaгового двигателя.