150 lines
7.9 KiB
C
150 lines
7.9 KiB
C
#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->速度模式至正VMAMX;2->速度模式至负VMAX;3->速度保持不变,最多使用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
|
||
|
||
}
|
||
|