DRV8825驱动42步进电机

一、驱动设置
DRV8825:

引脚设置: 

SLEEP高电平为正常能耗模式,而RESET默认为高电平,将它们连接起来就行。EN使能引脚默认为低电平,低电平为工作状态。DIR是方向控制引脚,低电平顺时针,高电平相反。STEP是脉冲输入引脚,pwm从此引脚输入。

FAULT和下面的GND要接单片机(如果是电路设计,记得让它和单片机供地,否则转速和力矩不匹配)。

B2B1A2A1为42步进电机AB相输入(AB相区分方法:方法一:万用表打到测通断挡位,两条相通的就是同相;方法二:万用表打到20欧姆档,哪两根线有显示电阻就为同相,电阻太大的电机有可能是损坏的)。

VMOT和GND的电源输入之间一定要加100uf的电解电容。 

调节电流 :通过拧动表面的十字螺丝来调节大小,顺时针增大好像是。

A4988和DRV8825的参数设置是一样的,不过需要注意的的是,A4988的AB相线序和DRV8825不一样。 

TB6600驱动器 :

共阳极接法:

(TB6600驱动器的ENA+、DIR+、PUL+与单片机的VCC连接) 

DIR-连接单片机控制方向、PUL-连接单片机PWM输出引脚、 ENA-控制使能(可以悬空,就一直转)

共阴极接法: 

(TB6600驱动器的ENA-、DIR-、PUL-与单片机的GND连接) 

DIR+连接单片机控制方向、PUL+连接单片机PWM输出引脚、 ENA+控制使能

VCC和GND: 

连接9-40v直流电源,这个GND要和单片机共地!如果驱动放反了,有可能烧单片机(我的单片机就烧了。。)。

这个驱动器一上电步进电机就会拧不动的,如果能不费力拧动,那么要检查电源线是不是连接好,AB相有没有连接对。 

二、细分设置 
DRRV8825: 

M0、M1、M2 对应下面的MODE0、1、2

全步进即200步(200个脉冲)转一圈,一步为360/200= 1.8°。

TB6600:

看背面的表格去拨开关就行。 

 三、PWM输入

主要是PSC和ARR的设置

我用的是stm32f103rct6单片机,则:

72MHz/((arr+1)*(psc+1))=PWM频率,注意,arr和psc的数值不大于65535。

如500hz,可以设置为arr=200,psc720。

pwm.c 

#include "./BSP/TIMER/pwm.h"

TIM_HandleTypeDef g_timx_pwm_chy_handle;     /* 定时器x句柄 */

/**
 * @brief       通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1)
 * @note
 *              通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
 *              通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz
 *              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
 *              Ft=定时器工作频率,单位:Mhz
 *
 * @param       arr: 自动重装值。
 * @param       psc: 时钟预分频数
 * @retval      无
 */
void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)
{
    TIM_OC_InitTypeDef timx_oc_pwm_chy  = {0};                          /* 定时器PWM输出配置 */

    g_timx_pwm_chy_handle.Instance = GTIM_TIMX_PWM;                     /* 定时器 */
    g_timx_pwm_chy_handle.Init.Prescaler = psc;                         /* 定时器分频 */
    g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;        /* 递增计数模式 */
    g_timx_pwm_chy_handle.Init.Period = arr;                            /* 自动重装载值 */
    HAL_TIM_PWM_Init(&g_timx_pwm_chy_handle);                           /* 初始化PWM */

    timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;                           /* 模式选择PWM1 */
    timx_oc_pwm_chy.Pulse = (arr+1)*0.5;                                    /* 设置比较值,此值用来确定占空比 */
                                                                        /* 这里默认设置比较值为自动重装载值的一半,即占空比为50% */
    timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW;                    /* 输出比较极性为低 */
    HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle, &timx_oc_pwm_chy, GTIM_TIMX_PWM_CHY); /* 配置TIMx通道y */
    HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, GTIM_TIMX_PWM_CHY);       /* 开启对应PWM通道 */
              
}

/**
 * @brief       定时器底层驱动,时钟使能,引脚配置
                此函数会被HAL_TIM_PWM_Init()调用
 * @param       htim:定时器句柄
 * @retval      无
 */
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == GTIM_TIMX_PWM)
    {
        GPIO_InitTypeDef gpio_init_struct;
        GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE();               /* 开启通道y的CPIO时钟 */
        GTIM_TIMX_PWM_CHY_CLK_ENABLE();

        gpio_init_struct.Pin = GTIM_TIMX_PWM_CHY_GPIO_PIN; /* 通道y的CPIO口 */
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;           /* 复用推挽输出 */
        gpio_init_struct.Pull = GPIO_PULLUP;               /* 上拉 */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;     /* 高速 */
        HAL_GPIO_Init(GTIM_TIMX_PWM_CHY_GPIO_PORT, &gpio_init_struct);	
    }
}

pwm.h 

#ifndef __PWM_H
#define __PWM_H

#include "./SYSTEM/sys/sys.h"

#define GTIM_TIMX_PWM_CHY_GPIO_PORT         GPIOA
#define GTIM_TIMX_PWM_CHY_GPIO_PIN          GPIO_PIN_0
#define GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* PA口时钟使能 */

#define GTIM_TIMX_PWM                       TIM2 
#define GTIM_TIMX_PWM_CHY                   TIM_CHANNEL_1                                /* 通道Y,  1<= Y <=4 */
#define GTIM_TIMX_PWM_CHY_CLK_ENABLE()      do{ __HAL_RCC_TIM2_CLK_ENABLE(); }while(0)   /* TIM2 时钟使能 */

/******************************************************************************************/

void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc);    /* 通用定时器 PWM初始化函数 */
#endif

main.c 

gtim_timx_pwm_chy_init(200 - 1, 720 - 1);

调用keil5的逻辑分析仪可以看到PA0输出500hz的pwm (这一步是确保输出没问题,后期有问题排查别的)

四:kei5逻辑分析仪 

1、打开锤子,找到Dubug选项 

下面那里输入自己的单片机型号,像我的是STM32F103RCT6,就写STM

32F103RC(Device可以查看到自己的单片机型号) 

2、点开调试界面 

3、 选择逻辑分析仪

4设置引脚 

 

PA0就是PORTA.0,其他的也是这样的规律  

 

引脚设置好后 点击一下引脚,然后点击Display Type,选择Bit

  

随后点击这个运行,运行后再点停止就有波形了

 还有些功能可以自己摸索

五:注意事项

1、如果有脉冲输出但是电机不动,那么可能是电流太小,电流太小会转不动,电流太大会有噪声并伴随发热(A4988的噪声尤为明显)。

2、如果尝试了很多次还是无法转动,请更换驱动。

3、如果转起来了但是不费力就能使它向相反方向转动,就要检查电源的共地情况,或者用手轻微接触后 电机转速变慢,扭矩增加,则是单片机的电源没有共地或者接地。

4、如果keil5的逻辑分析仪有波形输出,但是接入驱动后电机不转,那可以用逻辑分析仪或者示波器抓一下引脚的波形,看看波形的高电平在几V,如果是mv,那就是单片机烧了。

5、如果电机只抖动不转,考虑是频率太高而电流太小。建议调小频率后慢慢拧动电流调节螺丝看看。

  • 45
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值