Files
new_f_3/User/bsp/src/bsp_drv8880.c
刘正航 609eb878d1 New
2026-04-16 16:55:01 +08:00

269 lines
8.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//------------------------------------------------------------------------------
// 模块名称步进电机芯片DRV8880驱动模块
// 文件名称bsp_drv8880
// 版本名称V1.0
// 文件说明控制步进电机芯片DRV8880
// 日期时间2018年8月17日16点23分
// 文件作者Jackie Chan
// 修改记录:
// 版本号 日期 作者 说明
// V1.0 2018.08.17 J.C 正式发布
//
// 公司名称:多场低温科技有限公司
//
//------------------------------------------------------------------------------
#include "bsp.h"
// DRV888控制引脚对应的RCC时钟
#define RCC_ALL_MOTO (RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | \
RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG)
// DRV8880控制引脚
#define GPIO_PORT_STEP GPIOC // 脉冲输入,内部下拉,上升沿触发
#define GPIO_PIN_STEP GPIO_Pin_7
#define GPIO_PORT_DIR GPIOE // 转动方向,内部下拉
#define GPIO_PIN_DIR GPIO_Pin_10
#define GPIO_PORT_ENABLE GPIOE // 器件使能,内部下拉
#define GPIO_PIN_ENABLE GPIO_Pin_11
#define GPIO_PORT_SLEEP GPIOB // 低电平进入睡眠模式,内部下拉
#define GPIO_PIN_SLEEP GPIO_Pin_11
#define GPIO_PORT_ATE GPIOE // 高电平进入自动整定模式,内部下拉
#define GPIO_PIN_ATE GPIO_Pin_15
#define GPIO_PORT_TRQ1 GPIOG // 力矩设置,内部下拉
#define GPIO_PIN_TRQ1 GPIO_Pin_1
#define GPIO_PORT_TRQ0 GPIOG // 力矩设置,内部下拉
#define GPIO_PIN_TRQ0 GPIO_Pin_0
#define GPIO_PORT_M1 GPIOE // 细分,三态输入引脚
#define GPIO_PIN_M1 GPIO_Pin_8
#define GPIO_PORT_M0 GPIOE // 细分,三态输入引脚
#define GPIO_PIN_M0 GPIO_Pin_7
#define GPIO_PORT_DECAY1 GPIOE // 衰减模式设置,自动整定时被忽略
#define GPIO_PIN_DECAY1 GPIO_Pin_13
#define GPIO_PORT_DECAY0 GPIOE // 衰减模式设置,自动整定时被忽略
#define GPIO_PIN_DECAY0 GPIO_Pin_12
#define GPIO_PORT_TOFF GPIOB // Off time设置三态输入
#define GPIO_PIN_TOFF GPIO_Pin_10
#define GPIO_PORT_FAULT GPIOE // 失效报警输出,开漏输出
#define GPIO_PIN_FAULT GPIO_Pin_14
// 细分相关宏定义
#define M1_ENABLE (GPIO_PORT_M1->BSRR = GPIO_PIN_M1)
#define M0_ENABLE (GPIO_PORT_M0->BSRR = GPIO_PIN_M0)
#define M1_DISABLE (GPIO_PORT_M1->BRR = GPIO_PIN_M1)
#define M0_DISABLE (GPIO_PORT_M0->BRR = GPIO_PIN_M0)
#define M0_SET_AS_INPUT() \
{ \
GPIO_PORT_M0->CRL &= 0X0FFFFFFF; \
GPIO_PORT_M0->CRL |= 0X40000000; \
}
#define M0_SET_AS_OUTPUT() \
{ \
GPIO_PORT_M0->CRL &= 0X0FFFFFFF; \
GPIO_PORT_M0->CRL |= 0X30000000; \
}
// DRV8880使能相关宏定义
#define DRV8880_ENABLE (GPIO_PORT_ENABLE->BSRR = GPIO_PIN_ENABLE)
#define DRV8880_DISABLE (GPIO_PORT_ENABLE->BRR = GPIO_PIN_ENABLE)
// DRV8880方向控制引脚
#define DRV8880_CW (GPIO_PORT_DIR->BRR = GPIO_PIN_DIR) // 样品杆从上往下看,顺时针旋转(+
#define DRV8880_CCW (GPIO_PORT_DIR->BSRR = GPIO_PIN_DIR) // 样品杆从上往下看,逆时针旋转(-
extern DIGITIAL_TUBE_T g_tTube;
// 供外部调用的函数声明
void bsp_Init_Drv8880_Hard(void);
void bsp_drv8880_enable_config(FunctionalState en);
void bsp_drv8880_microstep_config(MICRO_STEPPING_E step);
void bsp_drv8880_config_dir(DIR_E dir);
// void bsp_drv8880_vref_config(uint16_t vol); // vol:0~3300,代表0~3.3V
static void bsp_dev8880_vref_init_hard(uint16_t vol); // vol:0~3300,代表0~3.3V
void bsp_drv8880_microstep_config(MICRO_STEPPING_E step)
{
switch (step)
{
case STEP_FULL: // M1M0: 00
M0_SET_AS_OUTPUT();
M1_DISABLE;
M0_DISABLE;
break;
case STEP_1_2_NC: // M1M0: 01
M0_SET_AS_OUTPUT();
M1_DISABLE;
M0_ENABLE;
break;
case STEP_1_2: // M1M0: 10
M0_SET_AS_OUTPUT();
M1_ENABLE;
M0_DISABLE;
break;
case STEP_1_4: // M1M0: 11
M0_SET_AS_OUTPUT();
M1_ENABLE;
M0_ENABLE;
break;
case STEP_1_8: // M1M0: 0Z
M0_SET_AS_INPUT();
M1_DISABLE;
break;
case STEP_1_16: // M1M0: 1Z
M0_SET_AS_INPUT();
M1_ENABLE;
break;
default:
break;
}
}
void bsp_drv8880_config_dir(DIR_E dir)
{
switch (dir)
{
case DIR_CW:
DRV8880_CW;
g_tTube.dir = DIR_CW;
break;
case DIR_CCW:
DRV8880_CCW;
g_tTube.dir = DIR_CCW;
break;
default:
break;
}
}
void bsp_drv8880_enable_config(FunctionalState en)
{
if (en == DISABLE)
{
DRV8880_DISABLE;
}
else
{
DRV8880_ENABLE;
}
}
// vol:0~3300,代表0~3.3V
static void bsp_dev8880_vref_init_hard(uint16_t vol)
{
float temp = vol;
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能PORTA通道时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); // 使能DAC通道时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4); // PA.4 输出高
DAC_InitType.DAC_Trigger = DAC_Trigger_None; // 不使用触发功能 TEN1=0
DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None; // 不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; // 屏蔽、幅值设置
DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Disable; // DAC1输出缓存关闭 BOFF1=1
DAC_Init(DAC_Channel_1, &DAC_InitType); // 初始化DAC通道1
DAC_Cmd(DAC_Channel_1, ENABLE); // 使能DAC1
DAC_SetChannel1Data(DAC_Align_12b_R, 0); // 12位右对齐数据格式设置DAC值
temp /= 1000;
temp = temp * 4096 / 3.3;
DAC_SetChannel1Data(DAC_Align_12b_R, temp); // 12位右对齐数据格式设置DAC值
}
void bsp_Init_Drv8880_Hard(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_ALL_MOTO, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// 配置自动整定引脚为高电平,设置为自动整定模式
GPIO_PORT_ATE->BSRR = GPIO_PIN_ATE;
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_ATE;
GPIO_Init(GPIO_PORT_ATE, &GPIO_InitStructure);
// 配置脉冲输入引脚,设置为默认低电平
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_STEP;
GPIO_Init(GPIO_PORT_STEP, &GPIO_InitStructure);
// 配置方向引脚,设置默认为低电平
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_DIR;
GPIO_Init(GPIO_PORT_DIR, &GPIO_InitStructure);
// 配置使能引脚,设置默认为低电平,不使能
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_ENABLE;
GPIO_Init(GPIO_PORT_ENABLE, &GPIO_InitStructure);
// 配置睡眠引脚,设置默认为低电平,处于睡眠状态
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_SLEEP;
GPIO_Init(GPIO_PORT_SLEEP, &GPIO_InitStructure);
// 配置细分引脚,设置默认为低电平,不细分
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_M1;
GPIO_Init(GPIO_PORT_M1, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_M0;
GPIO_Init(GPIO_PORT_M0, &GPIO_InitStructure);
// 配置力矩引脚设置默认为低电平100%力矩
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_TRQ1;
GPIO_Init(GPIO_PORT_TRQ1, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_TRQ0;
GPIO_Init(GPIO_PORT_TRQ0, &GPIO_InitStructure);
// 设置衰减模式设置默认为低电平为slow decay模式
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_DECAY1;
GPIO_Init(GPIO_PORT_DECAY1, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_DECAY0;
GPIO_Init(GPIO_PORT_DECAY0, &GPIO_InitStructure);
// 设置fixed-off-time设置默认为低电平为20us
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_TOFF;
GPIO_Init(GPIO_PORT_TOFF, &GPIO_InitStructure);
// 设置报警输出引脚,设置为输入浮空模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_FAULT;
GPIO_Init(GPIO_PORT_FAULT, &GPIO_InitStructure);
// 设置细分
bsp_drv8880_microstep_config(STEP_1_16);
// 方向设置
bsp_drv8880_config_dir(DIR_CCW);
// DA输出步进电机电流设置 0.495V
// 设置DA输出的电压为0.495V
bsp_dev8880_vref_init_hard(1500);
// 退出睡眠模式
GPIO_PORT_SLEEP->BSRR = GPIO_PIN_SLEEP;
// 暂时不使能,等待零点所搜命令
// bsp_drv8880_enable_config(DISABLE);
bsp_drv8880_enable_config(ENABLE);
}
//-------------------------------- End of file ---------------------------------