#include "main.h"
dSPIN_RegsStruct_TypeDef dSPIN_RegsStruct;
u32 MotorSpeedConver(u16 Speed)
{// 马达速度转换 将步/s换算成r/min
uint32_t tSpeed = 0;
tSpeed = ((float)Speed/60)*200;
return MaxSpd_Steps_to_Par(tSpeed);
}
/********************************************************************
* 函数说明:检测L6470硬件忙寄存器
* 输 入:无
* 返 回:返回1忙,返回0闲
******************************************************************/
uint8_t dSPIN_Busy_HW(u8 Num)
{
// if(!(GPIO_ReadInputDataBit(dSPIN_BUSY_Port, dSPIN_BUSY_Pin)))
if(MotorWaitBusy(Num)) return 0x01;
else return 0x00;
}
/********************************************************************
* 函数说明:检测L6470软件忙寄存器
* 输 入:无
* 返 回:返回1忙,返回0闲
******************************************************************/
uint8_t dSPIN_Busy_SW(void)
{
// if(!(dSPIN_Get_Status() & dSPIN_STATUS_BUSY)) return 0x01;
// else return 0x00;
return 0x00;
}
/********************************************************************
* 函数说明:发送/接收一个字节到SPI
* 输 入:发送字节
* 返 回:接收字节
******************************************************************/
uint8_t dSPIN_Write_Byte(uint8_t byte)
{
u8 Data=0;
MotorCSEnable(1); // nSS/CS片选信号 - 低
Data = SPIx_ReadWriteByte(1, byte);
MotorCSEnable(0);
return Data;
}
/********************************************************************
* 函数说明:配置L6470各寄存器初值
* 输 入:寄存器地址,对应的值
* 返 回:无
******************************************************************/
void dSPIN_Registers_Set(dSPIN_RegsStruct_TypeDef *dSPIN_RegsStruct, u8 mIndex)
{// 配置寄存器
MotorNumEnable(mIndex);
dSPIN_Set_Param(dSPIN_ABS_POS, dSPIN_RegsStruct->ABS_POS);
dSPIN_Set_Param(dSPIN_EL_POS, dSPIN_RegsStruct->EL_POS);
dSPIN_Set_Param(dSPIN_MARK, dSPIN_RegsStruct->MARK);
dSPIN_Set_Param(dSPIN_ACC, dSPIN_RegsStruct->ACC);
dSPIN_Set_Param(dSPIN_DEC, dSPIN_RegsStruct->DEC);
dSPIN_Set_Param(dSPIN_MAX_SPEED, dSPIN_RegsStruct->MAX_SPEED);
dSPIN_Set_Param(dSPIN_MIN_SPEED, dSPIN_RegsStruct->MIN_SPEED);
dSPIN_Set_Param(dSPIN_FS_SPD, dSPIN_RegsStruct->FS_SPD);
dSPIN_Set_Param(dSPIN_KVAL_HOLD, dSPIN_RegsStruct->KVAL_HOLD);
dSPIN_Set_Param(dSPIN_KVAL_RUN, dSPIN_RegsStruct->KVAL_RUN);
dSPIN_Set_Param(dSPIN_KVAL_ACC, dSPIN_RegsStruct->KVAL_ACC);
dSPIN_Set_Param(dSPIN_KVAL_DEC, dSPIN_RegsStruct->KVAL_DEC);
dSPIN_Set_Param(dSPIN_INT_SPD, dSPIN_RegsStruct->INT_SPD);
dSPIN_Set_Param(dSPIN_ST_SLP, dSPIN_RegsStruct->ST_SLP);
dSPIN_Set_Param(dSPIN_FN_SLP_ACC, dSPIN_RegsStruct->FN_SLP_ACC);
dSPIN_Set_Param(dSPIN_FN_SLP_DEC, dSPIN_RegsStruct->FN_SLP_DEC);
dSPIN_Set_Param(dSPIN_K_THERM, dSPIN_RegsStruct->K_THERM);
dSPIN_Set_Param(dSPIN_STALL_TH, dSPIN_RegsStruct->STALL_TH);
dSPIN_Set_Param(dSPIN_OCD_TH, dSPIN_RegsStruct->OCD_TH);
dSPIN_Set_Param(dSPIN_STEP_MODE, dSPIN_RegsStruct->STEP_MODE);
dSPIN_Set_Param(dSPIN_ALARM_EN, dSPIN_RegsStruct->ALARM_EN);
dSPIN_Set_Param(dSPIN_CONFIG, dSPIN_RegsStruct->CONFIG);
}
/**********************************************************************
* 名 称:dSPIN_Regs_Struct_Reset
* 功 能:配置1号电机各参数
* 入口参数:
* 出口参数:
* 说 明:步进电机初始化设置
***********************************************************************/
void dSPIN_Regs_Struct_Reset(u8 mIndex)
{/* 初始化L6470各寄存器初值 */
memset(&dSPIN_RegsStruct, 0, sizeof(dSPIN_RegsStruct));
dSPIN_RegsStruct.ACC = AccDec_Steps_to_Par(2000); /* 加速率的设置为466 steps/s2,范围14.55至59590 steps/s2*/
dSPIN_RegsStruct.DEC = AccDec_Steps_to_Par(2000); /* 减速率的设置为466 steps/s2,范围14.55至59590 steps/s2 */
dSPIN_RegsStruct.MAX_SPEED = MotorSpeedConver(600);
/* 最大速度900r/m, 最大速度设置为488步/秒,最大速度设置范围为15.25至15610步/秒*/
dSPIN_RegsStruct.FS_SPD = FSSpd_Steps_to_Par(1000); /* 全步进速度设置252步/秒,范围为7.63到15625步/秒*/
dSPIN_RegsStruct.MIN_SPEED = 0x1000|MinSpd_Steps_to_Par(0);/* 最小速度设置为0步/秒,取值范围为0至976.3,步骤/秒*/
if(mIndex == MOTOR1_NUM)
{
if(g_ModParam.xHoldPow >= 20) g_ModParam.xHoldPow = 20;
if(g_ModParam.xRunPow >= 25) g_ModParam.xRunPow = 25;
dSPIN_RegsStruct.KVAL_HOLD = Kval_Perc_to_Par(g_ModParam.xHoldPow); /* 保持占空比(转矩)设定为10%,范围在0到99.6%, 65%=2.43A*/
dSPIN_RegsStruct.KVAL_RUN = Kval_Perc_to_Par(g_ModParam.xRunPow); /* 运行占空比(转矩)设定为10%,范围在0到99.6%*/
dSPIN_RegsStruct.KVAL_ACC = Kval_Perc_to_Par(g_ModParam.xRunPow); /* 加速的占空比(转矩)设定为10%,范围在0到99.6%*/
dSPIN_RegsStruct.KVAL_DEC = Kval_Perc_to_Par(g_ModParam.xRunPow); /* 减速的占空比(转矩)设定为10%,范围在0到99.6% */
dSPIN_RegsStruct.INT_SPD = IntSpd_Steps_to_Par(100); /* 加速/减速曲线斜率的速度值。 range 0 to 3906 steps/s */
dSPIN_RegsStruct.ST_SLP = BEMF_Slope_Perc_to_Par(0.015);/* 加减速——开始斜率(反电动势)BEMF补偿设置 0 to 0.4% s/step */
dSPIN_RegsStruct.FN_SLP_ACC = BEMF_Slope_Perc_to_Par(0.026);/* 加速度——结束斜率(反电动势)BEMF补偿设置 0 to 0.4% s/step */
dSPIN_RegsStruct.FN_SLP_DEC = BEMF_Slope_Perc_to_Par(0.026);/* 减速度——结束斜率(反电动势)BEMF补偿设置 0 to 0.4% s/step */
}
else
{
if(g_ModParam.zHoldPow >= 20) g_ModParam.zHoldPow = 20;
if(g_ModParam.zRunPow >= 25) g_ModParam.zRunPow = 25;
dSPIN_RegsStruct.KVAL_HOLD = Kval_Perc_to_Par(g_ModParam.zHoldPow); /* 保持占空比(转矩)设定为10%,范围在0到99.6%, 65%=2.43A*/
dSPIN_RegsStruct.KVAL_RUN = Kval_Perc_to_Par(g_ModParam.zRunPow); /* 运行占空比(转矩)设定为10%,范围在0到99.6%*/
dSPIN_RegsStruct.KVAL_ACC = Kval_Perc_to_Par(g_ModParam.zRunPow); /* 加速的占空比(转矩)设定为10%,范围在0到99.6%*/
dSPIN_RegsStruct.KVAL_DEC = Kval_Perc_to_Par(g_ModParam.zRunPow); /* 减速的占空比(转矩)设定为10%,范围在0到99.6% */
dSPIN_RegsStruct.INT_SPD = IntSpd_Steps_to_Par(100); /* 加速/减速曲线斜率的速度值。 range 0 to 3906 steps/s */
dSPIN_RegsStruct.ST_SLP = BEMF_Slope_Perc_to_Par(0.015);/* 加减速——开始斜率(反电动势)BEMF补偿设置 0 to 0.4% s/step */
dSPIN_RegsStruct.FN_SLP_ACC = BEMF_Slope_Perc_to_Par(0.026);/* 加速度——结束斜率(反电动势)BEMF补偿设置 0 to 0.4% s/step */
dSPIN_RegsStruct.FN_SLP_DEC = BEMF_Slope_Perc_to_Par(0.026);/* 减速度——结束斜率(反电动势)BEMF补偿设置 0 to 0.4% s/step */
}
dSPIN_RegsStruct.K_THERM = KTherm_to_Par(1); /* 热补偿参数设置为1,范围为1-1.46875*/
dSPIN_RegsStruct.OCD_TH = dSPIN_OCD_TH_3000mA; /* 过流阈值设置1500毫安 */
dSPIN_RegsStruct.STALL_TH = StallTh_to_Par(2000); /* 失速阈值设置至1000mA,范围:31.25 to 4000mA */
dSPIN_RegsStruct.STEP_MODE = dSPIN_STEP_SEL_1_128; /* 设置到128微步模式 */
dSPIN_RegsStruct.ALARM_EN = 0X00 /* dSPIN_ALARM_EN_ALL_ENABLE 报警设置 - 启用所有警报 */
| dSPIN_ALARM_EN_OVERCURRENT // 过流保护
| dSPIN_ALARM_EN_THERMAL_SHUTDOWN // 过热关闭
| dSPIN_ALARM_EN_THERMAL_WARNING // 过热警告
| dSPIN_ALARM_EN_UNDER_VOLTAGE
|dSPIN_ALARM_EN_STALL_DET_A
|dSPIN_ALARM_EN_STALL_DET_B
| dSPIN_ALARM_EN_SW_TURN_ON
| dSPIN_ALARM_EN_WRONG_NPERF_CMD
;
/* 内部振荡