Перейти к содержанию
    

Алгоритм управления шаговым двигателем ?

Этот алгоритм который я приводил в самом начале работает с перебоями, я проверял длительность импульсов на 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() ?

Если можно приведите пример своих алгоритмов по работе с ШД ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 VslavX

Большое спасибо за ответ.

 

Да, с равноускоренным разгоном я ошибся.

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

 

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

 

А вот вы написали про синхронизацию шагов со скоростью - это как?

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

По поводу постоянной мощности на валу. Это правильно не всегда. Вот при малой скорости мощность ограничивается максимальной силой (током) в обмотке. Поэтому при небольших скоростях получается сам собой режим постоянного ускорения.

А под синхронизацией автор подразумевал, наверное, зависимость ускорения от текущей скорости. Иными словами - ускорение x скорость = const

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот вы написали про синхронизацию шагов со скоростью - это как?

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

 

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

Отслеживать, конечно, можно (правда практически мне этого делать не приходилось). Но ШД хороши именно тем что если вы соблюдаете режимы, то всегда можно точно (+-люфт) сказать положение двигателя.

Посмотрите, например, любой ударный или струйный принтер Epson - головки обычно на ШД-приводе и только один датчик (иногда - два) крайнего положения. И при печати и смене направления движения головы эти датчики далеко не на каждый проход задействуются (потому как - время надо тратить - скорость печати упадет) - то есть точность позиционирования сохраняется и достаточно высокая - 150-300dpi по крайней мере).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу постоянной мощности на валу. Это правильно не всегда. Вот при малой скорости мощность ограничивается максимальной силой (током) в обмотке. Поэтому при небольших скоростях получается сам собой режим постоянного ускорения.

Конечно не всегда. Это очень приблизительная аппроксимация и много чего не учитывает - например, рост механического сопротивления сил трения с ростом скорости.

А если ток с самого начала (в покое) ограничивается омическим сопротивлением обмоток - то ни о какой стабилизации тока и режиме постоянной мощности речи не идет. У нас "в режиме разгона при постоянной мощности" типовая ситуация - 8..12 вольтовый двигатель запитывается через мост с чоппером, который питается от 40..50V, и тогда все нормально - ток ограничивается именно стабилизатором. Да еще этот ток стабилизатора обычно управляется, минимум две-три ступени "удержание-номинал-взлетный режим", так что получается быстро, экономично и двигатели не греются. Правда, чипы управления обычно дорогие ($3-$10), так что такие схемы применяются не всегда.

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

(хотя, это, конечно, зависит от двигателя/нагрузки).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какое минимальное значение задержки можно задать с использованием Sleep() ?

 

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

На время тестирования закрывайте все приложения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Можно использовать функцию QueryPerformanceCounter. В приложении - исходники простых функций задержек на указанное число милли- и микросекунд для Win32 и VC6. Единственное что - Win32 - вытесняющая многозадачность, поэтому функции гарантируют только что пройдет _минимум_ указанного времени. Несколько повышает точность измерения интервалов поднятие приоритета потока. Но вообще, если Вам надо точно управлять ШД, то про Win32 лучше забыть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый "VslavX" вы присоеденили бытый архив!

Да вроде бы - нормальный архив. Только что скачал и без проблем распаковал на другом компьютере (не на том с которого отправлял). Winrar - версия 3.0.

Ну держите тогда в развернутом виде.

(При copy/paste в текст сообщения (как из Far так и VC) чего-то кракозяблятся русские комментарии :( - так что снова попробую аттач) Любопытно, что файл с расширением ".c" почему-то приаттачить не получается - переименовал в ".txt", получилось. Сплошные глюки, однако :(

Изменено пользователем VslavX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу точности управления

 

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

меньше указаного значения, но может быть сколь угодно больше :)

 

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

 

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

 

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

 

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

 

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

 

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

 

Будут успехи - пишите!

Изменено пользователем dronT78

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Динамические х-стики ШД от FLМ для различных режимов можно посмотреть на сайте производителя:

http://www.fullingmotor.com/

есть полезная инф. на :

http://www.electroprivod.ru

Изменено пользователем INT1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поглядите еще связку

timeBeginPeriod

timeEndPeriod

Минимальное значение разрешающей способности 1 мс

реально - зависит от операционки и определяется через timeGetDevCaps

High Precision Event Timers поддерживаются только в XP

Вот ссылка на Microsoft

У меня более менее правильные результаты показывает при установке

timeBeginPeriod(1) начиная с 3 мсек (Sleep(3)) с погрешностью до 1 мсек в большую сторону

при тестах на AMD Athlon 64 3700+ WinXP SP2 и отсутствии загрузки другими процессами

Изменено пользователем dronT78

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на самом деле Тут еще можно посмотреть полезную инфу по шаговым двигателям....переодически добавляют что-то новое!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...