使用STM32L452RET控制TMC2209步进电机驱动器

问题描述 投票:0回答:1

我正在尝试使用 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文件。)

driver stm32 nucleo
1个回答
0
投票

昨天我的 TMC2209 驱动步进器出现卡顿。 Rason 的原因是电机线圈未正确连接。您可能需要使用欧姆表来验证您的

BR

© www.soinside.com 2019 - 2024. All rights reserved.