STM32F103C8T6驱动DRV8825两相步进电机

模块简介

DRV8825特色有以下几点:
1、适合驱动8.2V~45V 2.5A以下的步进电机;
2、只有简单的步进和方向控制接口;
3、六个不同的步进模式:全、半、1/4、 1/8、 1/16、1/32;
4、可调电位器可以调节电流输出,从而获得更高的步进率;
5、自动电流衰减模式检测/选择;
6、过热关闭电路、欠压锁定、交叉电流保护;
7、接地短路保护和加载短路保护。

在这里插入图片描述

引脚说明

模块总共引出16个引脚,实际如果不从单片机程控细分的话,真正需要单片机去控制的就是电机的方向和输入脉冲信号。(即程序只控制了DIR和STP引脚)
DIR:控制电机转动的方向
STEP:给步进电机提供脉冲的
SLP:睡眠控制,低电平进入睡眠模式
RST:复位引脚,使用时需要拉高
M0,M1,M2:3个引脚通过高低电平设置去控制细分,即控制电机的步距角(比如这里使用的是2相4线步进电机,步距角为1.8°,那进行32细分的话就是每个脉冲1.8/32=0.05625°去行进)
EN:这里要注意下,模块上虽然丝印是EN,但是这里是低电平使能!!!
VMOT,GND:这两个相邻的引脚就是单独接另外的电源给步进电机供电的,另一个GND是用来连接单片机的地。具体可以查看下图接线图
1A,2A,1B,2B:步进电机的两个相位,1A接A+,2A接A-;1B接B+,2B接B-
这里接相位需要注意:2个相位A相和B相接反了就会旋转的方向不同,可能本来设计顺时针旋转的但是逆时针旋转了。
在这里插入图片描述

实际接线图

实际接线也不难,主要这里的开发板没有拓展太多的3.3V接口,所以用了面包板来进行拓展3.3V的接线,电机的需要自己确认好自己的步进电机的相位以及相位的正负。(判断同相位:一般同相位的两条线接在一起会感觉到有明显阻力)
在这里插入图片描述

代码说明

主函数:控制步进电机顺时针转一圈后逆时针转一圈,注意Step()函数第一个值选择6400是因为使用的步进电机步距角是1.8度的,所以转完一圈正常应该是需要360°/1.8°=200个脉冲,但是进行了32细分,所以需要32X200=6400个脉冲才可以转完一圈,第二个数值影响的是电机的速度。(这里的数值是供测试使用,如果是使用于实际电路需要自行计算好对应的脉冲数以及周期)

int main(void)
{
    int Half_T = 6000;
    Step_GPIO_Config();
 
    while(1)
    {
        GPIO_SetBits(DIR_GPIO_PORT, DIR_GPIO_PIN);
        Step(6400,5000);//第二个值越小,转越快,值建议是150以上
        GPIO_ResetBits(DIR_GPIO_PORT, DIR_GPIO_PIN);
        Step(6400,5000);//第二个值越小,转越快,值建议是150以上
    }               
}


步进电机驱动函数

//STEP_PB11
#define STEP_GPIO_PORT   GPIOB                       
#define STEP_GPIO_PIN    GPIO_Pin_11              
//DIR_PB10
#define DIR_GPIO_PORT    GPIOB                       
#define DIR_GPIO_PIN     GPIO_Pin_10
void Step_GPIO_Config(void)
{               
      //定义一个GPIO_InitTypeDef类型的结构体
      GPIO_InitTypeDef GPIO_InitStructure;
      //开启驱动板上引脚相关的GPIO外设时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
      //配置DIR
      GPIO_InitStructure.GPIO_Pin = DIR_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              
      //配置STEP端口
      GPIO_InitStructure.GPIO_Pin = STEP_GPIO_PIN;               
      GPIO_Init(STEP_GPIO_PORT, &GPIO_InitStructure);
}
//步进电机驱动函数
void Step(int num,int Half_T)
{
    for(;num>0;num--)
    {
        GPIO_SetBits(STEP_GPIO_PORT, STEP_GPIO_PIN);
        Delay(Half_T);
        GPIO_ResetBits(STEP_GPIO_PORT, STEP_GPIO_PIN);
        Delay(Half_T);
    }
}

测试现象

在这里插入图片描述
在这里插入图片描述
图片太大了这里就分段展示出来了。

常见问题

  • 上电并且烧录代码后,发现电机只是再震动不转动,这种情况下需要去调节模块的电位器,作用是调节驱动步进电机的电流。

    在这里插入图片描述

  • 电流怎么调节都没有用情况一:电位器调节太快。调节电位器时不要很快速的拧过去,要慢慢的进行调节去找最合适的电流。

  • 电流怎么调节都没有用情况二:电机相位接错。看自己购买的电机提供的接线和引脚说明接好。

需要整个工程的可以在评论区留言邮箱哦!

评论 74
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值