与A4899步进电机驱动器进行STM32通信

时间:2018-06-25 17:52:50

标签: directory stm32 pwm

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

由于我是新手,所以我不知道如何与(DIR,STEP)进行通信。
有人可以给我点灯或给我个方法吗?
我正在使用A4988 - DMOS Microstepping Driver with Translator And Overcurrent Protection

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

1 个答案:

答案 0 :(得分:1)

实际上,我已经为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变为高电平。

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

睡眠输入PIN :A4988必须从您的MCU变为高电平,这在步进工作完成时对其进行控制非常有用,否则,如果将其始终保持为高电平,则步进电机会消耗电流并且会在空闲状态下加热。

还有3个微步针,用于控制步进。 刚开始玩时,将这些引脚连接到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);

例如,我将STEP输出从MCU PA9连接到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寄存器I可以控制周期,因此它意味着STEP脉冲频率等于步进电动机的速度。在这种情况下为30us。

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