This commit is contained in:
刘正航
2026-04-16 16:55:01 +08:00
commit 609eb878d1
624 changed files with 214375 additions and 0 deletions

268
User/bsp/src/bsp_drv8880.c Normal file
View File

@@ -0,0 +1,268 @@
//------------------------------------------------------------------------------
// 模块名称步进电机芯片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 ---------------------------------