Связь STM32 с драйвером шагового двигателя A4899 - PullRequest
0 голосов
/ 25 июня 2018

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

Поскольку я новичок,Я не знаю, как связаться с (DIR, STEP).
Может ли кто-нибудь подсказать мне или показать мне путь?
Я использую A4988 - Микрошаговый драйвер DMOS с переводчиком и защитой от перегрузки по току.

Я пытался использовать STM32 tim, но не смог.

1 Ответ

0 голосов
/ 11 июля 2018

На самом деле я написал целый драйвер для a4988, он основан на IRQ.Но я не могу раскрыть это.Я могу описать путь, как начать.В любом случае у вас должно быть какое-то оборудование, потому что A4988 нужны дополнительные компоненты для управления током (резисторы) и некоторые конденсаторы. Вы можете попробовать POLOLU HW .

Если у вас есть какие-тоКастомная доска, могут быть некоторые недостатки .. Так что перепроверьте контакты.Особенно это касается выводов ROSC, SENSE1, SENSE2 , поскольку они могут привести к тому, что двигатель не будет работать, даже если с другими выводами все в порядке.

Контакт ROSC предназначен для режима с низким энергопотреблением, поэтому здесь вы должны рассчитать, если вы просто игнорируете его, обязательно подключите по крайней мере резистор 10 кОм. Не позволяйте ему плавать. Штыри SENSE1, SENSE2 могут быть подключены к резисторам 0,25 Ом.Вы должны проверить это.

Также от выводов питания очень решающее значение VREG pin .Он должен получить от 0 до 2000 мВ, если я помню.На самом деле он контролирует ток для вашего двигателя.Так что это зависит от вашего шагового двигателя.Здесь также могут появиться неприятные недостатки.Например, у вас маленький шаговый двигатель, и вы установили слишком высокое значение VREG, чем A4988 будет потреблять слишком большой ток, и ваш двигатель будет давать сбой.В любом случае, вы должны очень точно прочитать спецификацию A4988.

DIR PIN просто для направления, конфигурации двухтактного штифта и значения HIGH / LOW управляют направлением по часовой стрелке и против часовой стрелки.

ПИН СБРОСА ВВОДА A4988 должен получить ВЫСОКИЙ от вашего MCU.

ENABLE INPUT PIN A4988 должен получить LOW от вашего MCU.

SLEEP INPUT PIN A4988 должен получить HIGH от вашего MCU, также это оченьполезно контролировать его, когда ваша шаговая работа выполнена, иначе, если вы оставите ее всегда ВЫСОКОЙ, шаговый двигатель будет потреблять ток и нагреваться в состоянии холостого хода.

Также есть 3 MICROSTEPPING PINS ,те для того, чтобы управлять степпингом.Когда вы только начинаете играть, вам будет достаточно подключить эти контакты к GND, вы получите полный режим степпинга. Если вы будете контролировать эти контакты, вы можете получить другие режимы, такие как 1/2 степпинга, 1 / 4,1 / 8, 1/16 ...
А общий вывод - это STEP , он должен управляться с помощью ТАЙМЕРА как выход ШИМ с постоянной шириной импульса и переменным периодом.

Вот пример STEP PIN управление:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
GPIO_InitTypeDef init;
init.GPIO_Mode = GPIO_Mode_AF;
init.GPIO_OType = GPIO_OType_PP;
init.GPIO_Pin = GPIO_Pin_9;
init.GPIO_PuPd = GPIO_PuPd_UP;
init.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_Init(GPIOA,&init);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_2);

например, я подключаю выход STEP от MCU PA9 к входу A4988 STEP.Который может управляться от таймера как ШИМ.Проверьте вашу конкретную таблицу данных MCU.Во-первых, выходной контакт должен быть настроен как AF, с двухтактным и резистором вверх.Также установите строку для чередующегося контакта.

Теперь настраиваем таймер:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

TIM_TimeBaseInitTypeDef timerInitStructure;
timerInitStructure.TIM_Prescaler = 48;
timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
timerInitStructure.TIM_Period = 0;
timerInitStructure.TIM_ClockDivision = 0;
timerInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &timerInitStructure);
TIM_OCInitTypeDef osc;
osc.TIM_OCMode = TIM_OCMode_PWM1;
osc.TIM_OutputState  = TIM_OutputState_Enable;
osc.TIM_OutputNState = TIM_OutputNState_Disable;
osc.TIM_Pulse = 1000;
osc.TIM_OCPolarity = TIM_OCNPolarity_High;
osc.TIM_OCNPolarity = TIM_OCNPolarity_Low;
osc.TIM_OCIdleState =TIM_OCIdleState_Reset;
osc.TIM_OCNIdleState =TIM_OCNIdleState_Set;
TIM_OC2Init(TIM1, &osc);
TIM_Cmd(TIM1, ENABLE);

Здесь я настраиваю таймер 1us, так как моя частота MCU составляет 48 МГц.Также вы настроили, что таймер будет управлять выходом ШИМ.
TIM1-> CCR = 10; с помощью этого регистра я могу контролировать ширину импульса, в данном примере это 10us.

TIM1-> ARR = 30; с регистром ARR. Я могу контролировать период, поэтому это означает, что частота импульсов STEP равна скорости шагового двигателя.В этом случае 30us.

Если вы используете HAL и CUBEMX, вы можете получить эти конфигурации довольно быстро.

...