STM32控制DRV8825驱动42BYGH34步进电机
最近想玩一下人工智能,然后买了个步进电机想玩一下,刚到了一脸懵逼,发现驱动器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_6void 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; //设置速率为50MHzGPIO_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)); //等待计数到0SysTick->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