步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”。
步进电机的旋转是以固定的角度一步一步运行的可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲频率,来控制电机转动的速度和加速度,从而达到调速的目的。步进电机多用于数字式计算机的外部设备,以及打印机、绘图机和磁盘等装置。

优缺点

步进电机的优点和缺点都非常的突出,优点集中于控制简单、精度高,缺点是噪声、震动和效率,它没有累积误差,结构简单,使用维修方便,制造成本低。步进电机带动负载惯量的能力大,适用于中小型机床和速度精度要求不高的地方,缺点是效率较低、发热大,有时会“失步”。优缺点如下所示。

优点:

  • 电机操作易于通过脉冲信号输入到电机进行控制;
  • 不需要反馈电路以返回旋转轴的位置和速度信息(开环控制);
  • 由于没有接触电刷而实现了更大的可靠性。

    缺点:

  • 需要脉冲信号输出电路;

  • 当控制不适当的时候,可能会出现同步丢失;
  • 由于在旋转轴停止后仍然存在电流而产生热量。

    功能选择 (用驱动器面板上的 DIP 开关实现)

    设置电机每转步数

    驱动器可将电机每转的步数分别设置为 400、500、800、1000、1250、1600、2000、2500、3200、4000、5000、6400、8000、10000、12800步。
    image.png
    拨码开关 SW4 位可设置成两种控制方式:
    当设置成 “OFF”时,为有半流功能。
    当设置成 “ON”时,为无半流功能。

    设置输出相电流

    为了驱动不同扭矩的步进电机,用户可以通过驱动器面板上的拨码开关SW1、SW2、SW3 位来设置驱动器的输出相电流(有效值)单位安培,各开关位置对应的输出电流,不同型号驱动器所对应的输出电流值不同。具体见表。
    image.png
    半流功能是指无步进脉冲 500ms 后,驱动器输出电流自动降为额定输出电流的 70% ,用来防止电机发热。

    控制代码

    1. /*! \brief 以给定的步数移动步进电机
    2. * 通过计算加速到最大速度,以给定的步数开始减速
    3. * 如果加速度和减速度很小,步进电机会移动很慢,还没达到最大速度就要开始减速
    4. * \param step 移动的步数 (正数为顺时针,负数为逆时针).
    5. * \param accel 加速度,如果取值为100,实际值为100*0.01*rad/sec^2=1rad/sec^2
    6. * \param decel 减速度,如果取值为100,实际值为100*0.01*rad/sec^2=1rad/sec^2
    7. * \param speed 最大速度,如果取值为100,实际值为100*0.01*rad/sec=1rad/sec
    8. */
    9. void MSD_Move(signed int step, unsigned int accel, unsigned int decel, unsigned int speed)
    10. {
    11. //达到最大速度时的步数.
    12. unsigned int max_s_lim;
    13. //必须开始减速的步数(如果还没加速到达最大速度时)。
    14. unsigned int accel_lim;
    15. status.sys_step = step;
    16. status.sys_accel = accel;
    17. status.sys_decel = decel;
    18. status.sys_max_speed = speed;
    19. // 根据步数的正负来判断方向
    20. if(step < 0)//逆时针
    21. {
    22. srd.dir = CCW;//CCW=0,逆时针
    23. step = -step;
    24. }
    25. else//顺时针
    26. {
    27. srd.dir = CW;//CW=1,顺时针
    28. }
    29. // 输出电机方向
    30. DIR(srd.dir);
    31. // 配置电机为输出状态
    32. //status.out_ena = TRUE;
    33. // 如果只移动一步
    34. if(step == 1)
    35. {
    36. // 只移动一步
    37. srd.accel_count = -1;
    38. // 减速状态
    39. srd.run_state = DECEL;
    40. // 短延时
    41. srd.step_delay = 1000;
    42. // 配置电机为运行状态
    43. status.running = TRUE;
    44. //设置定时器重装值
    45. TIM_SetAutoreload(MSD_PULSE_TIM,Pulse_width);
    46. //设置占空比为50%
    47. TIM_SetCompare2(MSD_PULSE_TIM,Pulse_width>>1);
    48. //使能定时器
    49. TIM_Cmd(MSD_PULSE_TIM, ENABLE);
    50. }
    51. // 步数不为零才移动
    52. else if(step != 0)
    53. {
    54. // 我们的驱动器用户手册有详细的计算及推导过程
    55. // 设置最大速度极限, 计算得到min_delay用于定时器的计数器的值。每一个脉冲的周期最小值
    56. // min_delay = (alpha / tt)/ w
    57. srd.min_delay = A_T_x100 / speed;
    58. // 通过计算第一个(c0) 的步进延时来设定加速度,其中accel单位为0.01rad/sec^2
    59. // step_delay = 1/tt * sqrt(2*alpha/accel)
    60. // step_delay = ( tfreq*0.676/100 )*100 * sqrt( (2*alpha*10000000000) / (accel*100) )/10000
    61. srd.step_delay = (T1_FREQ_148 * sqrt(A_SQ / accel))/100;
    62. // 计算多少步之后达到最大速度的限制
    63. // max_s_lim = speed^2 / (2*alpha*accel)
    64. max_s_lim = (long)speed*speed/(long)(((long)A_x20000*accel)/100);
    65. // 如果达到最大速度小于0.5步,我们将四舍五入为0
    66. // 但实际我们必须移动至少一步才能达到想要的速度
    67. if(max_s_lim == 0)
    68. {
    69. max_s_lim = 1;
    70. }
    71. // 计算多少步之后我们必须开始减速
    72. // n1 = (n1+n2)decel / (accel + decel)
    73. accel_lim = ((long)step*decel) / (accel+decel);
    74. // 我们必须加速至少1步才能才能开始减速.
    75. if(accel_lim == 0)
    76. {
    77. accel_lim = 1;
    78. }
    79. // 使用限制条件我们可以计算出第一次开始减速的位置
    80. //srd.decel_val为负数
    81. if(accel_lim <= max_s_lim)
    82. {
    83. srd.decel_val = accel_lim - step;
    84. }
    85. else
    86. {
    87. srd.decel_val = -(long)(max_s_lim*accel/decel);
    88. }
    89. // 当只剩下一步我们必须减速
    90. if(srd.decel_val == 0)
    91. {
    92. srd.decel_val = -1;
    93. }
    94. // 计算开始减速时的步数
    95. srd.decel_start = step + srd.decel_val;
    96. // 如果最大速度很慢,我们就不需要进行加速运动
    97. if(srd.step_delay <= srd.min_delay)
    98. {
    99. srd.step_delay = srd.min_delay;
    100. srd.run_state = RUN;
    101. }
    102. else
    103. {
    104. srd.run_state = ACCEL;
    105. }
    106. // 复位加速度计数值
    107. srd.accel_count = 0;
    108. status.running = TRUE;
    109. //设置定时器重装值
    110. TIM_SetAutoreload(MSD_PULSE_TIM,Pulse_width);
    111. //设置占空比为50%
    112. TIM_SetCompare2(MSD_PULSE_TIM,Pulse_width>>1);
    113. //使能定时器
    114. TIM_Cmd(MSD_PULSE_TIM, ENABLE);
    115. }
    116. }

    驱动

    步进电机 - 图3
    步进电机 - 图4