STM32 HAL 驱动器驱动步进电机(附控制+参考代码)
文章概述
stm32使用驱动器去驱动42步进电机,单片机型号为STM32F103C8T6
本文章使用的如图的云台步进电机

设备接线
接线的话我没找到合适的图片,就先看下面这张图把,这张是厂家给我的接线图,我们需要做的是用stm32替代这个西门子的PLC。

1,图中的PLC的Q0.2这个引脚替换成单片机的随便一个输出IO口,模式为OUTPUT,它所控制的是步进电机的正反转;
2,Q0.0换成单片机的PWM输出引脚,这个引脚连接的功能为:向驱动器发送脉冲,每发送一个脉冲就让步进电机转一下;

上图片解释:
上半部分表格举例解释:看第三行,如果S1 S2 S3分别是ON ON OFF,则此时驱动器驱动步进电机每200个脉冲转一圈;
下半部分:同理,只不过换成了如果S1 S2 S3分别是ON ON ON ,则此时驱动器给步进电机的平均电流为0.5A,峰值电流为0.7A

这样再看第二张图,就可以看出,我用的是1600的精度1A的驱动电流
基本配置
老样子,CUBEMX基础配置先给上,基础的定时器配置我就不交了,我给的配置如图所示,至于为什么用1280-1,后面会解释

占空比就用50%,这样的脉冲稳(其实我也没用过其他占空比的)
代码详情
首先在写代码前,需要知道一些关于操控步进电机的知识
1,步进电机驱动器有最大识别频率,一般为10khz往上
2,步进电机运动起来都会有声音,但是如果你想比较丝滑地去操控,那么频率要拉高
3,步进电机驱动频率一开始很高的情况下,电机会卡死,需要先低后高
了解上述几点后,开始编程!!
首先是初始化两个定时器,一个用于输出PWM,一个用于产生中断,可以让我们后续写逐次逼近目标频率时有时间标志位去判断
之后写一个很简单的逐次逼近的函数:three_f每过一段时间会变成1,然后PSC会变小,我的步长为64,目标PSC为64-1
void TIM_up()
{
if(three_f==1)
{
if(PSC_Presets>=PSC_Target)
{
PSC_Presets-=PSC_Target;
}
TIM3->PSC=PSC_Presets;
TIM3->ARR=ARR_Presets;
TIM3->CCR1=CCR1_Presets;
TIM3->CCR2=CCR2_Presets;
three_f=0;
}
}
控制逻辑与使用方法
其实通过驱动器去控制步进电机非常简单,只需要你会输出一个pwm,和输出一个电平控制正反转就行,所以博主写了一个交互软件
使用环境win11,python3.13
使用方法:通过USB转TTL连接到你单片机的USART1,然后点击连接会出现握手信息,握手成功后可以通过键盘的上下左右或者鼠标点击箭头来向单片机发送数据以此来控制单片机驱动步进电机的转动。
获取方式:qq群1079267694
浙公网安备 33010602011771号