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

150 lines
7.9 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"
// 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
#define CS2_L HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_RESET); //CS2低电平
#define CS2_H HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_SET); //CS2高电平
void tmc5160_init()
{
// 纯SPI模式
TMC5160_SPIWriteInt(0x00, 0x0000000C); // writing value 0x0000000C = 12 = 0.0 to address 0 = 0x00(GCONF) 0x00000008 不能移动 会左右抖动
TMC5160_SPIWriteInt(0x03, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 1 = 0x03(SLAVECONF)
TMC5160_SPIWriteInt(0x05, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 2 = 0x05(X_COMPARE)
TMC5160_SPIWriteInt(0x06, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 3 = 0x06(OTP_PROG)
TMC5160_SPIWriteInt(0x08, 0x0000000E); // writing value 0x00000011 = 17 = 0.0 to address 4 = 0x08(FACTORY_CONF)
TMC5160_SPIWriteInt(0x09, 0x00010606); // writing value 0x00010606 = 67078 = 0.0 to address 5 = 0x09(SHORT_CONF)
TMC5160_SPIWriteInt(0x0A, 0x00080400); // writing value 0x00080400 = 525312 = 0.0 to address 6 = 0x0A(DRV_CONF)
TMC5160_SPIWriteInt(0x0B, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 7 = 0x0B(GLOBAL_SCALER)
// 速度相关的驱动控制寄存器
TMC5160_SPIWriteInt(0x10, 0x00071405); // writing value 0x00070707 = 460551 = 0.0 to address 8 = 0x10(IHOLD_IRUN)
TMC5160_SPIWriteInt(0x11, 0x0000000A); // writing value 0x0000000A = 10 = 0.0 to address 9 = 0x11(TPOWERDOWN)
TMC5160_SPIWriteInt(0x13, 0x00000010); // writing value 0x00000041 = 65 = 0.0 to address 10 = 0x13(TPWMTHRS)
TMC5160_SPIWriteInt(0x14, 0x00000010); // writing value 0x00004189 = 16777 = 0.0 to address 11 = 0x14(TCOOLTHRS)
TMC5160_SPIWriteInt(0x15, 0x00000010); // writing value 0x00000000 = 0 = 0.0 to address 12 = 0x15(THIGH)
// 斜波发生器运动寄存器
TMC5160_SPIWriteInt(0x20, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 13 = 0x20(RAMPMODE)
TMC5160_SPIWriteInt(0x21, 0x00000000); // writing value 0xFFCC12F0 = 0 = 0.0 to address 14 = 0x21(XACTUAL)
TMC5160_SPIWriteInt(0x23, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 15 = 0x23(VSTART)
TMC5160_SPIWriteInt(0x24, 0x000003E8); // writing value 0x00001F07 = 7943 = 0.0 to address 16 = 0x24(A1)
TMC5160_SPIWriteInt(0x25, 0x0000C350); // writing value 0x0000C350 = 50000 = 0.0 to address 17 = 0x25(V1)
TMC5160_SPIWriteInt(0x26, 0x00000277); // writing value 0x00004DF1 = 19953 = 0.0 to address 18 = 0x26(AMAX)
TMC5160_SPIWriteInt(0x27, 0x00006220); // writing value 0x0006D3A0 = 447392 = 0.0 to address 19 = 0x27(VMAX)
TMC5160_SPIWriteInt(0x28, 0x000002BC); // writing value 0x00009B83 = 39811 = 0.0 to address 20 = 0x28(DMAX)
TMC5160_SPIWriteInt(0x2A, 0x00000578); // writing value 0x00007B87 = 31623 = 0.0 to address 21 = 0x2A(D1)
TMC5160_SPIWriteInt(0x2B, 0x0000000A); // writing value 0x0000000A = 10 = 0.0 to address 22 = 0x2B(VSTOP)
TMC5160_SPIWriteInt(0x2C, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 23 = 0x2C(TZEROWAIT)
TMC5160_SPIWriteInt(0x2D, 0x00000000); // writing value 0xFFCC12F0 = 0 = 0.0 to address 24 = 0x2D(XTARGET)
TMC5160_SPIWriteInt(0x33, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 25 = 0x33(VDCMIN)
TMC5160_SPIWriteInt(0x34, 0x00000000); // writing value 0x00000400 = 1024 = 0.0 to address 26 = 0x34(SW_MODE)
// 编码器寄存器
TMC5160_SPIWriteInt(0x38, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 27 = 0x38(ENCMODE)
TMC5160_SPIWriteInt(0x39, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 28 = 0x39(X_ENC)
TMC5160_SPIWriteInt(0x3A, 0x00010000); // writing value 0x00010000 = 65536 = 0.0 to address 29 = 0x3A(ENC_CONST)
TMC5160_SPIWriteInt(0x3D, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 30 = 0x3D(ENC_DEVIATION)
// 电机驱动寄存器-电机微步控制寄存器
TMC5160_SPIWriteInt(0x60, 0xAAAAB554); // writing value 0xAAAAB554 = 0 = 0.0 to address 31 = 0x60(MSLUT[0])
TMC5160_SPIWriteInt(0x61, 0x4A9554AA); // writing value 0x4A9554AA = 1251300522 = 0.0 to address 32 = 0x61(MSLUT[1])
TMC5160_SPIWriteInt(0x62, 0x24492929); // writing value 0x24492929 = 608774441 = 0.0 to address 33 = 0x62(MSLUT[2])
TMC5160_SPIWriteInt(0x63, 0x10104222); // writing value 0x10104222 = 269500962 = 0.0 to address 34 = 0x63(MSLUT[3])
TMC5160_SPIWriteInt(0x64, 0xFBFFFFFF); // writing value 0xFBFFFFFF = 0 = 0.0 to address 35 = 0x64(MSLUT[4])
TMC5160_SPIWriteInt(0x65, 0xB5BB777D); // writing value 0xB5BB777D = 0 = 0.0 to address 36 = 0x65(MSLUT[5])
TMC5160_SPIWriteInt(0x66, 0x49295556); // writing value 0x49295556 = 1227445590 = 0.0 to address 37 = 0x66(MSLUT[6])
TMC5160_SPIWriteInt(0x67, 0x00404222); // writing value 0x00404222 = 4211234 = 0.0 to address 38 = 0x67(MSLUT[7])
TMC5160_SPIWriteInt(0x68, 0xFFFF8056); // writing value 0xFFFF8056 = 0 = 0.0 to address 39 = 0x68(MSLUTSEL)
TMC5160_SPIWriteInt(0x69, 0x00F70000); // writing value 0x00F70000 = 16187392 = 0.0 to address 40 = 0x69(MSLUTSTART)
// 电机驱动寄存器-驱动寄存器组
TMC5160_SPIWriteInt(0x6C, 0x04410153); // writing value 0x00410153 = 4260179 = 0.0 to address 41 = 0x6C(CHOPCONF)
TMC5160_SPIWriteInt(0x6D, 0x00000000); // writing value 0x00030000 = 196608 = 0.0 to address 42 = 0x6D(COOLCONF)
TMC5160_SPIWriteInt(0x6E, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 43 = 0x6E(DCCTRL)
TMC5160_SPIWriteInt(0x70, 0xC40C001E); // writing value 0xC40C001E = 0 = 0.0 to address 44 = 0x70(PWMCONF)
}
uint8_t data_t[5];//存放发送8bit*5的数据
void TMC5160_SPIWriteInt(uint8_t addr, uint32_t data)//将40位数据转换成5组8位数据并向电机发送
{
CS2_L;
delay_ns(10);
data_t[0] = addr | 0x80; //前8位为地址,写命令时需要加上0x80
int i;
for(i=1;i<5;i++) //后32位为数据
{
data_t[i] = (uint8_t)( data >> (32 - 8 * i) ); //32bit数据转换成8bit*4个
}
HAL_SPI_Transmit_IT(&hspi2, data_t, 5);
CS2_H;
delay_ns(10);
}
uint8_t data_r[5];//存放接收的8bit数据
void TMC5160_SPIReadInt(uint8_t addr)//从电机读取数据,先发送读请求,再接收数据
{
CS2_L;
delay_ns(10);
data_t[0] = addr & 0x7f; //前8位为地址
int i;
for(i=1;i<5;i++) //后32位为数据读访问时置零
{
data_t[i] = 0;
}
HAL_SPI_Transmit_IT(&hspi2, data_t, 5); //发送读取addr地址的请求,如果前一次访问是读访问,则传输回来的数据是前一个数据报一起传输的地址对应的读取值
HAL_SPI_Transmit_IT(&hspi2, data_t, 5); //发两次才能读到上次操作的数据
HAL_SPI_Receive_IT(&hspi2, data_r, 5); //接收数据
CS2_H;
delay_ns(10);
}
uint8_t data_r4 = 0; //用于观测读取到的地址
uint32_t data_r32 = 0;//用于观测读取到的数据
void tmc5160_act()
{
//TMC5160_SPIWriteInt(0x21,0x00000000); //XACTUAL = 0 实际位置归零
//TMC5160_SPIWriteInt(0x2D,0x0000C800); //XTARGET = 51200 转动一圈
TMC5160_SPIWriteInt(0x20,0x00000001);
TMC5160_SPIReadInt(0x20);
data_r4 = data_r[0];
data_r32 = (data_r[1]<<24)+(data_r[2]<<16)+(data_r[3]<<8)+data_r[4];
// TMC5160_SPIWriteInt(0x20,0x00000001);//RAMPMODE = 1 速度模式至+VMAX
}