Untitled
unknown
plain_text
a year ago
9.2 kB
6
Indexable
#include "BspM1_Driver.h"
#include "BspDelay.h"
#define M1BSP_CS(X) X ? (GPIOB->BSRRL = GPIO_Pin_12) : (GPIOB->BSRRH = GPIO_Pin_12) // M1CS------------------PB12
#define M1BSP_DEN(X) X ? (GPIOA->BSRRL = GPIO_Pin_8) : (GPIOA->BSRRH = GPIO_Pin_8) // M1DEN------------------PA8
#define M1BSP_NRST(X) X ? (GPIOC->BSRRL = GPIO_Pin_6) : (GPIOC->BSRRH = GPIO_Pin_6) // M1NRST------------------PC6
TypeDefTMC4361_RegStruct TMC4361_M1RegStruct={
.bsp_write_reg = M1_HardWareSendDat,
.bsp_read_reg = M1_HardWareReadDat,
.PROTO_V = 805500,/* 转速*895 这个值大概900转*/
};
/*********************************************************************************************
* @brief M1_CS_IO_Config
* @param None
* @retval None
* @IO UM1_CS--------PB12
********************************************************************************************/
static void M1_CS_IO_Config(void)
{
GPIO_InitTypeDef GPIOX;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
GPIOX.GPIO_Pin = GPIO_Pin_12;
GPIOX.GPIO_Mode = GPIO_Mode_OUT;
GPIOX.GPIO_OType = GPIO_OType_PP;
GPIOX.GPIO_PuPd = GPIO_PuPd_UP;
GPIOX.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB,&GPIOX);
}
/*********************************************************************************************
* @brief M1_IO_Config
* @param None
* @retval None
* @IO UM1_DEN--------PA8
* @IO UM1_NRST--------PC6
********************************************************************************************/
static void M1_IO_Config(void)
{
GPIO_InitTypeDef GPIOX;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC,ENABLE);
GPIOX.GPIO_Pin = GPIO_Pin_8;
GPIOX.GPIO_Mode = GPIO_Mode_OUT;
GPIOX.GPIO_OType = GPIO_OType_PP;
GPIOX.GPIO_PuPd = GPIO_PuPd_UP;
GPIOX.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIOX);
GPIOX.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOC,&GPIOX);
}
uint8_t M1_SPI_Config(void)
{
Bsp_SPI2_Config();
M1_CS_IO_Config();
M1_IO_Config();
M1BSP_DEN(0);
Delayms(50);
M1BSP_NRST(0);
Delayms(50);
M1BSP_NRST(1);
Delayms(50);
}
uint8_t M1_HardWareSendDat(uint8_t RegAddr,uint32_t Data)
{
__disable_irq();
uint8_t Status = 0;
M1BSP_CS(0);
BspCs_Delay(CSDELAY_COUNT);
RegAddr |= 0X80;
Status = Bsp_SPI2_SendByte(RegAddr);
Bsp_SPI2_SendByte((Data >> 24) & 0X000000FF);
Bsp_SPI2_SendByte((Data >> 16) & 0X000000FF);
Bsp_SPI2_SendByte((Data >> 8) & 0X000000FF);
Bsp_SPI2_SendByte(Data & 0X000000FF);
M1BSP_CS(1);
BspCs_Delay(CSDELAY_COUNT);
__enable_irq();
return Status;
}
uint8_t M1_HardWareReadDat(uint8_t RegAddr,uint32_t *Data)
{
__disable_irq();
uint8_t Status = 0;
M1BSP_CS(0);
BspCs_Delay(CSDELAY_COUNT);
Bsp_SPI2_SendByte(RegAddr);
Bsp_SPI2_SendByte(0);
Bsp_SPI2_SendByte(0);
Bsp_SPI2_SendByte(0);
Bsp_SPI2_SendByte(0);
M1BSP_CS(1);
BspCs_Delay(CSDELAY_COUNT);
M1BSP_CS(0);
BspCs_Delay(CSDELAY_COUNT);
Status = Bsp_SPI2_SendByte(RegAddr);
*Data = Bsp_SPI2_SendByte(0);
(*Data) <<= 8;
*Data |= Bsp_SPI2_SendByte(0);
(*Data) <<= 8;
*Data |= Bsp_SPI2_SendByte(0);
(*Data) <<= 8;
*Data |= Bsp_SPI2_SendByte(0);
M1BSP_CS(1);
BspCs_Delay(CSDELAY_COUNT);
__enable_irq();
return Status;
}
void M1_Init(void)
{
M1_SPI_Config();
M1_HardWareSendDat(0x4F,0x52535400); //reset
Delayms(100);
//general setup:
//----------------------
M1_HardWareSendDat(0X03,0X540022); // Inputfilter: START und Encoderpins 输入滤波器配置
M1_HardWareSendDat(0X04,0X8440000d); //Setup of SPI Output Timing SPI输出配置寄存器
M1_HardWareSendDat(0X00,0x6026); // direct-a, direct-bow 通用配置寄存器
M1_HardWareSendDat(0X10,0X60004); // step length 步进方向输出配置寄存器
//configuration of TMC2130: 2130 配置寄存器
//----------------------
M1_HardWareSendDat(0X6D,0X81); // GCONF
M1_HardWareSendDat(0X6C,0X07); // diag1=index, pushpull, direct_mode = on --> SPI mode
M1_HardWareSendDat(0X6D,0X80); // GCONF
M1_HardWareSendDat(0X6C,0X12200); // diag1=index, pushpull, direct_mode = on --> SPI mode
M1_HardWareSendDat(0X6D,0X90); // IHOLD_IRUN
M1_HardWareSendDat(0X6C,0X00070C08); // ihold=0, iholddelay=7, irun=2
M1_HardWareSendDat(0X6D,0X91); // TPOWERDOWN
M1_HardWareSendDat(0X6C,0Xa); // TZEROWAIT=10
M1_HardWareSendDat(0X6D,0X94); // TCOOLTHRS
M1_HardWareSendDat(0X6C,0Xc8); // =200
M1_HardWareSendDat(0X6D,0X95); // THIGH
M1_HardWareSendDat(0X6C,0X32); // =50
M1_HardWareSendDat(0X6D,0Xee); // DCCTRL
M1_HardWareSendDat(0X6C,0X70025); // DCCTRLSG=5, DC_TIME=37
M1_HardWareSendDat(0X6D,0Xf0); // PWMCONF
M1_HardWareSendDat(0X6C,0X404ff); //
M1_HardWareSendDat(0X6D,0Xec); // CHOPCONF
M1_HardWareSendDat(0X6C,0X10223); //
M1_HardWareSendDat(0X6D,0Xed); // COOLCONF (off)
M1_HardWareSendDat(0X6C,0X100a220); //
M1_HardWareSendDat(0X6D,0X8B); // GLOBAL_SCALER (off)
M1_HardWareSendDat(0X6C,0X0); // global scaler = 0
//清零速度位置目标位置
M1_HardWareSendDat(0X24,0X0); // v=0 VMAX
M1_HardWareSendDat(0X21,0X0); // xact=0 XACTUAL
M1_HardWareSendDat(0X37,0X0); // xtarg=0 XTARGET
M1_HardWareSendDat(0X50,0); // enc_pos
//cl basic parameter 闭环基础参数配置
//----------------------
M1_HardWareSendDat(0X54,4000); // encoder resolution = 40k/rev ADAPT THIS PARAMETER to SETUP 编码器分辨率配置寄存器
M1_HardWareSendDat(0X1C,0Xff00ff); // CL_BETA=CL_GAMMA=255 闭环调节
M1_HardWareSendDat(0X5C,0X10000); // CL_DELTA_P = 1.0 PID_D
//cl calibration: 闭环校准
//----------------------
M1_HardWareSendDat(0X20,0X6); // ramp mode: hold+pos mode 运行模式
M1_HardWareSendDat(0X24,0X100000); // slow vel cl calibration: vmax
M1_HardWareSendDat(0X07,0X400000); // regulation_modus: turn on cl 编码器信号配置寄存器
// M1_HardWareSendDat(0X37,0X80); // move to FS position 目标位置寄存器
M1_HardWareSendDat(0X07,0X1400000); // cl_calibration_en: turn on cl calibration 编码器信号配置寄存器
Delayms(200); // 延时10MS
M1_HardWareSendDat(0X07,0X400000); // cl_calibration_en: turn off cl calibration 编码器配置寄存器
M1_HardWareSendDat(0X24,0X0); // v=0 VMAX
//S-shaped Ramps setup: S 加减速参数配置
//----------------------
M1_HardWareSendDat(0X20,0X6); // ramp mode: hold+pos mode 运行模式
M1_HardWareSendDat(0X24,0X05350000); // vmax=400kpps VMAX
M1_HardWareSendDat(0X20,0X06); // s-ramp + pos mode 运行模式
//ramp generator S 曲线斜坡发生器参数
M1_HardWareSendDat(0X28,30000); // amax 每平方秒的脉冲
M1_HardWareSendDat(0X29,30000); // dmax 每平方秒的脉冲
M1_HardWareSendDat(0X2D,0X300); // bow1 每立方秒的脉冲
M1_HardWareSendDat(0X2E,0X300); // bow2 每立方秒的脉冲
M1_HardWareSendDat(0X2F,0X300); // bow3 每立方秒的脉冲
M1_HardWareSendDat(0X30,0X300); // bow4 每立方秒的脉冲
//cl operation setup: 闭环设置
//----------------------
// back-emf Compensation 反电动势补偿设置
M1_HardWareSendDat(0X60,250000); // emf_vmin=
M1_HardWareSendDat(0X61,450000); // emf_vadd= -> emf_vmax=
M1_HardWareSendDat(0X62,0Xffffff); // emc_vel0_timer (enc_vel_zero, clock cycles) 编码器延迟时间
M1_HardWareSendDat(0X63,0X2000864); // enc vel filter settings (v_enc_mean) 编码器速度配置寄存器
// position Deviation
M1_HardWareSendDat(0X5F,5); // cl_tolerance=20 PID 参数寄存器
M1_HardWareSendDat(0X5C,0X10000); // cl_p=1.0 PID_D
// catch up velocity 追赶速度参数设置
M1_HardWareSendDat(0X5A,200); // cl_vlimit_p=200 PID_P
M1_HardWareSendDat(0X5B,50); // cl_vlimit_i=50 PID_I
M1_HardWareSendDat(0X5D,1000); // cl_vlimit_diclip=1000 PID_D
M1_HardWareSendDat(0X5E,200000); // cl_vlimit=100kpps PID限幅寄存器
// closed loop scaling 闭环电流调节参数设置
M1_HardWareSendDat(0X06,0x32ff64); // cl scaling values 电流调节寄存器
M1_HardWareSendDat(0X18,1000); // cl_upscale= 电流延迟周期寄存器
M1_HardWareSendDat(0X19,100000); // cl_dnscale= 电流递减延迟周期寄存器
M1_HardWareSendDat(0X07,0X0A400000); // cl encoder signal configuration with gamma correction and vlimit (catch up velocity) 编码器信号配置寄存器
M1_HardWareSendDat(0X05,0X80); // cl scaling on 电流调节配置寄存器
M1_HardWareSendDat(0X62,50000); // 设置编码器速度更新时钟周期数
M1_HardWareSendDat(0X53,500); // ENC_POS_DEV_TOL 设置编码器ENC_POS_DEV 的最大容差值
M1_HardWareSendDat(0X52,128); //这里不写的话 TARGET_REACHED不会触发
M1_HardWareReadDat(0X0E,000);
Delayms(10);
}
Editor is loading...
Leave a Comment