STM32与A4899步进电机驱动通信

STM32 communication with A4899 stepper motor driver

我想用STM32L152RE写一个步进电机驱动器。
我想用电位器控制步进电机的位置。

因为我是新手,不知道如何与(DIR, STEP)沟通。
谁能给我一盏灯或告诉我一条路?
我正在使用 A4988 - DMOS Microstepping Driver with Translator And Overcurrent Protection

我试过用STM32的tim,不行

实际上我已经为a4988写了完整的驱动程序,它是基于irq的。但我无法揭开它。 我可以描述一条如何开始的路径。无论如何你应该有某种硬件,因为 A4988 需要额外的组件来控制电流(电阻器)和一些电容器.. 你可以试试 POLOLU HW.

如果你有某种定制板,可能会有一些缺陷..所以重新检查引脚。 特别是 ROSC 引脚,SENSE1,SENSE2 引脚,因为即使其他引脚正常,也可能导致电机无法工作。

ROSC pin为low power mode,所以这里要计算一下,如果直接忽略,一定要至少接10k的电阻。 不要让它悬空。 SENSE1、SENSE2引脚可以接0.25欧姆的电阻。你应该检查一下。

同样来自电源引脚非常决定性VREG引脚。如果我记得的话,它应该从 0 到 2000mV。实际上它控制着电机的电流。所以这取决于你的步进电机。这里也可能出现令人讨厌的缺陷。例如,您有小型步进电机,VREG 值设置过高,A4988 会吸收过多电流,您的电机会出现故障。无论如何,你应该非常准确地阅读 A4988 数据 sheet。

DIR PIN 仅用于方向,推挽引脚配置和 HIGH/LOW 值控制方向,顺时针,逆时针。

RESET INPUT PIN A4988 必须从您的 MCU 变为高电平。

启用输入引脚 A4988 必须从您的 MCU 变低。

SLEEP INPUT PIN A4988 必须从您的 MCU 变为高电平,当您的步进工作完成时控制它也非常有用,否则如果您始终保持高电平,步进电机会消耗电流并在闲置状态下发热。

还有3个MICROSTEPPING PINS,用于控制步进。 当你刚开始玩的时候,将这些引脚连接到 GND 就足够了,你将获得完整的步进 regime.If 你将控制这些引脚你可以获得其他制度,如 1/2 步进,1/4,1 /8,1/16...
而通用管脚是STEP管脚,需要用TIMER驱动,作为PWM输出,脉宽恒定,周期交替。

这里是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);

例如,我将 MCU PA9 的 STEP 输出连接到 A4988 STEP 输入。可以由定时器作为 PWM 驱动。检查您的具体 MCU 数据sheet。 首先输出脚要配置成AF,带推挽,电阻UP。 还为交替引脚设置线。

正在配置定时器:

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频率是48MHz。 您还配置了定时器将驱动 PWM 输出。
TIM1->CCR = 10;通过这个寄存器我可以控制脉冲宽度,在这个例子中是10us。

TIM1->ARR = 30; 加上ARR寄存器我可以控制周期,所以就是STEP脉冲频率等于步进电机转速。在这种情况下 30us.

如果您使用的是 HAL 和 CUBEMX,您可以很快获得这些配置。