Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм управления шаговым двигателем ?
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
rihkov
Нужен пример, алгоритм управления шаговым двигателем?
Я не разу не видел и не знаю как пишется 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;
}
}
}
upc2
Подскажите алгоритм переключения фаз вашего ШД.
И , что у вас за функция? Устанавливает соответствующий Bit в байте?
Wiener
Посмотри на www.platan.ru в разделе "документация" есть подшивки журнала "Схемотехника", там есть серия статей по работе с ШД.
fantasy
см. http://www.cs.uiowa.edu/~jones/step/ - классика по subj. Далее советую присмотреться к апнотам от STM на различные драйвера.

А в общем не существует "100% оптимальный, проверенный временем алгоритм управления шаговым двигателем", т.к. ШД с точки зрения теории управления достаточно сложный объект, т.к. как минимум обладает механическим резонансом на некотором _рабочем_ диапазоне скоростей и ярко выраженной зависимостью момента двигателя от его скорости. Существуют и другие проблемы, которые также приходится решать в каждой задаче индивидуально, и зачастую они "растут" от упомянутых мной проблем. Поэтому даже для казалось-бы похожих задач приходиться подгонять "универсально-отлаженный" алгоритм управления. Так что как - учите сначала теорию.
з.ы.: ничего личного...
defunct
Цитата(rihkov @ Feb 2 2006, 21:38) *
Я пишу свои алгоритмы управления, но кажется что всё должно быть совсем не так?


Для 4-х фазника (без общей земли) все именно так, как Вы пишете.
В обратную сторону - 8 4 2 1.
dm_mur
Цитата(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 обмотки.
rihkov
Я управляю таким способом ДШИ 200-1-1 smile3046.gif
defunct
Цитата(dm_mur @ Feb 4 2006, 10:51) *
Неправильно. Для 4-фазника(типа ШД-4) нужно 1-2-3-6-4-С-9, т.е. чтобы ток протекал то через 1 то через 2 обмотки двигателя.


Странно, управляю именно таким способом (8421) через КМОП ключи 4-х фазниками EM-327/328 (epson). Подключение вида A-B-A'-B'.
dm_mur
Цитата(defunct @ Feb 5 2006, 03:39) *
Странно, управляю именно таким способом (8421) через КМОП ключи 4-х фазниками EM-327/328 (epson). Подключение вида A-B-A'-B'.


Пожалуй я погорячился, сказав "неправильно". Режим 8-4-2-1 - это полношаговый режим с одновременным включением одной фазы. Используется редко, т.к. в этом режиме не может быть получен полный момент, двигатель наиболее подвержен резонансу. Чаще используется полушаговый режим (1-3-2-6-4-С-9)- как раз тот, что я описал. Позволяет получить в два раза более мелкий шаг, чем полношаговый (8-4-2-1). Если же необходим полношаговый режим, то используют одновременное включие 2-х фаз (3-6-С-9) - получается полный момент и устойчивость к резонансу
BVU
А по моемому в управлении шаговым двигателем одно из серьезных ограничений накладивается параметром, как частота преемственности. Которая и обуславливает максимальную скорость позиционирования. Не превышая этого ограничения все должно работать в соответствии с теорией и паспортными данными ШД.
dm_mur
Цитата(BVU @ Feb 6 2006, 12:08) *
А по моемому в управлении шаговым двигателем одно из серьезных ограничений накладивается параметром, как частота преемственности. Которая и обуславливает максимальную скорость позиционирования. Не превышая этого ограничения все должно работать в соответствии с теорией и паспортными данными ШД.


Вы что-то путаете.

Во первых, не преемственность а приемистость. Это скорость (или частота импульсов), до которой двигатель можно разогнать скачком. Если нужно крутить быстрее - нужно разгонять (останавливать) плавно. Преемистость - не есть максимальная скорость.
BVU
Цитата(dm_mur @ Feb 6 2006, 12:18) *
Вы что-то путаете.

Во первых, не преемственность а приемистость. Это скорость (или частота импульсов), до которой двигатель можно разогнать скачком. Если нужно крутить быстрее - нужно разгонять (останавливать) плавно. Преемистость - не есть максимальная скорость.

Пардон, оговорился...
Именно это и хотел сказать, но получилось - коряво (давно данной темы не 'касался'). Приеместость верхний предел, инерционность - нижний (разгон/торможение). Исходя из этого алгоритм управления остается единым практически для всех ШД, отличие лишь будет заключаться во временах (разгон/торможение).
ivan2006
Уважаемые Господа,

может кто-нибудь сталкивался с проблемой быстрой раскрутки шаговых двигателей.
А именно:

1. Интересует по какому закону нужно изменять паузы (Sleep(x), x=x(n)), чтобы достичь нужной скорости за наиболее короткий промежуток времени.

2. Должен ли разгон быть равноускоренным, хотя бы в первом приближении?

3. Как влияет использование дробных шагов (не 1-3-2-..., а более мелких) на приемистость двигателя?

Двигатели - импортные, небольшой мощности, типа FL42STH.
VslavX
Цитата(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 мкс) - тогда на двигателе может возникнуть "помпаж" и вплоть до остановки. Конечно, тут речь идет о режимах и скоростях недостигаемых при простом "старте с места".

Иногда еще полезно учитывать величину и изменения нагрузки - например, приходилось корректировать разгон в зависимости от количества чернил в струйной головке - масса прилично различалась, приходилось это учитывать. Потом, правда, просто умощнили двигатель и забили на это smile.gif
ivan2006
2 VslavX
Большое спасибо за ответ.

Да, с равноускоренным разгоном я ошибся.
Сейчас прикинул на бумажке, действительно если нагрузка инертная, при постоянной мощности - паузы должны менятся как обратный квадратный корень. А если как в нашем случае - с постоянным напряжением и наличием индуктивности обмоток то как обратный кубический корень. Оба вроде бы должны быстро вычислятся с помощью сложения-умножения.

Со стабильностью шагов, думаю проблем не возникнет - планируем поставить ПЛИС с такт. частотой 100МГц, и тогда никаких прерываний, загруженных процессоров и т.п. smile.gif

А вот вы написали про синхронизацию шагов со скоростью - это как?
Вообще - как можно отслеживать вращение? т.е. нужно делать какой-то механический энкодер, или можно просто смотреть на какой-нибудь сдвиг тока по фазе?
rihkov
Этот алгоритм который я приводил в самом начале работает с перебоями, я проверял длительность импульсов на 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)wink.gif, какое минимальное значение задержки можно задать с использованием Sleep() ?
Если можно приведите пример своих алгоритмов по работе с ШД ?
Tanya
Цитата(ivan2006 @ Feb 6 2006, 22:43) *
2 VslavX
Большое спасибо за ответ.

