STM32 G431RB与SABERTOOTH 2X32通信异常,电机驱动故障求助
SABERTOOTH 2X32与STM32 G431RB通信故障问题
问题背景
此前通过Arduino转接STM32 G431RB与SABERTOOTH 2X32电机驱动器通信,虽能正常驱动电机,但稳定性较差。移除Arduino直接连接两者后,完全无法建立通信。
第一次尝试:复刻Arduino通信信号
通过Hercules桌面软件捕获了Arduino发送给驱动器的有效信号,尝试用STM32的USART发送相同信号,但驱动器无任何响应。代码如下:
uint8_t openRightSS[5] = {0x31, 0x32, 0x30, 0x0D, 0x0A}; // 这些十六进制值是从Hercules捕获的,Arduino发送时驱动器能正常工作 HAL_UART_Transmit(&huart3, openRightSS,5,100);
官方协议尝试:数据包串行通信
查阅了SABERTOOTH 2X32的官方数据包串行通信文档,其中提到了CRC和校验和机制,但按照文档实现后仍无法驱动电机。
第二次尝试:按协议构造驱动指令
尝试按照官方协议构造电机正反转的指令数据包,编写了对应驱动函数,但问题依旧未解决。代码如下:
void driveForwardMotor1(uint8_t address, uint8_t speed) { HAL_UART_Transmit(&huart3, address, strlen(address), 1000); HAL_UART_Transmit(&huart3, 0, 1, 1000); HAL_UART_Transmit(&huart3, speed, strlen(speed), 1000); HAL_UART_Transmit(&huart3, ((address + 0 + speed) & (0b01111111)), strlen((address + 0 + speed) & (0b01111111)), 1000); } void driveBackwardMotor1(uint8_t address, uint8_t speed) { HAL_UART_Transmit(&huart3, address, strlen(address), 1000); HAL_UART_Transmit(&huart3, 1, 1, 1000); HAL_UART_Transmit(&huart3, speed, strlen(speed), 1000); HAL_UART_Transmit(&huart3, ((address + 1 + speed) & (0b01111111)), strlen((address + 1 + speed) & (0b01111111)), 1000); } void driveForwardMotor2(uint8_t address, uint8_t speed) { HAL_UART_Transmit(&huart3, address, strlen(address), 1000); HAL_UART_Transmit(&huart3, 4, 1, 1000); HAL_UART_Transmit(&huart3, speed, strlen(speed), 1000); HAL_UART_Transmit(&huart3, ((address + 4 + speed) & (0b01111111)), strlen((address + 4 + speed) & (0b01111111)), 1000); } void driveBackwardMotor2(uint8_t address, uint8_t speed) { HAL_UART_Transmit(&huart3, address, strlen(address), 1000); HAL_UART_Transmit(&huart3, 5, 1, 1000); HAL_UART_Transmit(&huart3, speed, strlen(speed), 1000); HAL_UART_Transmit(&huart3, ((address + 5 + speed) & (0b01111111)), strlen((address + 5 + speed) & (0b01111111)), 1000); }
内容的提问来源于stack exchange,提问作者cihadkck
相关产品推荐
相关产品推荐

