Untitled

 avatar
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