Untitled
unknown
plain_text
a year ago
9.2 kB
4
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