Да, с равноускоренным разгоном я ошибся.
Сейчас прикинул на бумажке, действительно если нагрузка инертная, при постоянной мощности - паузы должны менятся как обратный квадратный корень. А если как в нашем случае - с постоянным напряжением и наличием индуктивности обмоток то как обратный кубический корень. Оба вроде бы должны быстро вычислятся с помощью сложения-умножения.

Со стабильностью шагов, думаю проблем не возникнет - планируем поставить ПЛИС с такт. частотой 100МГц, и тогда никаких прерываний, загруженных процессоров и т.п. smile.gif

А вот вы написали про синхронизацию шагов со скоростью - это как?
Вообще - как можно отслеживать вращение? т.е. нужно делать какой-то механический энкодер, или можно просто смотреть на какой-нибудь сдвиг тока по фазе?

По поводу постоянной мощности на валу. Это правильно не всегда. Вот при малой скорости мощность ограничивается максимальной силой (током) в обмотке. Поэтому при небольших скоростях получается сам собой режим постоянного ускорения.
А под синхронизацией автор подразумевал, наверное, зависимость ускорения от текущей скорости. Иными словами - ускорение x скорость = const
VslavX
Цитата(ivan2006 @ Feb 6 2006, 21:43) *
А вот вы написали про синхронизацию шагов со скоростью - это как?

Когда-то давно я "для себя" принял модель ШД в виде этакого линейного ускорителя заряженных частиц. То есть полюс сердечника ("частица") последовательно проходит полюса статора ("кольца ускорителя"). И полюса статора должны менять фазу синхронно с прохождением сердечника, чтобы получилось ускорение. Поскольку расстояние между полюсами одинаковое, то чем быстрее движется сердечник, тем чаще надо изменять фазу. Вот и все что я имел ввиду под синхронизацией - длительность шага должна быть обратно пропорциональна текущей скорости.

Цитата(ivan2006 @ Feb 6 2006, 21:43) *
Вообще - как можно отслеживать вращение? т.е. нужно делать какой-то механический энкодер, или можно просто смотреть на какой-нибудь сдвиг тока по фазе?

