首页 > 解决方案 > STM32与A4899步进电机驱动器通讯

问题描述

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

由于我是新手,我不知道如何与(DIR,STEP)沟通。
有人可以给我一盏灯或告诉我一条路吗?
我正在使用A4988 - 具有转换器和过流保护的 DMOS 微步进驱动器

我尝试使用STM32 tim,但我不能。

标签: directorystm32pwm

解决方案


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

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

ROSC管脚是低功耗模式的,所以这里你应该计算一下,如果你忽略它,一定要连接至少10k的电阻。不要让它漂浮。SENSE1、SENSE2 引脚可连接 0.25omh 电阻。你应该检查一下。

另外从电源管脚VREG管脚就很果断了。如果我记得的话,它应该从 0 到 2000mV。实际上它控制电机的电流。所以这取决于你的步进电机。这里也可能出现讨厌的缺陷。例如,您的步进电机很小,并且将 VREG 值设置得太高,比 A4988 会吸收太多电流,您的电机会出现故障。无论如何,您应该非常准确地阅读 A4988 数据表。

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

复位输入引脚A4988 必须从您的 MCU 变为高电平。

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

睡眠输入引脚A4988 必须从您的 MCU 获得高电平,当您的步进工作完成时控制它非常有用,否则如果您始终保持高电平,步进电机将消耗电流并在空闲状态下发热。

还有 3 个MICROSTEPPING 引脚,用于控制步进。当您刚开始演奏时,将这些引脚连接到 GND 就足够了,您将获得完整的步进机制。如果您控制这些引脚,您可以获得其他机制,例如 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 数据表。首先输出脚配置为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,您可以很快获得这些配置。


推荐阅读