|
Алгоритм управления шаговым двигателем ? |
|
|
|
Feb 2 2006, 19:38
|
Участник

Группа: Новичок
Сообщений: 52
Регистрация: 25-01-06
Пользователь №: 13 617

|
Нужен пример, алгоритм управления шаговым двигателем? Я не разу не видел и не знаю как пишется 100% оптимальный, проверенный временем алгоритм управления шаговым двигателем. Я пишу свои алгоритмы управления, но кажется что всё должно быть совсем не так? [code] { SetPortVal(0x378,0,1); for(; i < 5; i++) { if(i == 1) { SetPortVal(0x378,1,1); Sleep(100); } else if(i == 2) { SetPortVal(0x378,2,1); Sleep(100); } else if(i == 3) { SetPortVal(0x378,4,1); Sleep(100); } else if(i == 4) { SetPortVal(0x378,8,1); Sleep(100); i = 0; } } }
|
|
|
|
|
Feb 3 2006, 11:23
|

Участник

Группа: Участник
Сообщений: 69
Регистрация: 17-09-05
Из: Kirov
Пользователь №: 8 659

|
см. http://www.cs.uiowa.edu/~jones/step/ - классика по subj. Далее советую присмотреться к апнотам от STM на различные драйвера. А в общем не существует "100% оптимальный, проверенный временем алгоритм управления шаговым двигателем", т.к. ШД с точки зрения теории управления достаточно сложный объект, т.к. как минимум обладает механическим резонансом на некотором _рабочем_ диапазоне скоростей и ярко выраженной зависимостью момента двигателя от его скорости. Существуют и другие проблемы, которые также приходится решать в каждой задаче индивидуально, и зачастую они "растут" от упомянутых мной проблем. Поэтому даже для казалось-бы похожих задач приходиться подгонять "универсально-отлаженный" алгоритм управления. Так что как - учите сначала теорию. з.ы.: ничего личного...
Сообщение отредактировал fantasy - Feb 3 2006, 11:36
--------------------
В голове слышался грохот: рушились грандиозные планы...
|
|
|
|
|
Feb 4 2006, 08:51
|

Местный
  
Группа: Свой
Сообщений: 255
Регистрация: 10-03-05
Из: Омск
Пользователь №: 3 195

|
Цитата(rihkov @ Feb 2 2006, 22:38)  Нужен пример, алгоритм управления шаговым двигателем? Я не разу не видел и не знаю как пишется 100% оптимальный, проверенный временем алгоритм управления шаговым двигателем. Я пишу свои алгоритмы управления, но кажется что всё должно быть совсем не так? [code] { SetPortVal(0x378,0,1); for(; i < 5; i++) { if(i == 1) { SetPortVal(0x378,1,1); Sleep(100); } else if(i == 2) { SetPortVal(0x378,2,1); Sleep(100); } else if(i == 3) { SetPortVal(0x378,4,1); Sleep(100); } else if(i == 4) { SetPortVal(0x378,8,1); Sleep(100); i = 0; } } } Неправильно. Для 4-фазника(типа ШД-4) нужно 1-2-3-6-4-С-9, т.е. чтобы ток протекал то через 1 то через 2 обмотки двигателя. Для 6-фазника (типа ШД-5) включают то 2 то 3 обмотки.
|
|
|
|
|
Feb 6 2006, 09:18
|

Местный
  
Группа: Свой
Сообщений: 255
Регистрация: 10-03-05
Из: Омск
Пользователь №: 3 195

|
Цитата(BVU @ Feb 6 2006, 12:08)  А по моемому в управлении шаговым двигателем одно из серьезных ограничений накладивается параметром, как частота преемственности. Которая и обуславливает максимальную скорость позиционирования. Не превышая этого ограничения все должно работать в соответствии с теорией и паспортными данными ШД. Вы что-то путаете. Во первых, не преемственность а приемистость. Это скорость (или частота импульсов), до которой двигатель можно разогнать скачком. Если нужно крутить быстрее - нужно разгонять (останавливать) плавно. Преемистость - не есть максимальная скорость.
|
|
|
|
|
Feb 6 2006, 10:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(dm_mur @ Feb 6 2006, 12:18)  Вы что-то путаете.
Во первых, не преемственность а приемистость. Это скорость (или частота импульсов), до которой двигатель можно разогнать скачком. Если нужно крутить быстрее - нужно разгонять (останавливать) плавно. Преемистость - не есть максимальная скорость. Пардон, оговорился... Именно это и хотел сказать, но получилось - коряво (давно данной темы не 'касался'). Приеместость верхний предел, инерционность - нижний (разгон/торможение). Исходя из этого алгоритм управления остается единым практически для всех ШД, отличие лишь будет заключаться во временах (разгон/торможение).
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Feb 6 2006, 13:43
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 8-01-06
Из: Петербург
Пользователь №: 12 944

