Пытаюсь управлять шаговым двигателем 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) двигатель перестаёт крутиться (дёргается на месте).
В чём может быть проблема? У меня ошибка в алгоритме переключения обмоток? Или проблема может быть лишь в силовой части схемы?