STM32控制DRV8825驱动42BYGH34步进电机

发布于:2025-04-21 ⋅ 阅读:(46) ⋅ 点赞:(0)

最近想玩一下人工智能,然后买了个步进电机想玩一下,刚到了一脸懵逼,发现驱动器20多块,有点超预算,然后整了个驱动板,方便自己画线路板,经过各种搜索,终于转起来了,记录一下,下次方便自己回想

DRV8825简介

在这里插入图片描述
1:引脚定义
在这里插入图片描述
DIR : 控制电机正反转,高:正转 低:反转(还和接线有关,就是切换转的方向)
STP : 接受脉冲,驱动电机转动,脉冲速度越快,转动速度越快,接STM32的发送脉冲的引脚
SLP : 控制驱动器进入睡眠模式,低电平睡眠,高电平唤醒,不需要睡眠的话接STM32的3.3V
RST : 重置引脚,复位驱动器,低电平复位,高电平正常,接3.3V
M2,M1,M0 微步设置,设置分辨率,分辨率如下,通过对应的引脚设定高低电平来设定对应的分辨率,例如我的步进电机 步距角是1.8°,转一圈360°就是需要200次, 然后分辨率设定为1/32步(M2/M1/M0设定高/高/高)那么就是需要收到32次脉冲转1.8°,转一圈需要收到6400次脉冲
在这里插入图片描述
EN : 使能引脚,用于启用驱动器,低电平启用,所以设定为低电平(GND)就可以了
GND 接地
FLT : 不用接,出现故障后会进入休眠模式
2A/1A/1B/2B : 接步进电机的引脚,接法按照图片从上到下,A+/A-/B-/B+,B+/B-/A-/A+,A-/A+/B+/B-,B-/B+/A+/A-,我的理解就是上面两个都是A或者都是B,中间的两个正负要一样,下面的俩就是剩下的(个人总结,仅供参考)

GND 接地,我把外接电源的负极接到这里了
VMOT : 外部电源接口,8.2V至45V都行,电流尽量大一点的

步进电机

在这里插入图片描述
没啥说的,就是四根线

STM32代码
我的接线
在这里插入图片描述
其中PB10和PB11我分别接STM32的A6和A7

#include "stm32f10x.h"                  // Device header

#define STEP_GPIO_PORT   GPIOA                       
#define STEP_GPIO_PIN    GPIO_Pin_7              

#define DIR_GPIO_PORT    GPIOA                       
#define DIR_GPIO_PIN     GPIO_Pin_6

void Motor_GPIO_Init(void)
{               
      //定义一个GPIO_InitTypeDef类型的结构体
      GPIO_InitTypeDef GPIO_InitStructure;
      //开启驱动板上引脚相关的GPIO外设时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

      GPIO_InitStructure.GPIO_Pin = DIR_GPIO_PIN | STEP_GPIO_PIN;          //选择要控制的GPIO引脚
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //设置引脚模式为推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //设置速率为50MHz
      GPIO_Init(DIR_GPIO_PORT, &GPIO_InitStructure);       //调用库函数,初始化GPIO              

}

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Sleep_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

//步进电机驱动函数
//num:旋转一圈的电平次数
//sleepTime:一个脉冲的时间
void Rotate_Once(int num,int sleepTime)
{
    for(;num>0;num--)
    {
        GPIO_SetBits(STEP_GPIO_PORT, STEP_GPIO_PIN);
        Sleep_us(sleepTime/2);
        GPIO_ResetBits(STEP_GPIO_PORT, STEP_GPIO_PIN);
        Sleep_us(sleepTime/2);
    }
}


int main(void)
{
    Motor_GPIO_Init();
 
    while(1)
    {
        GPIO_SetBits(DIR_GPIO_PORT, DIR_GPIO_PIN);
        Rotate_Once(6400,1000);//正转一圈
        GPIO_ResetBits(DIR_GPIO_PORT, DIR_GPIO_PIN);
        Rotate_Once(6400,1000);//反转一圈
    }   
}

出现的问题

发现烧录进去代码,然后步进电机哒哒响,但是不转
1:可能一个脉冲的时间太久,建议第一次调快点,放个胶带方便看
2:电流限位器需要调整,慢慢拧,直到驱动电机正常旋转

接线照片和视频

在这里插入图片描述
在这里插入图片描述

步进电机运行

借鉴的文章

https://blog.csdn.net/qq_42250136/article/details/140999996

https://blog.csdn.net/weixin_39966909/article/details/112454121


网站公告

今日签到

点亮在社区的每一天
去签到