首页 论坛 原厂专区 TRINAMIC嵌入式运动控制 基于STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB图/

发帖 回复

[资料] 基于STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB图/
4561 查看
24 回复
 楼主 | 发布于 2020-04-29 | 只看楼主
分享到:

基于STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB图/教程/源码/数据手册等开源分享

资料下载见附件,电脑登入 

技术群:171897584

参考视频链接:http://club.digiic.com/Video/VideoDetail/38de7d90-5224-4485-8a8d-943ea1d00120 

CUBE界面引脚配置:


定时器1的PWM输出通道1设置: 


本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(1 ) (0 )
回复 举报

楼主 | 回复于 2020-04-29 11#

三、拨码开关设置

拨码开关ON:设置为高电平1,反之低电平0

细分设置:CFG1CFG0

CFG1、CFG0

    11:64细分

10:32细分

01:16细分

00:8细分

运行电流设置:CFG4CFG3CFG2

CFG4、CFG3CFG2

    111:IRUN=31

    110:IRUN=28

    101:IRUN=26

100:IRUN=24

011:IRUN=22

010:IRUN=20

001:IRUN=18

000:IRUN=16

Irms=Vfs/(IRUN/32)/(Rsense*1.414);

Vfs =325mV,Rsense0.05欧时,则最大电流为4.5A左右;

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 12#

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 13#

斩波模式选择:CFG5

CFG5:

1:SpreadCyle模式,低速、低平稳运行模式

0:SpreadCyle模式,高速、高运动稳定模式

保持电流设置:CFG6

CFG6:

1:保持电流=运行电流/2

0:保持电流=运行电流

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 14#

四、软件说明

DIR+STEP接口模式位置控制(无需SPI接口)

COM端:接24V12V5V

DRV_ENN、STERDIR:接集电极开路输出

为测试方便:

    COM端:接3.3V

    DRV_ENN:使能,接PB14

DIR:方向, PB15

STEP:脉冲,PA8

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 15#

初始化程序如下参考:

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART2_UART_Init();

  MX_TIM1_Init();

    STEPMOTOR_TIMx_Init();      /定时器输出初始化

  /* USER CODE BEGIN 2 */

    STEPMOTOR_OUTPUT_DISABLE(); //TMC2160禁止使能

  /* USER CODE END 2 */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */

       STEPMOTOR_AxisMoveRel(6400*-2, 5000 , 5000 , 1200);         //控制TMC2160驱动步进电机反转2圈(32细分,1.8度则一圈需要6400个脉冲)

       LedOnOff();              //LED闪烁处理

       STEPMOTOR_AxisMoveRel(6400*2, 5000 , 5000 , 1200);          //控制TMC2160驱动步进电机反转2圈(32细分,1.8度则一圈需要6400个脉冲)

       LedOnOff();              //LED闪烁处理

    /* USER CODE BEGIN 3 */

  }

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 16#

//相对位置移动参考(参考硬石的电机开发板资料)

/**

  * 函数功能: 相对位置运动:运动给定的步数

  * 输入参数: step:移动的步数 (正数为顺时针,负数为逆时针).

              accel  加速度,实际值为accel*0.1*rad/sec^2

              decel  减速度,实际值为decel*0.1*rad/sec^2

              speed  最大速度,实际值为speed*0.1*rad/sec

  * 返 回 值:

  * 说    : 以给定的步数移动步进电机,先加速到最大速度,然后在合适位置开始

  *           减速至停止,使得整个运动距离为指定的步数。如果加减速阶段很短并且

  *           速度很慢,那还没达到最大速度就要开始减速

  */