|
Уважаемые Господа,
может кто-нибудь сталкивался с проблемой быстрой раскрутки шаговых двигателей. А именно:
1. Интересует по какому закону нужно изменять паузы (Sleep(x), x=x(n)), чтобы достичь нужной скорости за наиболее короткий промежуток времени.
2. Должен ли разгон быть равноускоренным, хотя бы в первом приближении?
3. Как влияет использование дробных шагов (не 1-3-2-..., а более мелких) на приемистость двигателя?
Двигатели - импортные, небольшой мощности, типа FL42STH.
|
|
|
|
|
Feb 6 2006, 17:42
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(ivan2006 @ Feb 6 2006, 15:43)  Уважаемые Господа,
может кто-нибудь сталкивался с проблемой быстрой раскрутки шаговых двигателей. А именно:
1. Интересует по какому закону нужно изменять паузы (Sleep(x), x=x(n)), чтобы достичь нужной скорости за наиболее короткий промежуток времени.
2. Должен ли разгон быть равноускоренным, хотя бы в первом приближении?
3. Как влияет использование дробных шагов (не 1-3-2-..., а более мелких) на приемистость двигателя?
Двигатели - импортные, небольшой мощности, типа FL42STH. Я, в-общем-то, небольшой спец по ШД, но попробую поделиться опытом. 1. Закон зависит в общем случае от способа запитывания обмоток - постоянным напряжением или током. В своих изделиях (в блоках печатающих механизмов, как правило двигатели со схемой 2-2) мы обычно применяем мосты со стабилизаторами тока. В этом случае неплохо работает аппроксимация постоянной мощности на валу - скорость растет по корню квадратному от времени. Соответственно шаги должны быть синхронизированы со скоростью. Если же питать обмотки фиксированным напряжением (более простая схема драйверов) - то нужно учитывать ЭДС наводимую сердечником, увеличивающуюся со скоростью и уменьшающую эффективное напряжение и ток (следовательно прикладываемую мощность для разгона). 2. Не обязательно. В-общем, для равноускоренного разгона нужно наращивать мощность вкачиваемую в обмотки по квадрату, либо изначально иметь достаточный запас мощности - что не способствует быстрейшему разгону. Наибыстрейший разгон - изначально прикладываем максимум возможной мощности и синхронизируемся с нарастаемой скоростью. 3. Из нашего практического опыта - положительно - в том смысле, что фаза меняется более плавно, двигателю легче стартовать - момент изменяется менее скачкообразно, но при дроблении обычно прикладывается меньшая мощность - время разгона растет - нужно больше шагов. Еще положительный момент дробления шагов - снижение механического шума и вибраций, иногда значительное. Есть еще такая проблема - когда двигатель уже разогнан и вышел на режим, то очень желательно поддерживать длительность шагов постоянной - разброс не более 5%. Например частота шагов 4 кГц - это 250 мкс, для медленных процессоров и с неудачно написанными обработчиками прерываний довольно легко выйти за предел 5% (12.5 мкс) - тогда на двигателе может возникнуть "помпаж" и вплоть до остановки. Конечно, тут речь идет о режимах и скоростях недостигаемых при простом "старте с места". Иногда еще полезно учитывать величину и изменения нагрузки - например, приходилось корректировать разгон в зависимости от количества чернил в струйной головке - масса прилично различалась, приходилось это учитывать. Потом, правда, просто умощнили двигатель и забили на это
|
|
|
|
|
Feb 6 2006, 19:43
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 8-01-06
Из: Петербург
Пользователь №: 12 944

|
2 VslavX Большое спасибо за ответ. Да, с равноускоренным разгоном я ошибся. Сейчас прикинул на бумажке, действительно если нагрузка инертная, при постоянной мощности - паузы должны менятся как обратный квадратный корень. А если как в нашем случае - с постоянным напряжением и наличием индуктивности обмоток то как обратный кубический корень. Оба вроде бы должны быстро вычислятся с помощью сложения-умножения. Со стабильностью шагов, думаю проблем не возникнет - планируем поставить ПЛИС с такт. частотой 100МГц, и тогда никаких прерываний, загруженных процессоров и т.п.  А вот вы написали про синхронизацию шагов со скоростью - это как? Вообще - как можно отслеживать вращение? т.е. нужно делать какой-то механический энкодер, или можно просто смотреть на какой-нибудь сдвиг тока по фазе?
|
|
|
|
|
Feb 6 2006, 19:52
|
Участник

