LINUX.ORG.RU

Управление шаговым двигателем

 , шаговый двигатель


0

2

Пытаюсь управлять шаговым двигателем FL57STH76-2804A. Для этого изготовил следующую схему управления - один конец каждой обмотки (A- и B-) подключен к средней точке питания (в настоящий момент биполярного БП у меня нет, поэтому используется конденсаторная средняя точка с резисторным делителем напряжения для защиты от уплывания средней точки). Второй конец каждой обмотки (A+ и B+) подключен к полумосту на двух IRFZ48N. Управляет каждым полумостом драйвер IR2104 (резисторы на затворах 10 ом). Драйвера же полумостов управляются с микроконтроллера STM32F103. Параллельно каждой обмотке шагового двигателя установлен конденсатор 330 нФ. Частота ШИМ 30 кГц. Питаю от БП 12В, то есть на обмотки реально идёт +-6В. Проверял осциллографом - просадки на средней точке во время работы не превышают +-200мВ.

Я успешно запустил шаговый двигатель как в полношаговом, так и в микрошаговом режиме, однако при вращении присутствует определённая неравномерность и вибрации. Хотелось бы от них избавиться.

Вот алгоритм управления двигателем:

static const int16_t sinTable[256] = {
   0, 6, 12, 18, 24, 31, 37, 43, 49, 55, 61, 68, 74, 79, 85, 91,
   97, 103, 109, 114, 120, 125, 131, 136, 141, 146, 151, 156, 161, 166, 171, 175,
   180, 184, 188, 193, 197, 201, 204, 208, 212, 215, 218, 221, 224, 227, 230, 233,
   235, 237, 240, 242, 244, 245, 247, 248, 250, 251, 252, 253, 253, 254, 254, 254,
   255, 254, 254, 254, 253, 253, 252, 251, 250, 248, 247, 245, 244, 242, 240, 237,
   235, 233, 230, 227, 224, 221, 218, 215, 212, 208, 204, 201, 197, 193, 188, 184,
   180, 175, 171, 166, 161, 156, 151, 146, 141, 136, 131, 125, 120, 114, 109, 103,
   97, 91, 85, 79, 74, 68, 61, 55, 49, 43, 37, 31, 24, 18, 12, 6,
   0, -6, -12, -18, -24, -31, -37, -43, -49, -55, -61, -68, -74, -79, -85, -91,
   -97, -103, -109, -114, -120, -125, -131, -136, -141, -146, -151, -156, -161, -166, -171, -175,
   -180, -184, -188, -193, -197, -201, -204, -208, -212, -215, -218, -221, -224, -227, -230, -233,
   -235, -237, -240, -242, -244, -245, -247, -248, -250, -251, -252, -253, -253, -254, -254, -254,
   -255, -254, -254, -254, -253, -253, -252, -251, -250, -248, -247, -245, -244, -242, -240, -237,
   -235, -233, -230, -227, -224, -221, -218, -215, -212, -208, -204, -201, -197, -193, -188, -184,
   -180, -175, -171, -166, -161, -156, -151, -146, -141, -136, -131, -125, -120, -114, -109, -103,
   -97, -91, -85, -79, -74, -68, -61, -55, -49, -43, -37, -31, -24, -18, -12, -6
};

void setStepperState(int curStep) {
   static const uint16_t microstepCount = sizeof(sinTable) / sizeof(sinTable[0]);
   uint16_t curMicrostep = curStep % microstepCount;
   int16_t phaseA = sinTable[curMicrostep];
   int16_t phaseB = -sinTable[(curMicrostep + 64) % microstepCount];
   uint32_t polarityA = (phaseA < 0) ? PAL_HIGH : PAL_LOW;
   uint32_t polarityB = (phaseB < 0) ? PAL_HIGH : PAL_LOW;
   palWritePad(GPIOB, 1, polarityA); // INA
   pwmEnableChannel(&PWMD3, 0, abs(phaseA)); // ENA
   palWritePad(GPIOB, 10, polarityB); // INB
   pwmEnableChannel(&PWMD3, 1, abs(phaseB)); // ENB
}

...

while (1) {
   for (int i = 0; i < 65536; i++) {
      setStepperState(i);
      chSysPolledDelayX(US2RTC(STM32_SYSCLK, 200));
   }
}

По идее ШИМ на обмотках при шагах должен изменяться следующим образом - http://i.imgur.com/kCMfHQP.png.

При низких скоростях, если режим не полношаговый (достигается умножением i на 64 при вызове setStepperState) двигатель перестаёт крутиться (дёргается на месте).

В чём может быть проблема? У меня ошибка в алгоритме переключения обмоток? Или проблема может быть лишь в силовой части схемы?

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)

Вибрации могу быть, поскольку двигатель находится в колебательной системе.

JN
()
Ответ на: комментарий от JN

В настоящий момент двигатель запущен без нагрузки.

KivApple ★★★★★
() автор топика

используется конденсаторная средняя точка с резисторным делителем напряжения

Лучше сделать так.

при вращении присутствует определённая неравномерность

А поподробнее? Неравномерность циклическая или случайная? Циклическую неравномерность можно компенсировать программными предискажениями данных.

и вибрации.

Кто-ж его посадит успокоит, он же шаговый! :)

quickquest ★★★★★
()

Да всё что угодно может быть, бутстрепный IR2104, ты вот прям хорошо понимаешь что в нем происходит?

ilovewindows ★★★★★
()
Ответ на: комментарий от quickquest

А поподробнее? Неравномерность циклическая или случайная?

Я, наверное, неправильно выразился. Крутится он более-менее равномерно. А вот значительные вибрации присутствуют (вплоть до того, что шаговик уверенно ползёт по столу).

