一、驱动设置
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、如果电机只抖动不转,考虑是频率太高而电流太小。建议调小频率后慢慢拧动电流调节螺丝看看。