TMC4671的EN引脚一定要拉高电平,SPI的通讯设置我就不多说了,我也是才调试出来,也仅仅做了一个运动控制,让他跑起来,其他更深入的还暂时未涉及。
我使用的是STM32F429IGT6的板子,然后画的PCB板,大家根据自己的需求进行更改。
首先初始化TMC4671的EN引脚,只有上电给高电平之后,才能向TMC4671之中写入数据,就好像UART的ENABLE使能一样。
我这边EN引脚是F2,做复用推挽输出,然后将电平拉高了。
GPIO_Str.Pin = GPIO_PIN_2;
GPIO_Str.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Str.Pull = GPIO_NOPULL;
GPIO_Str.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOF, &GPIO_Str);
//将引脚拉高
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_2, GPIO_PIN_SET);
接下来就是直接进行TMC4671和TMC6200的配置了
我这里用的函数uint32_t TMC6200_ReadWrite_Data(uint8_t AddR, uint32_t Data, uint8_t RW);
uint8_t AddR : 地址
uint32_t Data : 32位的数据
uint8_t RW : 读写位 1表示写,0表示读
TMC6200_ReadWrite_Data(TMC6200_GCONF , 0x00000000, 1); //0x00
TMC6200_ReadWrite_Data(TMC6200_OTP_PROGRAM , 0x00000000, 1); //0x06
TMC6200_ReadWrite_Data(TMC6200_FACTORY_CONF , 0x0000000E, 1); // 0x08
TMC6200_ReadWrite_Data(TMC6200_SHORT_CONF , 0x13010606, 1); //0x09
TMC6200_ReadWrite_Data(TMC6200_DRV_CONF , 0x00000004, 1); //0x0A
TMC6200_ReadWrite_Data(TMC6200_GSTAT , 0x0000FFFF, 1);//0x01
TMC6200_ReadWrite_Data(0x09 , 0x00000000, 0); //验证6200SPI通信
TMC4671_ReadWrite_Data(0x00,0x00000000,0); //返回值为十进制的875968305表示返回正确的4671
不管是TMC6200还是TMC4671一定要看好数据手册里面的读写,并且实验一下,读出来的和写进去的数据是否一致。在初始化完毕TMC6200之后,可以进行一下读取TMC4671的0x00地址,看看返回的数据是否是十进制的875968305,转换成16进制会是ASCII码3436 3731,也就是4671
//Motor_Type & PWM configuration
TMC4671_ReadWrite_Data(TMC4671_MOTOR_TYPE_N_POLE_PAIRS, 0x00030007, 1); //0x1B 电机类型和电机的极对数
TMC4671_ReadWrite_Data(TMC4671_PWM_POLARITIES , 0x00000000, 1); //0x17 高低侧门控制信号的极性
TMC4671_ReadWrite_Data(TMC4671_PWM_MAXCNT , 0x00000F9F, 1); //0x18 PWM的频率
TMC4671_ReadWrite_Data(TMC4671_PWM_BBM_H_BBM_L, 0x00001919, 1); //0x19 超时时间
TMC4671_ReadWrite_Data(TMC4671_PWM_SV_CHOP , 0x00000007, 1); //0x1A 关闭空间矢量 打开PWM的FOC
//开环的情况下读取IO I1
TMC4671_ReadWrite_Data(TMC4671_OPENLOOP_MODE , 0x000000000, 1); //0x1F 正反转
TMC4671_ReadWrite_Data(TMC4671_PHI_E_SELECTION, 0x00000002, 1); //0x52 开环
TMC4671_ReadWrite_Data(TMC4671_MODE_RAMP_MODE_MOTION, 0x00000008, 1);//0x63 uq_ud_ext
TMC4671_ReadWrite_Data(TMC4671_UQ_UD_EXT , 0x000005DC, 1); //0x24 电流
TMC4671_ReadWrite_Data(TMC4671_OPENLOOP_ACCELERATION, 0x0000003C, 1);//0x20 开环的加速度
TMC4671_ReadWrite_Data(TMC4671_OPENLOOP_VELOCITY_TARGET, 0x000000FF, 1);//0x21开环的目标速度
TMC4671_ReadWrite_Data(TMC4671_PHI_E_EXT , 0x00000000, 1); //0x1C 电角度
//TMC4671_ReadWrite_Data(TMC4671_ADC_RAW_ADDR , 0x00000000, 1);
一定要烧写完成之后给板子完全断电,当时实验时,因为没有断电的原因,可能程序是正确的,也不会跑起来,当时浪费一下午时间来调试,发现是没有完全断电的问题。
大家如果有需要可以自取,我也是初学者,如果有什么问题欢迎指正。谢谢大家