И, насколько я понимаю, одно из преимуществ микрошагового режима - как раз значительное уменьшение вибраций, которого в моём случае не происходит. Значит я что-то делаю не так.

Кстати, вот что показывает мой осциллограф:

http://i.imgur.com/qip542n.png - полношаговый режим. Интервал между шагами 10 мс.

http://i.imgur.com/taEfYhv.png - то же самое, но после небольшой обработки (добавил предполагаемые значения управляющих сигналов).

http://i.imgur.com/jYJuh27.png - микрошаговый режим. Интервал между результирующими полными шагами так же 10 мс.

http://i.imgur.com/pjAefFt.png - то же самое, но после небольшой обработки (не уверен, что правильно в этот раз дорисовал управляющие сигналы).

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

Лучше сделать так.

И будет греться эта штука как печка (и даже сильнее - максимальный ток шаговика 2.8 ампера, так что придётся брать транзисторы покруче). Если уж делать по-нормальному, то импульсный преобразователь.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от ilovewindows

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

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

Однако на высоких оборотах (когда конденсаторы разряжаются более-менее равномерно и, как я уже сказал, колебания средней точки не превышают +-200 мВ) проблем быть не должно (точнее не больше, чем у других людей, который используют IR2104 для управления шаговыми двигателями).

Кстати, выложил данные с осциллографа - Управление шаговым двигателем (комментарий).

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от ilovewindows

А вот, кстати, схема силовой части драйвера: http://i.imgur.com/YeoblN8.png.

На ней отсутствуют (но в реальности имеются) диоды, защищающие от противо-ЭДС, а также диоды, включенные параллельно с затворными резисторами для ускорения закрытия транзистора.

KivApple ★★★★★
() автор топика

Тебе как бы ток в обмотках нужен синусоидальный, а не напряжение. С ШИМом и индуктивностью обмоток, да ещё и с ёмкостями у тебя там чёрти-что, а не нужный ток. Резюки в полОма поставь последовательно с обмотками и посмотри что происходит.

Неспроста практически все микрухи драйверов для ШД таки ток измеряют в обмотках и уже от него пляшут.

Вообще, на самом деле, тебе нужен регулируемый источник тока через обмотку. Его, конечно, можно сделать используя ШИМ stm32, но это не так уж тривиально. И да, мосты нужны настоящие, а не вот эта порнография с конденсаторами. И, кстати, для нормального моста не нужен биполярный источник, а нужно всего лишь пару транзисторов с драйвером в схему докинуть.

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

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Именно поэтому я пару дней назад заказал на AliExpress модули датчиков тока ACS712. Буду в конце каждого периода ШИМ смотреть на текущий ток (благо STM32 имеет достаточно быстрый АЦП, к тому же с поддержкой DMA) и предпринимать какие-то действия.

Но пока как временное решение - возможно ли откалибровать кривую изменения ШИМ (сейчас это банальный синус), чтобы вибрации стали значительно меньше?

Я, кстати, убедился сейчас, что соврал немного. Использование микрошага значительно снижает вибрации по сравнению с полношаговым, но далеко не до нуля.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Но пока как временное решение - возможно ли откалибровать кривую изменения ШИМ (сейчас это банальный синус), чтобы вибрации стали значительно меньше?

Разумеется возможно. Если частота ШИМ не меняется, БП стабилизирован и двигло одно и то же, то можно подобрать такие значения напряжения которые будут давать синусоидальный ток. Вопрос только в геморрое. :)

В принципе можно приклеить на ось зеркало, светить туда лазером, где-нибудь в паре метров нарисовать шкалу (сколько он там - 200 шагов на оборот? 1.8 градуса шаг?) чтоб один шаг равномерно разбить на нужное количество микрошагов, ну и вперёд - подбирать напряжение для каждого микрошага, чтобы точно в метку попадать. Думаю за день можно управится. Другое дело, что такой костыль неуниверсален.

Кстати, частоту ШИМ имеет смысл снизить. Вряд-ли на 30кГц с такой индуктивностью обмоток у тебя успевает ток вырасти до нужного значения. Попробуй 15кГц - может получше будет.

ЗЫ: Кстати, с специальнозаточенными под ШД драйверами вибрации нет, зато бывает аццкий писк. :) Индуктивность обмоток большая, высокую частоту ШИМ не сделаешь - не пролезет через обмотку. :)

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Вот поэтому я и зафигачил туда конденсатор параллельно обмотке. Чтобы высокая частота интегрировалась. Проверял в протеусе (обмотку представил как последовательные индуктивность и резистор). При данных параметрах движка, конденсаторе 330 нФ и частоте ШИМ 30 кГц ток в обмотке вполне нормально регулируется (пробовал разные коэффициенты заполнения). Да, нелинейная зависимость там, но регулировать реально.

Возникла идея, как применить датчики тока, когда они придут.

https://pp.vk.me/c633829/v633829975/23c0b/zHFi1TzJTME.jpg

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

«Инверсия тока» - сюда надо подать 1, если мы хотим ограничить отрицательный, а не положительный ток (датчик тока выдаёт 2.5В в нуле, при отрицательном токе напряжение уменьшается, при положительном растёт). 30 кГц - просто 30 кГц откуда-нибудь (по сути это будет частота результирующего ШИМ). Скажем, ШИМ от МК с минимальным коэффициентом заполнения. Ну а выход схемы уже идёт на вход Enable драйвера.

По сути дела что-то подобное находится внутри микросхемы драйвера DRV8825, если верить даташиту.

К счастью, вся логика и компараторы как минимум сдвоенные, да и стоит, несмотря на скорость (я подобрал компоненты, которые дадут задержку порядка 1.5 мкс, притом большую часть задержки даёт датчик тока, время срабатывания отсечки DRV8825 - 4 мкс), не дорого.

Спасибо за совет по калибровке двигателя.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.