void STEPMOTOR_AxisMoveRel(__IO int32_t step, __IO uint32_t accel, __IO uint32_t decel, __IO uint32_t speed)

  __IO uint16_t tim_count;

  // 达到最大速度时的步数

  __IO uint32_t max_s_lim;

  // 必须要开始减速的步数(如果加速没有达到最大速度)

  __IO uint32_t accel_lim;

 

  if(step < 0) // 步数为负数

  {

    srd.dir = CCW; // 逆时针方向旋转

    STEPMOTOR_DIR_REVERSAL();

    step =-step;   // 获取步数绝对值

  }

  else

  {

    srd.dir = CW; // 顺时针方向旋转

    STEPMOTOR_DIR_FORWARD();

  }

 

  if(step == 1)    // 步数为1

  {

    srd.accel_count = -1;   // 只移动一步

    srd.run_state = DECEL;  // 减速状态.

    srd.step_delay = 1000;  // 短延时 

  }

  else if(step != 0)  // 如果目标运动步数不为0

  {

    // 我们的驱动器用户手册有详细的计算及推导过程

 

    // 设置最大速度极限, 计算得到min_delay用于定时器的计数器的值。

    // min_delay = (alpha / tt)/ w

    srd.min_delay = (int32_t)(A_T_x10/speed);

 

    // 通过计算第一个(c0) 的步进延时来设定加速度,其中accel单位为0.1rad/sec^2

    // step_delay = 1/tt * sqrt(2*alpha/accel)

    // step_delay = ( tfreq*0.676/10 )*10 * sqrt( (2*alpha*100000) / (accel*10) )/100

    srd.step_delay = (int32_t)((T1_FREQ_148 * sqrt(A_SQ / accel))/10);

 

    // 计算多少步之后达到最大速度的限制

    // max_s_lim = speed^2 / (2*alpha*accel)

    max_s_lim = (uint32_t)(speed*speed/(A_x200*accel/10));

    // 如果达到最大速度小于0.5步,我们将四舍五入为0

    // 但实际我们必须移动至少一步才能达到想要的速度

    if(max_s_lim == 0){

      max_s_lim = 1;

    }

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 17#

//相对位置移动参考(参考硬石的电机开发板资料)

/**

  * 函数功能: 相对位置运动:运动给定的步数

  * 输入参数: step:移动的步数 (正数为顺时针,负数为逆时针).

              accel  加速度,实际值为accel*0.1*rad/sec^2

              decel  减速度,实际值为decel*0.1*rad/sec^2

              speed  最大速度,实际值为speed*0.1*rad/sec

  * 返 回 值:

  * 说    : 以给定的步数移动步进电机,先加速到最大速度,然后在合适位置开始

  *           减速至停止,使得整个运动距离为指定的步数。如果加减速阶段很短并且

  *           速度很慢,那还没达到最大速度就要开始减速

  */

void STEPMOTOR_AxisMoveRel(__IO int32_t step, __IO uint32_t accel, __IO uint32_t decel, __IO uint32_t speed)

  __IO uint16_t tim_count;

  // 达到最大速度时的步数

  __IO uint32_t max_s_lim;

  // 必须要开始减速的步数(如果加速没有达到最大速度)

  __IO uint32_t accel_lim;

 

  if(step < 0) // 步数为负数

  {

    srd.dir = CCW; // 逆时针方向旋转

    STEPMOTOR_DIR_REVERSAL();

    step =-step;   // 获取步数绝对值

  }

  else

  {

    srd.dir = CW; // 顺时针方向旋转

    STEPMOTOR_DIR_FORWARD();

  }

 

  if(step == 1)    // 步数为1

  {

    srd.accel_count = -1;   // 只移动一步

    srd.run_state = DECEL;  // 减速状态.

    srd.step_delay = 1000;  // 短延时 

  }

  else if(step != 0)  // 如果目标运动步数不为0

  {

    // 我们的驱动器用户手册有详细的计算及推导过程

 

    // 设置最大速度极限, 计算得到min_delay用于定时器的计数器的值。

    // min_delay = (alpha / tt)/ w

    srd.min_delay = (int32_t)(A_T_x10/speed);

 

    // 通过计算第一个(c0) 的步进延时来设定加速度,其中accel单位为0.1rad/sec^2

    // step_delay = 1/tt * sqrt(2*alpha/accel)

    // step_delay = ( tfreq*0.676/10 )*10 * sqrt( (2*alpha*100000) / (accel*10) )/100

    srd.step_delay = (int32_t)((T1_FREQ_148 * sqrt(A_SQ / accel))/10);

 

    // 计算多少步之后达到最大速度的限制

    // max_s_lim = speed^2 / (2*alpha*accel)

    max_s_lim = (uint32_t)(speed*speed/(A_x200*accel/10));

    // 如果达到最大速度小于0.5步,我们将四舍五入为0

    // 但实际我们必须移动至少一步才能达到想要的速度

    if(max_s_lim == 0){

      max_s_lim = 1;

    }

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 18#

 // 计算多少步之后我们必须开始减速

    // n1 = (n1+n2)decel / (accel + decel)

    accel_lim = (uint32_t)(step*decel/(accel+decel));

    // 我们必须加速至少1步才能才能开始减速.

    if(accel_lim == 0){

      accel_lim = 1;

    }

 

    // 使用限制条件我们可以计算出减速阶段步数

    if(accel_lim <= max_s_lim){

      srd.decel_val = accel_lim - step;

    }

    else{

      srd.decel_val = -(max_s_lim*accel/decel);

    }

    // 当只剩下一步我们必须减速

    if(srd.decel_val == 0){

      srd.decel_val = -1;

    }

 

    // 计算开始减速时的步数

    srd.decel_start = step + srd.decel_val;

 

    // 如果最大速度很慢,我们就不需要进行加速运动

    if(srd.step_delay <= srd.min_delay){

      srd.step_delay = srd.min_delay;

      srd.run_state = RUN;

    }

    else{

      srd.run_state = ACCEL;

    }   

    // 复位加速度计数值

    srd.accel_count = 0;

  }

  MotionStatus = 1; // 电机为运动状态

  tim_count=__HAL_TIM_GET_COUNTER(&htimx_STEPMOTOR);

  __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,STEPMOTOR_TIM_CHANNEL_x,tim_count+srd.step_delay); // 设置定时器比较值

  TIM_CCxChannelCmd(STEPMOTOR_TIMx, STEPMOTOR_TIM_CHANNEL_x, TIM_CCx_ENABLE);                          // 使能定时器通道

  STEPMOTOR_OUTPUT_ENABLE();

}

(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 19#

//定时器中断函数参考


(0 )
评论 (0) 举报

楼主 | 回复于 2020-04-29 20#

五、开源补充说明

    如果确实需要原理图和PCB的用户,请联系我们的客服或管理员私下索取谢谢!

 

(0 )
评论 (0) 举报
发表回复
0/3000





举报

请选择举报类别

  • 广告垃圾
  • 违规内容
  • 恶意灌水
  • 重复发帖

全部板块

返回顶部