我正在尝试使用 STM32L452 Nucleo 板运行 TMC2209 步进电机驱动器(BIGTREETECH TMC2209 V1.3 模块在此处输入链接描述)。我使用 PC9 作为启用引脚,PC8 作为 STEP 引脚,PC7 作为 DIR 引脚,PC6 作为 DIAG EXTI。我想使用UART通信接口(Uart1)来读取步进电机状态并传输控制命令(速度,加速度,运动角度......)(在调试期间:它似乎可以传输命令)。我已按照数据表中的描述连接它(带有电阻的单传输线)。
代码参考 Trinamic 的示例和驱动程序 (https://github.com/trinamic) 我也按照 Trinamic 提供的步骤进行操作:
1.在代码中实现 tmcXXXX_readWriteArray() 函数。此功能提供对 TMC-API 的必要硬件访问。
void tmc2209_readWriteArray(uint8_t channel, uint8_t *data, size_t writeLength, size_t readLength)
{
HAL_UART_Transmit(&huart1, data, writeLength, HAL_MAX_DELAY);
uint8_t buffer[9];
if (readLength) {
HAL_StatusTypeDef rx_status = HAL_UART_Receive(&huart1, buffer, readLength+1, 10);
last_tmc_read_attempt_ms = HAL_GetTick();
memcpy(data, &(buffer[1]), readLength);
}
}
2.为设计中的每个 Trinamic IC 调用一次 tmcXXXX_init()。该函数初始化一个代表一个物理 IC 的 IC 对象。
void STEPPER_INIT(void)
{
tmc_fillCRC8Table(0x07, true, 0);
// load whatever we've got from either boot into motor stat
tmc2209_init(&TMC2209, 0, 0, &TMC2209_config, &tmc2209_defaultRegisterResetState[0]);
TMC2209_config.shadowRegister[TMC2209_GCONF] = 0x00000040;
TMC2209_config.shadowRegister[TMC2209_IHOLD_IRUN] = 0x00071703;
TMC2209_config.shadowRegister[TMC2209_TPOWERDOWN] = 0x00000008;
TMC2209_config.shadowRegister[TMC2209_CHOPCONF] = 0x10000053;
TMC2209_config.shadowRegister[TMC2209_PWMCONF] = 0xC10D0024;
TMC2209_config.shadowRegister[TMC2209_GCONF] &= (~TMC2209_I_SCALE_ANALOG_MASK);
TMC2209_config.shadowRegister[TMC2209_GCONF] |= TMC2209_PDN_DISABLE_MASK;
TMC2209_config.shadowRegister[TMC2209_GCONF] |= TMC2209_MSTEP_REG_SELECT_MASK;
TMC2209_config.shadowRegister[TMC2209_GCONF] |= TMC2209_SHAFT_MASK;
TMC2209_config.shadowRegister[TMC2209_GCONF] &= (~TMC2209_MULTISTEP_FILT_MASK);
TMC2209_config.shadowRegister[TMC2209_CHOPCONF] &= (~TMC2209_MRES_MASK);
TMC2209_config.shadowRegister[TMC2209_CHOPCONF] |= (0 << TMC2209_MRES_SHIFT) & TMC2209_MRES_MASK;
TMC2209_config.shadowRegister[TMC2209_CHOPCONF] |= (0xA << TMC2209_TOFF_SHIFT) & TMC2209_TOFF_MASK;
TMC2209_config.shadowRegister[TMC2209_CHOPCONF] |= TMC2209_DEDGE_MASK;
TMC2209_config.shadowRegister[TMC2209_COOLCONF] = 0;
TMC2209_config.shadowRegister[TMC2209_TCOOLTHRS] = 0xFFFFFFFF;
TMC2209_config.shadowRegister[TMC2209_IHOLD_IRUN] &= (~TMC2209_IHOLDDELAY_MASK);
TMC2209_config.shadowRegister[TMC2209_IHOLD_IRUN] |= (3 << TMC2209_IHOLDDELAY_SHIFT) & TMC2209_IHOLDDELAY_MASK;
StepDir_init(STEPDIR_PRECISION);
StepDir_setPins(0);
StepDir_setVelocityMax(0, 51200);
StepDir_setAcceleration(0, 51200);
}
(影子寄存器的定义取自这个https://github.com/AlistairSymonds/SympleAstroFocus示例) 3.定期调用tmcXXXX_periodicJob()。传递毫秒时间戳作为刻度参数。
static void periodicJob(uint32_t tick)
{
tmc2209_periodicJob(&TMC2209, tick);
StepDir_periodicJob(0);
}
4.初始化后,调用tmcXXXX_reset()或tmcXXXX_restore(),TMC-API将向IC写入多个寄存器(简称IC配置)。
5.每次调用 tmcXXXX_periodicJob(),都会写入一个寄存器,直到 IC 配置完成。
6.IC配置完成后,即可使用tmcXXXX_readInt()和tmcXXXX_writeInt()读写寄存器。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_USART1_UART_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
STEPPER_INIT();
HAL_TIM_Base_Start_IT(&htim3);
tmc2209_reset(&TMC2209);
tmc2209_restore(&TMC2209);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(enable == 1){
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET);
}
else if(enable == 0){
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET);
}
right(0,20000);
periodicJob(HAL_GetTick());
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
实际上,任务是将 Trinamic 在 TMC Evalsystem 示例中提供的 StepDir.h 和 StepDir.c 文件调整为我的硬件:(https://github.com/trinamic/TMC-EvalSystem)平台(并相应地设置主要功能)。驱动程序文件 TMC2209.c 和 TMC2209.h(+ 斜坡和辅助功能)保持不变。
我的电机只是弹跳,没有朝特定方向移动。
有人有类似的问题并将示例从 Trinamic 调整到另一个 STM32 芯片吗?
(如果需要的话我也可以提供我的main.c,StepDic.c和StepDir.h文件。)
昨天我的 TMC2209 驱动步进器出现卡顿。 Rason 的原因是电机线圈未正确连接。您可能需要使用欧姆表来验证您的
BR