New
This commit is contained in:
268
User/bsp/src/bsp_drv8880.c
Normal file
268
User/bsp/src/bsp_drv8880.c
Normal 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 ---------------------------------
|
||||
Reference in New Issue
Block a user