This repository has been archived on 2024-12-31. You can view files and clone it, but cannot push or open issues or pull requests.
mfps/App/Src/tmc5160.c

224 lines
9.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "tmc5160.h"
#include "main.h"
#include "gpio.h"
#include "spi.h"
#include "delay.h"
#include "string.h"
// CS2置于 “低电平” 使能SPI
// 写的时候高位地址要加上 0x80
// 手册第5章是寄存器表5.3.1是斜坡相关寄存器第11章有实际单位换算表第20章 图20.3 有运动控制流程图
// 寄存器 "RAMPMODE"->"0x20" 斜坡运动模式: 0->位置模式1->速度模式至正VMAMX2->速度模式至负VMAX3->速度保持不变最多使用2位
// 寄存器 "VSTART"->"0x23" 电机起动速度最多使用18位VSTART<=VSTOP
// 寄存器 "A1"->"0x24" VSTART->V1的加速度最多使用16位
// 寄存器 "V1"->"0x25" 第一加/减速阶段速度阈值最多使用20位取0时禁用A1和D1仅用AMAX和DMAX
// 寄存器 "AMAX"->"0x26" V1->VMAX的加速度最多使用16位
// 寄存器 "DMAX"->"0x28" VMAX->V1的减速度最多使用16位
// 寄存器 "VMAX"->"0x27" 斜坡运动目标速度最多使用23位
// 寄存器 "D1"->"0x2A" V1->VSTOP的减速度最多使用16位不要在位置模式下置0
// 寄存器 "VSTOP"->"0x2B" 电机停止速度最多使用18位VSTART<=VSTOP位置模式下>=10
// 一圈 200*256 微步,即每步转动 9/1280 度, 1 微步/秒 = 1.953e-5 转/秒
#define TMC5160A_CS2_L HAL_GPIO_WritePin(GPIOC,CS2_Pin,GPIO_PIN_RESET) //CS2低电平
#define TMC5160A_CS2_H HAL_GPIO_WritePin(GPIOC,CS2_Pin,GPIO_PIN_SET) //CS2高电平
#define TMC5160A_MOSI_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET) //MOSI低电平
#define TMC5160A_MOSI_H HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET) //MOSI高电平
#define TMC5160A_CLK_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET) //CLK低电平
#define TMC5160A_CLK_H HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET) //CLK高电平
#define TMC5160A_ReadVal HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14) //MISO
void TMC5160A_Init_Gpio(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI2 GPIO Configuration
PB13 ------> SPI2_SCK
PB14 ------> SPI2_MISO
PB15 ------> SPI2_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void tmc5160_init(void)
{
// 纯SPI模式
// TMC5160_SPIWriteInt(0x00, 0x0000000C,1); // writing value 0x0000000C = 12 = 0.0 to address 0 = 0x00(GCONF) 0x00000008 不能移动 会左右抖动
// TMC5160_SPIWriteInt(0x03, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 1 = 0x03(SLAVECONF)
// TMC5160_SPIWriteInt(0x05, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 2 = 0x05(X_COMPARE)
// TMC5160_SPIWriteInt(0x06, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 3 = 0x06(OTP_PROG)
// TMC5160_SPIWriteInt(0x08, 0x0000000E,1); // writing value 0x00000011 = 17 = 0.0 to address 4 = 0x08(FACTORY_CONF)
// TMC5160_SPIWriteInt(0x09, 0x00010606,1); // writing value 0x00010606 = 67078 = 0.0 to address 5 = 0x09(SHORT_CONF)
// TMC5160_SPIWriteInt(0x0A, 0x00080400,1); // writing value 0x00080400 = 525312 = 0.0 to address 6 = 0x0A(DRV_CONF)
// TMC5160_SPIWriteInt(0x0B, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 7 = 0x0B(GLOBAL_SCALER)
// // 速度相关的驱动控制寄存器
// TMC5160_SPIWriteInt(0x10, 0x00061F0A,1); // writing value 0x00070707 = 460551 = 0.0 to address 8 = 0x10(IHOLD_IRUN)
// TMC5160_SPIWriteInt(0x11, 0x0000000A,1); // writing value 0x0000000A = 10 = 0.0 to address 9 = 0x11(TPOWERDOWN)
// TMC5160_SPIWriteInt(0x13, 0x00000010,1); // writing value 0x00000041 = 65 = 0.0 to address 10 = 0x13(TPWMTHRS)
// TMC5160_SPIWriteInt(0x14, 0x00000010,1); // writing value 0x00004189 = 16777 = 0.0 to address 11 = 0x14(TCOOLTHRS)
// TMC5160_SPIWriteInt(0x15, 0x00000010,1); // writing value 0x00000000 = 0 = 0.0 to address 12 = 0x15(THIGH)
// 斜波发生器运动寄存器
TMC5160_SPIWriteInt(0x20, 0x00000001,1); // writing value 0x00000000 = 0 = 0.0 to address 13 = 0x20(RAMPMODE)
// TMC5160_SPIWriteInt(0x21, 0x00000000,1); // writing value 0xFFCC12F0 = 0 = 0.0 to address 14 = 0x21(XACTUAL)
// TMC5160_SPIWriteInt(0x23, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 15 = 0x23(VSTART)
TMC5160_SPIWriteInt(0x24, 0x000003E8,1); // writing value 0x00001F07 = 7943 = 0.0 to address 16 = 0x24(A1)
TMC5160_SPIWriteInt(0x25, 0x0000C350,1); // writing value 0x0000C350 = 50000 = 0.0 to address 17 = 0x25(V1)
TMC5160_SPIWriteInt(0x26, 0x000001F4,1); // writing value 0x00004DF1 = 19953 = 0.0 to address 18 = 0x26(AMAX)
TMC5160_SPIWriteInt(0x27, 0x00000D40,1); // writing value 0x0006D3A0 = 447392 = 0.0 to address 19 = 0x27(VMAX)
TMC5160_SPIWriteInt(0x28, 0x000002BC,1); // writing value 0x00009B83 = 39811 = 0.0 to address 20 = 0x28(DMAX)
TMC5160_SPIWriteInt(0x2A, 0x00000578,1); // writing value 0x00007B87 = 31623 = 0.0 to address 21 = 0x2A(D1)
TMC5160_SPIWriteInt(0x2B, 0x0000000A,1); // writing value 0x0000000A = 10 = 0.0 to address 22 = 0x2B(VSTOP)
// TMC5160_SPIWriteInt(0x2C, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 23 = 0x2C(TZEROWAIT)
// TMC5160_SPIWriteInt(0x2D, 0x00000000,1); // writing value 0xFFCC12F0 = 0 = 0.0 to address 24 = 0x2D(XTARGET)
// TMC5160_SPIWriteInt(0x33, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 25 = 0x33(VDCMIN)
// TMC5160_SPIWriteInt(0x34, 0x00000000,1); // writing value 0x00000400 = 1024 = 0.0 to address 26 = 0x34(SW_MODE)
// // 编码器寄存器
// TMC5160_SPIWriteInt(0x38, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 27 = 0x38(ENCMODE)
// TMC5160_SPIWriteInt(0x39, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 28 = 0x39(X_ENC)
// TMC5160_SPIWriteInt(0x3A, 0x00010000,1); // writing value 0x00010000 = 65536 = 0.0 to address 29 = 0x3A(ENC_CONST)
// TMC5160_SPIWriteInt(0x3D, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 30 = 0x3D(ENC_DEVIATION)
// // 电机驱动寄存器-电机微步控制寄存器
// TMC5160_SPIWriteInt(0x60, 0xAAAAB554,1); // writing value 0xAAAAB554 = 0 = 0.0 to address 31 = 0x60(MSLUT[0])
// TMC5160_SPIWriteInt(0x61, 0x4A9554AA,1); // writing value 0x4A9554AA = 1251300522 = 0.0 to address 32 = 0x61(MSLUT[1])
// TMC5160_SPIWriteInt(0x62, 0x24492929,1); // writing value 0x24492929 = 608774441 = 0.0 to address 33 = 0x62(MSLUT[2])
// TMC5160_SPIWriteInt(0x63, 0x10104222,1); // writing value 0x10104222 = 269500962 = 0.0 to address 34 = 0x63(MSLUT[3])
// TMC5160_SPIWriteInt(0x64, 0xFBFFFFFF,1); // writing value 0xFBFFFFFF = 0 = 0.0 to address 35 = 0x64(MSLUT[4])
// TMC5160_SPIWriteInt(0x65, 0xB5BB777D,1); // writing value 0xB5BB777D = 0 = 0.0 to address 36 = 0x65(MSLUT[5])
// TMC5160_SPIWriteInt(0x66, 0x49295556,1); // writing value 0x49295556 = 1227445590 = 0.0 to address 37 = 0x66(MSLUT[6])
// TMC5160_SPIWriteInt(0x67, 0x00404222,1); // writing value 0x00404222 = 4211234 = 0.0 to address 38 = 0x67(MSLUT[7])
// TMC5160_SPIWriteInt(0x68, 0xFFFF8056,1); // writing value 0xFFFF8056 = 0 = 0.0 to address 39 = 0x68(MSLUTSEL)
// TMC5160_SPIWriteInt(0x69, 0x00F70000,1); // writing value 0x00F70000 = 16187392 = 0.0 to address 40 = 0x69(MSLUTSTART)
// // 电机驱动寄存器-驱动寄存器组
// TMC5160_SPIWriteInt(0x6C, 0x04410153,1); // writing value 0x00410153 = 4260179 = 0.0 to address 41 = 0x6C(CHOPCONF)
// TMC5160_SPIWriteInt(0x6D, 0x00000000,1); // writing value 0x00030000 = 196608 = 0.0 to address 42 = 0x6D(COOLCONF)
// TMC5160_SPIWriteInt(0x6E, 0x00000000,1); // writing value 0x00000000 = 0 = 0.0 to address 43 = 0x6E(DCCTRL)
// TMC5160_SPIWriteInt(0x70, 0xC40C001E,1); // writing value 0xC40C001E = 0 = 0.0 to address 44 = 0x70(PWMCONF)
}
uint8_t data_r[5] = {0};//存放接收到的数据
void TMC5160_SPIWriteInt(uint8_t addr, uint32_t data, uint8_t rw)//rw = 1为写0为读
{
char i = 0;
unsigned long dat = 0;
for(i = 0; i < 5; i++) data_r[i] = 0;
TMC5160A_CS2_L;
delay(100);
if(rw)
{
addr |= 0x80;
}
else
{
addr &= 0x7F;
}
//地址
TMC5160A_CLK_H;
for(i = 0; i < 8; i++)
{
TMC5160A_CLK_L;
if(addr & 0x80)
{
TMC5160A_MOSI_H;
}
else
{
TMC5160A_MOSI_L;
}
addr <<= 1;
TMC5160A_CLK_H;
delay(20);
data_r[0] <<= 1;
if(TMC5160A_ReadVal)
{
data_r[0] |= 1;
}
}
//数据
for(i = 0; i < 32; i++)
{
TMC5160A_CLK_L;
if(data & 0x80000000)
{
TMC5160A_MOSI_H;
}
else
{
TMC5160A_MOSI_L;
}
data <<= 1;
TMC5160A_CLK_H;
delay(20);
dat <<= 1;
if(TMC5160A_ReadVal)
{
dat |= 1;
}
}
data_r[0] = addr;
data_r[1] = dat >> 24;
data_r[2] = dat >> 16;
data_r[3] = dat >> 8;
data_r[4] = dat >> 0;
TMC5160A_CS2_H; //SPI_CS片选拉1
}
void TMC5160_SPIReadInt(uint8_t addr, uint8_t record[5])//从addr寄存器读取数据然后记录到record中
{
char i;
for(i = 0; i < 5; i++) data_r[i] = 0;
TMC5160_SPIWriteInt(addr,0,0);
TMC5160_SPIWriteInt(addr,0,0);
memcpy(record, data_r, 5);
}
uint8_t XA[5]={0},VA[5]={0};
void tmc5160_act()
{
TMC5160_SPIReadInt(0x21,XA);//读取实际位置XACTUAL
TMC5160_SPIReadInt(0x20,VA);//读取实际速度VACTUAL
// TMC5160_SPIWriteInt(0x20,0x00000001,1);//RAMPMODE = 1 速度模式至+VMAX
// TMC5160_SPIWriteInt(0x2D,0x0000C800,1); //设置目标位置
// TMC5160_SPIWriteInt(0x2D,(uint32_t)0xADFFFF3800,1); //XTARGET = -51200 反向转动一圈
}