Группа: Новичок
Сообщений: 52
Регистрация: 25-01-06
Пользователь №: 13 617

|
Этот алгоритм который я приводил в самом начале работает с перебоями, я проверял длительность импульсов на LPT логическим анализатором, и всё работает в разнобой, то один импульс длиннее других то два, и т.п. Переделал вот так: Код while(a) { SetPortVal(0x378,1,1); Sleep(valstep);
SetPortVal(0x378,2,1); Sleep(valstep);
SetPortVal(0x378,4,1); Sleep(valstep);
SetPortVal(0x378,8,1); Sleep(valstep);
} И установил режим порта в SPP , работает один к одному (тоесть все импульсы одинаковые), но теперь проблема с изминением частоты ( с задержкой Sleep(valstep)  , какое минимальное значение задержки можно задать с использованием Sleep() ? Если можно приведите пример своих алгоритмов по работе с ШД ?
|
|
|
|
|
Feb 7 2006, 08:21
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(ivan2006 @ Feb 6 2006, 22:43)  2 VslavX Большое спасибо за ответ. Да, с равноускоренным разгоном я ошибся. Сейчас прикинул на бумажке, действительно если нагрузка инертная, при постоянной мощности - паузы должны менятся как обратный квадратный корень. А если как в нашем случае - с постоянным напряжением и наличием индуктивности обмоток то как обратный кубический корень. Оба вроде бы должны быстро вычислятся с помощью сложения-умножения. Со стабильностью шагов, думаю проблем не возникнет - планируем поставить ПЛИС с такт. частотой 100МГц, и тогда никаких прерываний, загруженных процессоров и т.п.  А вот вы написали про синхронизацию шагов со скоростью - это как? Вообще - как можно отслеживать вращение? т.е. нужно делать какой-то механический энкодер, или можно просто смотреть на какой-нибудь сдвиг тока по фазе? По поводу постоянной мощности на валу. Это правильно не всегда. Вот при малой скорости мощность ограничивается максимальной силой (током) в обмотке. Поэтому при небольших скоростях получается сам собой режим постоянного ускорения. А под синхронизацией автор подразумевал, наверное, зависимость ускорения от текущей скорости. Иными словами - ускорение x скорость = const
|
|
|
|
|
Feb 7 2006, 09:20
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(ivan2006 @ Feb 6 2006, 21:43)  А вот вы написали про синхронизацию шагов со скоростью - это как? Когда-то давно я "для себя" принял модель ШД в виде этакого линейного ускорителя заряженных частиц. То есть полюс сердечника ("частица") последовательно проходит полюса статора ("кольца ускорителя"). И полюса статора должны менять фазу синхронно с прохождением сердечника, чтобы получилось ускорение. Поскольку расстояние между полюсами одинаковое, то чем быстрее движется сердечник, тем чаще надо изменять фазу. Вот и все что я имел ввиду под синхронизацией - длительность шага должна быть обратно пропорциональна текущей скорости. Цитата(ivan2006 @ Feb 6 2006, 21:43)  Вообще - как можно отслеживать вращение? т.е. нужно делать какой-то механический энкодер, или можно просто смотреть на какой-нибудь сдвиг тока по фазе? Отслеживать, конечно, можно (правда практически мне этого делать не приходилось). Но ШД хороши именно тем что если вы соблюдаете режимы, то всегда можно точно (+-люфт) сказать положение двигателя. Посмотрите, например, любой ударный или струйный принтер Epson - головки обычно на ШД-приводе и только один датчик (иногда - два) крайнего положения. И при печати и смене направления движения головы эти датчики далеко не на каждый проход задействуются (потому как - время надо тратить - скорость печати упадет) - то есть точность позиционирования сохраняется и достаточно высокая - 150-300dpi по крайней мере).
|
|
|
|
|
Feb 7 2006, 09:43
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(Tanya @ Feb 7 2006, 10:21)  По поводу постоянной мощности на валу. Это правильно не всегда. Вот при малой скорости мощность ограничивается максимальной силой (током) в обмотке. Поэтому при небольших скоростях получается сам собой режим постоянного ускорения. Конечно не всегда. Это очень приблизительная аппроксимация и много чего не учитывает - например, рост механического сопротивления сил трения с ростом скорости. А если ток с самого начала (в покое) ограничивается омическим сопротивлением обмоток - то ни о какой стабилизации тока и режиме постоянной мощности речи не идет. У нас "в режиме разгона при постоянной мощности" типовая ситуация - 8..12 вольтовый двигатель запитывается через мост с чоппером, который питается от 40..50V, и тогда все нормально - ток ограничивается именно стабилизатором. Да еще этот ток стабилизатора обычно управляется, минимум две-три ступени "удержание-номинал-взлетный режим", так что получается быстро, экономично и двигатели не греются. Правда, чипы управления обычно дорогие ($3-$10), так что такие схемы применяются не всегда. Вообще, в последнее время, "нормальные" производители механизмов, которые номинально предполагают разгон (а не старт-стоп с места) прикладывают таблички разгона-торможения - если интересно - через недельку (как пойду на работу) могу закинуть такую табличку изменения шагов в процентах от номинала при разгоне. Там разгон до скоростей раза в 4 превышающих старт-стопные (хотя, это, конечно, зависит от двигателя/нагрузки).
|
|
|
|
|
Feb 8 2006, 07:52
|
Участник

