TMC5160 可以驱动一个或两个直流电机。可控制转矩 ,或者在转矩限幅的同时控制电压控制速度。
TMC5160有A相和B相,每一个都可以控制一路直流电机,控制速度其实是控制A+和A-的压差实现的,输出的是50%的占空比(这个是打信号之后看到的,实际上手册没有讲)。
参考手册:TMC5160A_Datasheet_Rev1.15,注意是1.15版本,第21章
注意的地方:
如上图所示,最终可以控制XTARGET(0X2D)寄存器的8-0和24-16位来控制A相和B相的速度,但是是有符号的数据,符号控制正反转。
注意8-0是9个bit位,最高位第8bit是符号位,剩下7bit最大可以表示的数是255,所以转速大小由-255 ~ +255。
配置流程,上电直接写寄存器:
1.配置 GCONF(0x00) 寄存器的 direct_mode = 1;
GCONF(0x00) 寄存器的 en_pwm_mode = 1;
2.配置 PWMCONF(0x70) 寄存器的 pwm_autoscale = 0;
PWMCONF(0x70) 寄存器的 pwm_ofs = 255;
PWMCONF(0x70) 寄存器的 pwm_grad = 0;
3.配置
IHOLD_IRUN(0x10) 寄存器的 ihold = 31;
4.配置 CHOPCONF(0X6C)寄存器的 toff > 0 使能驱动器;这里我给的toff = 3;
5.直接配置寄存器 XTARGET 来控制转速,代码如下。
//设置A和B的转速,接口实现的是同一个转速,参数取值为-255 ~ +255
void TestMotorPwm(int16_t MotorIDPwm)
{
//第0到8位对应电机 A 相 和 第24到16位对应电机 B 相 PWM:二进制补码
int32_t Ax = 0;
int32_t Bx = 0;
Ax = MotorIDPwm & 0x1FF;//共9bit,这样直接按照二进制补码也把正负的符号取了
Bx = MotorIDPwm & 0x1FF;
uint32_t value = 0;
value = (Bx<<16&0x01FF0000) | (Ax & 0x1FF);//B相的在24-16位,A相8-0位
tmc5160Diver.XTARGET = value;
spi_write( tmc5160Diver.XTARGET);
}