directory - STM32与A4899步进电机驱动器通讯
问题描述
我想用STM32L152RE写一个步进电机驱动器。
我想用电位器控制步进电机的位置。
由于我是新手,我不知道如何与(DIR,STEP)沟通。
有人可以给我一盏灯或告诉我一条路吗?
我正在使用A4988 - 具有转换器和过流保护的 DMOS 微步进驱动器
我尝试使用STM32 tim,但我不能。
解决方案
实际上我已经为 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,您可以很快获得这些配置。
推荐阅读
- r - 使用 2 坐标数据点订购数据框/条形图 - ggplot2
- c# - DataGrid 不在可编辑单元格上执行双击事件
- python - 如何将 lambda 函数转换为常规函数?
- python - 从嘈杂的背景中区分相似的 RGB 像素?
- java - 在hibernate中创建本机查询时如何使用查询运算符&&或@>
- snort - 如何在 Snort 中删除 acid_event?
- python - 用 Django 调用 python 函数
- javascript - 如何使用标题按钮打开抽屉 React-Native
- javascript - onchange htmlattribute 不会将模型属性传递给 js 函数
- html - 尝试插入图像时从 jQuery 中出现的对象 HTMLImageElement