Группа: Новичок
Сообщений: 52
Регистрация: 25-01-06
Пользователь №: 13 617

|
Цитата Sleep() - 1ms минимальная не гарантированная задержка. В Windows она может затянуться на несколько минут, т.к. в системе есть потоки с более высоким приоритетом чем поток вашей программы. Вся проблема заключается именно в этом, самая малая (ощутимая) задержка 15мс , а если поставить 1мс то результат тот же что и при 15мс. Как задать более меньшую задержку, есть другие способы ?
|
|
|
|
|
Feb 10 2006, 20:05
|
Участник

Группа: Новичок
Сообщений: 52
Регистрация: 25-01-06
Пользователь №: 13 617

|
Уважаемый "VslavX" вы присоеденили бытый архив!
|
|
|
|
|
Feb 12 2006, 17:04
|

Частый гость
 
Группа: Свой
Сообщений: 97
Регистрация: 19-11-05
Из: dront78@jabber.snc.ru
Пользователь №: 11 092

|
По поводу точности управления 1. Sleep согласно Posix определяет что задержка не может быть меньше указаного значения, но может быть сколь угодно больше  2. Windows не Posix-совместимая система так что дела еще хуже 3. Есть интересная статья Разгон и торможение Windows NT4. QueryPerformanceCounter прекрасная весчь как раз показывает реальное время выполнения Sleep - на APIC ядрах задержки кратны 15мс, при выключенном APIC - 10мс 5. Тестовый код для таймера можно утянуть здесьИ не забудьте что даже если поток один - он все равно переключается раз в 15 (10?) мсек и когда включится дальше - знает только Bill Gates  P.S. Есть однако попытки противостоять злобным буржуямБудут успехи - пишите!
Сообщение отредактировал dronT78 - Feb 12 2006, 17:12
--------------------
Сколько волка не корми - слон все равно больше.
|
|
|
|
|
Feb 14 2006, 16:45
|

Частый гость
 
Группа: Свой
Сообщений: 97
Регистрация: 19-11-05
Из: dront78@jabber.snc.ru
Пользователь №: 11 092

|
Поглядите еще связку timeBeginPeriod timeEndPeriod Минимальное значение разрешающей способности 1 мс реально - зависит от операционки и определяется через timeGetDevCaps High Precision Event Timers поддерживаются только в XP Вот ссылка на MicrosoftУ меня более менее правильные результаты показывает при установке timeBeginPeriod(1) начиная с 3 мсек (Sleep(3)) с погрешностью до 1 мсек в большую сторону при тестах на AMD Athlon 64 3700+ WinXP SP2 и отсутствии загрузки другими процессами
Сообщение отредактировал dronT78 - Feb 14 2006, 17:01
--------------------
Сколько волка не корми - слон все равно больше.
|
|
|
|
|
Mar 9 2006, 09:21
|
Группа: Новичок
Сообщений: 3
Регистрация: 5-09-05
Пользователь №: 8 240

|
на самом деле Тут еще можно посмотреть полезную инфу по шаговым двигателям....переодически добавляют что-то новое!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|