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

Directory STM32与A4899步进电机驱动器的通信,directory,stm32,pwm,Directory,Stm32,Pwm,我想写一个步进电机驱动程序,带有。 我想用电位计控制步进电机的位置 由于我是新手,我不知道如何与(DIR,STEP)沟通。 有人能给我点灯或给我指路吗? 我用的是一个 我尝试使用STM32 tim,但我不能。实际上我已经为a4988编写了整个驱动程序,它是基于irq的。但我无法揭开它。 我可以描述如何开始的路径。无论如何,你应该有一些硬件,因为A4988需要额外的电流控制元件(电阻器)和一些电容器。。 你可以试试 如果你有某种定制板,可能会有一些缺陷。。因此,重新检查销。 尤其是ROSC引脚,传

我想写一个步进电机驱动程序,带有。
我想用电位计控制步进电机的位置

由于我是新手,我不知道如何与(DIR,STEP)沟通。
有人能给我点灯或给我指路吗?
我用的是一个


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

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

如果你有某种定制板,可能会有一些缺陷。。因此,重新检查销。 尤其是ROSC引脚,传感器1、传感器2引脚,因为这些引脚可能导致电机无法工作,即使其他引脚正常

ROSC引脚用于低功率模式,所以这里您应该计算,如果忽略它,请确保至少连接到10k电阻器不要让它浮动。SENSE1、SENSE2引脚可以连接到0.25omh电阻器。你应该检查一下

同样来自电源插脚非常决定性VREG插脚。如果我记得的话,应该是0到2000mV。实际上,它控制着你的马达的电流。所以这取决于你的步进电机。这里也可能出现令人讨厌的缺陷。例如,您的步进电机很小,并且设置的VREG值高于A4988将导致电流过大,您的电机将出现故障。无论如何,您应该非常准确地阅读4988数据表

DIR引脚仅用于方向、推拉引脚配置,高/低值控制方向、时钟方向和反时钟方向

重置输入引脚A4988必须从MCU获得高电平

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

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

还有3个微步进引脚,用于控制步进。 当您刚开始玩游戏时,将这些管脚连接到GND就足够了,您将获得完整的步进模式。如果您控制这些管脚,您可以获得其他模式,如1/2步进、1/4、1/8、1/16…
一般引脚为步进引脚,采用定时器驱动,作为脉宽调制输出,脉冲宽度恒定,周期恒定

以下是步进销控制的示例:

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的阶跃输出连接到A4988阶跃输入。可由定时器以PWM方式驱动。检查具体的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);
这里我配置1U定时器,因为我的MCU频率是48MHz。 您还配置了定时器驱动PWM输出。
TIM1->CCR=10使用该寄存器,我可以控制脉冲宽度,在本例中为10us

TIM1->ARR=30通过ARR寄存器,我可以控制周期,因此这意味着步进脉冲频率等于步进电机速度。在这种情况下是30美元

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