Контроллер плавного пуска и торможения шагового двигателя
Добавлено: 09 апр 2018, 21:26
Плавный разгон и торможение шагового двигателя.
Недавно решил собрать тестовый контроллер ШД и вдруг понял, что при кажущейся простоте задачи, реализовать плавное ускорение и торможение ШД не так-то просто. Вначале я разработал и изготовил плату на контроллере PIC16F886, а потом начал думать над алгоритмом. И в результате потерпел полное фиаско. ШД раскручивался, но с какими-то стуками и со срывом синхронизма на “высоких” оборотах (понятие “высоких” естественно для разных людей разное). У контроллера выявилась проблема со стабильностью таймера и низкой скоростью реакции на прерывания. Контролировать процесс при этом практически невозможно. Поэтому, что бы не переделывать плату контроллера я заменил м/с PIC16F886 на PIC18F2520. По ногам тот же самый функционал, только работает не на 8МГц а на 32МГц.
Ну а теперь по существу.
Глобально, в теории разгона ШД существуют 2 ветки:
1. Линейный разгон-торможение. Реализация довольно проста. Ускорение постоянно и скорость линейно нарастает.
2. S-образная характеристика разгона-торможения. Есть разные подходы к разгонным кривым, но суть всего этого - компенсировать потерю момента ШД при увеличении угловой скорости. S-образная характеристика хороша и в том случае если нужно сдвинуть большие массы (например портал Х). Но если вы работаете не на пределе скоростей, то линейное управление не самый плохой вариант. Я, в данном проекте, экспериментировал с Sin-нусной реализацией S-кривой. Легко рассчитать и даже в реальном проекте, по управлению ШД, синус рассчитывается очень быстро.
Теперь о практической реализации. Так как контроллер PIC18F2520 достаточно слабый при математических вычислениях в реальном времени, кривые разгона я заранее рассчитал в Excel Visual Basic, а потом в виде массивов подставлял в программу управления. В контроллере я реализовал 5 скоростей ШД 500, 770, 1000, 1250, 1666 имп/сек. Расчет ведется в импульсах шагового двигателя. Для моего двигателя:
- Vmax = 1000имп/сек. (или 1000/200=5об./сек.) Максимальная скорость ШД;
- Vo = 100имп/сек. ШД как правило управляются не с 0 иначе велик риск попасть в резонанс, что отрицательно сказывается на моменте;
- F_clk = 10кГц частота дискретизации или обсчета траектории (в нашем случае это не реальный расчет, а эмуляция по рассчитанному заранее массиву). Частота должна быть в несколько раз больше чем Vmax. В некоторых контроллера я встречал частоту до 500кГц. Чем она больше – тем точнее аппроксимация траектории и лучше плавность работы ШД. Но все упирается в производительность;
- S = S + (Vi+Vi-1)/2*0,0001*0,0001, S – это расстояние, пройденное за i тик времени. Этот параметр с накоплением и он должен быть рассчитан на каждом шаге S = S + Si;
- Ну и наконец, смотрим разность Sj – Sj-1 > 1 . Если условие выполняется, то в этот момент подаем импульс на ШД (не забывайте, что импульс подается, когда разность между предыдущим положением ШД и нынешним превысит 1).
Кому интересен расчет для прямолинейного и S-образного управления, я выложил файлы, в которых есть расчет и графики кривых. Заодно можете проверить, вдруг я где-то ошибся.
https://youtu.be/vnx0HSAkLhs
Программа на EXCEL для линейного ускорения: https://www.dropbox.com/s/x49q9ydy9vwum ... .xlsm?dl=0
Программа на EXCEL для S- ускорения:
https://www.dropbox.com/s/fodtuuznxs79q ... .xlsm?dl=0
Недавно решил собрать тестовый контроллер ШД и вдруг понял, что при кажущейся простоте задачи, реализовать плавное ускорение и торможение ШД не так-то просто. Вначале я разработал и изготовил плату на контроллере PIC16F886, а потом начал думать над алгоритмом. И в результате потерпел полное фиаско. ШД раскручивался, но с какими-то стуками и со срывом синхронизма на “высоких” оборотах (понятие “высоких” естественно для разных людей разное). У контроллера выявилась проблема со стабильностью таймера и низкой скоростью реакции на прерывания. Контролировать процесс при этом практически невозможно. Поэтому, что бы не переделывать плату контроллера я заменил м/с PIC16F886 на PIC18F2520. По ногам тот же самый функционал, только работает не на 8МГц а на 32МГц.
Ну а теперь по существу.
Глобально, в теории разгона ШД существуют 2 ветки:
1. Линейный разгон-торможение. Реализация довольно проста. Ускорение постоянно и скорость линейно нарастает.
2. S-образная характеристика разгона-торможения. Есть разные подходы к разгонным кривым, но суть всего этого - компенсировать потерю момента ШД при увеличении угловой скорости. S-образная характеристика хороша и в том случае если нужно сдвинуть большие массы (например портал Х). Но если вы работаете не на пределе скоростей, то линейное управление не самый плохой вариант. Я, в данном проекте, экспериментировал с Sin-нусной реализацией S-кривой. Легко рассчитать и даже в реальном проекте, по управлению ШД, синус рассчитывается очень быстро.
Теперь о практической реализации. Так как контроллер PIC18F2520 достаточно слабый при математических вычислениях в реальном времени, кривые разгона я заранее рассчитал в Excel Visual Basic, а потом в виде массивов подставлял в программу управления. В контроллере я реализовал 5 скоростей ШД 500, 770, 1000, 1250, 1666 имп/сек. Расчет ведется в импульсах шагового двигателя. Для моего двигателя:
- Vmax = 1000имп/сек. (или 1000/200=5об./сек.) Максимальная скорость ШД;
- Vo = 100имп/сек. ШД как правило управляются не с 0 иначе велик риск попасть в резонанс, что отрицательно сказывается на моменте;
- F_clk = 10кГц частота дискретизации или обсчета траектории (в нашем случае это не реальный расчет, а эмуляция по рассчитанному заранее массиву). Частота должна быть в несколько раз больше чем Vmax. В некоторых контроллера я встречал частоту до 500кГц. Чем она больше – тем точнее аппроксимация траектории и лучше плавность работы ШД. Но все упирается в производительность;
- S = S + (Vi+Vi-1)/2*0,0001*0,0001, S – это расстояние, пройденное за i тик времени. Этот параметр с накоплением и он должен быть рассчитан на каждом шаге S = S + Si;
- Ну и наконец, смотрим разность Sj – Sj-1 > 1 . Если условие выполняется, то в этот момент подаем импульс на ШД (не забывайте, что импульс подается, когда разность между предыдущим положением ШД и нынешним превысит 1).
Кому интересен расчет для прямолинейного и S-образного управления, я выложил файлы, в которых есть расчет и графики кривых. Заодно можете проверить, вдруг я где-то ошибся.
https://youtu.be/vnx0HSAkLhs
Программа на EXCEL для линейного ускорения: https://www.dropbox.com/s/x49q9ydy9vwum ... .xlsm?dl=0
Программа на EXCEL для S- ускорения:
https://www.dropbox.com/s/fodtuuznxs79q ... .xlsm?dl=0