stm32+drv8825驱动42步进电机

关于drv8825的介绍,以及如何调节vref电压值请看博主上篇文章,有详细介绍http://t.csdn.cn/NpGIc

接线图

步进电机接线图

起初我也为如何接线烦恼,因为有些博客在讲述这些问题的时候没有讲的很透彻。
方法如下:

①用万用表调到欧姆档,用其中一个表笔搭在一个引脚上,依次测其它几个引脚当你发现有两个引脚的电阻值非常相近时,那两个引脚就为其中一组(A和~A,
B和~B),而你那个用表笔固定的那个引脚就是COM端(A还是B要看情况);
那么问题就来了,我不知道是什么原因,我测试的时候没有两个电阻值相近的两个引脚。

我的个人解决措施为:用短路的测试方法,当两个引脚导通时,我就确定它们两个引脚为其中一组,这样我就确定了A组和B组,这样的线序和淘宝给的资料图上的线序相同。

42步进电机转速范围

1、步进电机是适合应用在低速场合的,每分钟的转速不超过1000转,也就是说0.9度时6666PPS,最高转速大概就是1000-3000PPS(0.9度)之间这样的是最好的。

2、一般情况下,步进电机最佳的工作速度范围是90~900rpm,低速场合当然会更适合步进电机,因为规格会更符合步进电机的运行。

3、42步进电机的驱动电压一般是DC24V,42步进电机在2700rpm其实也是可以跑的,就是力矩比较小, 意思就是转数越大,力矩就越小。

简单的步进电机驱代码分析

main.c

#include "stm32f10x.h"
#include "delay.h" 
#include "bsp_stepper.h"
/************************************************
 ALIENTEK 精英STM32F103开发板实验0
 工程模板
 注意,这是手册中的新建工程章节使用的main文件 
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/


/*步进电机驱动函数*/
//void stepper(int num,int half_T)
//{
//	for(;num>0;num--)
//	{
//		STEP_HIGH;
//		Delay(half_T);
//		STEP_LOW;
//		Delay(half_T);
//	}
//}

int main(void)
{                                                                                                                   
	
	
	Stepper_GPIO_Config();
	delay_init();

	// GPIO_SetBits(GPIOB,GPIO_Pin_6);
  // GPIO_ResetBits(GPIOB, GPIO_Pin_7);
	
  while(1)
	{  uint32_t i,j;
		
		GPIO_ResetBits(DIR_GPIO_PORT ,DIR_GPIO_PIN);//正转
		
	  for(i=0;i<6400;i++)  //一个脉冲1.8度,全步下一圈要200个脉冲;这里是32细分
		{
			GPIO_SetBits(STEP_GPIO_PORT,STEP_GPIO_PIN);  //42步进电机脉冲频率最好在500us-1ms之间,要不然会很抖
			delay_us(600);
			GPIO_ResetBits(STEP_GPIO_PORT, STEP_GPIO_PIN);
			delay_us(600);
	
		}
	 	 delay_ms(1000);
		
		GPIO_SetBits(DIR_GPIO_PORT ,DIR_GPIO_PIN);//反转
		
		for(j=0;j<6400;j++)
		{
			GPIO_SetBits(STEP_GPIO_PORT,STEP_GPIO_PIN);
			delay_us(600);
			GPIO_ResetBits(STEP_GPIO_PORT, STEP_GPIO_PIN);
			delay_us(600);
		}
		
		delay_ms(1000);
	}
	
}

stepp.c

#include "bsp_stepper.h"


void Stepper_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_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //设置引脚模式为推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //设置速率为50MHz	
		GPIO_Init(STEP_GPIO_PORT, &GPIO_InitStructure);
    GPIO_ResetBits(STEP_GPIO_PORT, STEP_GPIO_PIN);
}

发现问题:在实验中发现出现抖动情况,以为是细分的事;其实是脉冲频率的问题,脉冲频率太低,导致电磁铁转动卡顿,出现共振抖动现象。

代码链接:浏览器打开

https://wwf.lanzouv.com/iYBjt0f5dmyf

STM32F103C8T6上使用STM32CubeMX生成的标准库编写驱动42步进电机DRV8825)的代码示例,并假设已经包含了必要的头文件。这里是一个基本框架,由于实际硬件连接和初始化步骤会因设备而异,所以我会提供核心部分的代码结构: ```c // 导入必要的头文件 #include "stm32f10x.h" // STM32基础头文件 #include "tim.h" // 时间定时器相关头文件 #include "drv8825.h" // 驱动8825步进电机的库 // 定义宏,用于步进电机引脚配置 #define STEP_PIN_GPIO GPIOB // 步进电机信号线GPIO端口 #define STEP_PIN_DDR GPIO_MODER // 数据方向寄存器 #define STEP_PIN_MSK GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 // 设置需要的引脚位 // 初始化函数 void drv8825_init(void) { // 硬件复位 __HAL_RCC_TIM1_CLK_ENABLE(); // 启动TIM1时钟 TIM_TimeBaseInitTypeDef timConfig = {0}; timConfig.Prescaler = 200 - 1; // 根据电机步数设置适当的预分频值 timConfig.CounterMode = TIM_COUNTERMODE_UP; timConfig.Period = 1000 / 42; // 分配合理的定时周期 HAL_TIM_TimeBaseInit(&htim1, &timConfig); // 初始化计时器 HAL_TIM_EnableCounter(&htim1); // 开启计数器 // 步进电机引脚配置 STEP_PIN_DDR |= STEP_PIN_MSK; // 设置为推挽输出模式 GPIO_InitTypeDef gpioConfig; gpioConfig.Pin = STEP_PIN_MSK; gpioConfig.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽 gpioConfig.Pull = GPIO_NOPULL; // 推挽输出无下拉电阻 HAL_GPIO_Init(STEP_PIN_GPIO, &gpioConfig); } // 步进电机移动函数 void step_motor_move(int steps, bool direction) { for (int i = 0; i < steps; ++i) { if (direction) { // 正向 HAL_GPIO_WritePin(STEP_PIN_GPIO, STEP_PIN_MSK); // 输出高电平,前进一步 } else { // 反向 HAL_GPIO_WritePin(STEP_PIN_GPIO, ~STEP_PIN_MSK); // 输出低电平,后退一步 } __HAL_DELAY(1000 / TIM1_prescaler); // 指定时间间隔等待下一次操作 } HAL_GPIO_WritePin(STEP_PIN_GPIO, GPIO_Pin_RESET); // 移动完成后归零 } int main(void) { // 初始化硬件和步进电机 drv8825_init(); // 示例:向前移动42步 step_motor_move(42, true); while (1) {} // 无限循环,此处仅作演示,实际应用中应有相应处理 //
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值