步进电机按步驱动(pwm)
步进电机按步驱动(pwm)基础知识准备材料实操接线1.当步进电机的接线标签缺失时如何分辨AB相2.主板与驱动器连接3.代码部分重点!后记
基础知识
1.步进电机的基本知识
[CSDN]< 一文搞懂步进电机特性、原理及驱动器设计_不脱发的程序猿-CSDN博客>
2.PWM基础知识
[CSDN]< PWM原理 PWM频率与占空比详解Z小旋-CSDN博客pwm>
准备材料
1.两项步进电机
2.步进电机驱动器(pwm)ZD-M57P
3.主控板(stm32407)
实操
接线
1.当步进电机的接线标签缺失时如何分辨AB相
方法一:
当你拥有电表时:将电表掰到声响档。选取一根接到电笔一端,再用另一电笔依次连接剩余三条线,直到有声响发出。则这两条为一相,另两条为另一相。
方法二:
无电表时,选一条线。将剩余三条线依次和第一条线连接,掰电机轴。若可以掰动,则不是同一相;若需要很大力气掰动,则为同一相。
注意,只要分辨好相位就可以驱动电机,无需分辨AB,+-相
2.主板与驱动器连接
这里我选用的是时代超群的驱动器ZD-M57P
这里稍微介绍一下接线
-
V+:给驱动器供电,根据不同驱动器选不同电压
-
GND:接地
-
COM:参考电压,这里可以看驱动器说明书选择共阴或共阳
-
DIR:直连IO口,将GPIO输出拉高拉低便可以决定电机的转动方向
-
STP:接PWM输出口
-
EN:看电机和说明书选择接线与否,我这里不接
3.代码部分
重点!
假设你已能供用pwm驱动电机了,实际上这里只需要知道一个函数
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){
if(htim == &htim3)
{
}
}
pwm中断回调函数:官方是这么解释的
/**
* @brief PWM Pulse finished callback in non-blocking mode
* @param htim TIM handle
* @retval None
*/
__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(htim);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file
*/
}
其实就是每输出一个脉冲就会到这执行一下。
当然要调用这个函数之前还得将pwm中断打开
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_4);
相信很多人已经知道接下来要怎么操作了,我将我拙劣的代码展示,作为参考
int angle_pitch = 0;
int dir_pitch = 1;
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim3)
{
if(angle_pitch <10000)
{
angle_pitch++;
}
else
{
dir_pitch = -dir_pitch;
angle_pitch = 0;
}
}
}
如果是还不知道如何驱动电机的小伙伴,建议可以先参考别的博客。
如果有必要的话后续会更新。
后记
-
其实关键的部分就是那个pwm中断回调函数,在stm32hal库中有提供
-
如果是标准库,也可以用中断回调函数模拟pwm,并进行计数。有需要后续再更新
-
其实,这种计步方法还是伪计步,存在丢步的风险,但是一般来说,环境稳定情况下,还是很准的。如果有需要,可以上编码器。
P.S:最后的最后:这是本人第一次写博客,有问题请包含并指出。希望能帮助大家。