Отслеживать, конечно, можно (правда практически мне этого делать не приходилось). Но ШД хороши именно тем что если вы соблюдаете режимы, то всегда можно точно (+-люфт) сказать положение двигателя.
Посмотрите, например, любой ударный или струйный принтер Epson - головки обычно на ШД-приводе и только один датчик (иногда - два) крайнего положения. И при печати и смене направления движения головы эти датчики далеко не на каждый проход задействуются (потому как - время надо тратить - скорость печати упадет) - то есть точность позиционирования сохраняется и достаточно высокая - 150-300dpi по крайней мере).
VslavX
Цитата(Tanya @ Feb 7 2006, 10:21) *
По поводу постоянной мощности на валу. Это правильно не всегда. Вот при малой скорости мощность ограничивается максимальной силой (током) в обмотке. Поэтому при небольших скоростях получается сам собой режим постоянного ускорения.

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


Sleep() - 1ms минимальная не гарантированная задержка. В Windows она может затянуться на несколько минут, т.к. в системе есть потоки с более высоким приоритетом чем поток вашей программы.
На время тестирования закрывайте все приложения.
rihkov
Цитата
Sleep() - 1ms минимальная не гарантированная задержка. В Windows она может затянуться на несколько минут, т.к. в системе есть потоки с более высоким приоритетом чем поток вашей программы.


Вся проблема заключается именно в этом, самая малая (ощутимая) задержка 15мс , а если поставить 1мс то результат тот же что и при 15мс. Как задать более меньшую задержку, есть другие способы ?
BVU
Возможно полезна будет ссылка:
http://kazus.ru/shemes/showpage/0/843/1.html
VslavX
Цитата(rihkov @ Feb 8 2006, 09:52) *
Цитата

Sleep() - 1ms минимальная не гарантированная задержка. В Windows она может затянуться на несколько минут, т.к. в системе есть потоки с более высоким приоритетом чем поток вашей программы.


Вся проблема заключается именно в этом, самая малая (ощутимая) задержка 15мс , а если поставить 1мс то результат тот же что и при 15мс. Как задать более меньшую задержку, есть другие способы ?

Можно использовать функцию QueryPerformanceCounter. В приложении - исходники простых функций задержек на указанное число милли- и микросекунд для Win32 и VC6. Единственное что - Win32 - вытесняющая многозадачность, поэтому функции гарантируют только что пройдет _минимум_ указанного времени. Несколько повышает точность измерения интервалов поднятие приоритета потока. Но вообще, если Вам надо точно управлять ШД, то про Win32 лучше забыть.
rihkov
Уважаемый "VslavX" вы присоеденили бытый архив!
VslavX
Цитата(rihkov @ Feb 10 2006, 22:05) *
Уважаемый "VslavX" вы присоеденили бытый архив!

Да вроде бы - нормальный архив. Только что скачал и без проблем распаковал на другом компьютере (не на том с которого отправлял). Winrar - версия 3.0.
Ну держите тогда в развернутом виде.
(При copy/paste в текст сообщения (как из Far так и VC) чего-то кракозяблятся русские комментарии sad.gif - так что снова попробую аттач) Любопытно, что файл с расширением ".c" почему-то приаттачить не получается - переименовал в ".txt", получилось. Сплошные глюки, однако sad.gif
dronT78
По поводу точности управления

1. Sleep согласно Posix определяет что задержка не может быть
меньше указаного значения, но может быть сколь угодно больше smile.gif

2. Windows не Posix-совместимая система так что дела еще хуже

3. Есть интересная статья Разгон и торможение Windows NT

4. QueryPerformanceCounter прекрасная весчь как раз показывает реальное время выполнения Sleep - на APIC ядрах задержки кратны 15мс, при выключенном APIC - 10мс

5. Тестовый код для таймера можно утянуть здесь

И не забудьте что даже если поток один - он все равно переключается раз в 15 (10?) мсек и когда включится дальше - знает только Bill Gates smile.gif

P.S. Есть однако попытки противостоять злобным буржуям

Будут успехи - пишите!
INT1
Динамические х-стики ШД от FLМ для различных режимов можно посмотреть на сайте производителя:
http://www.fullingmotor.com/
есть полезная инф. на :
http://www.electroprivod.ru
dronT78
Поглядите еще связку
timeBeginPeriod
timeEndPeriod
Минимальное значение разрешающей способности 1 мс
реально - зависит от операционки и определяется через timeGetDevCaps
High Precision Event Timers поддерживаются только в XP
Вот ссылка на Microsoft
У меня более менее правильные результаты показывает при установке
timeBeginPeriod(1) начиная с 3 мсек (Sleep(3)) с погрешностью до 1 мсек в большую сторону
при тестах на AMD Athlon 64 3700+ WinXP SP2 и отсутствии загрузки другими процессами
Stanley
на самом деле Тут еще можно посмотреть полезную инфу по шаговым двигателям....переодически добавляют что-то новое!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.