黄工无刷电机学习
直播中

李晨灵

8年用户 1524经验值
私信 关注
[问答]

如何使用PWM的相位控制步进电机正反转和加减速?

如何使用PWM的相位控制步进电机正反转和加减速?

回帖(1)

曾培中

2021-10-14 15:53:55
1.步进电机在3D打印上用的比较多,因为步长是固定的,因此能够精准的控制转动产生的位移
  


DC 5V 4相8拍5线步进电机 28YBJ-48 / 驱动芯片型号:uln2003芯片
2.驱动原理






                                                      














3.驱动时序
3.1 4相8拍





3.2 4相单4拍





3.3 4相双4拍






4.1 控制步进电机正反转


static void demo1(void) {
  NRF_LOG_INFO("Demo 1 循环5次正反转后停止");
  uint16_t i,j;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 512; i++) {
      for (j = 0; j < 8; j++) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    for (i = 0; i < 512; i++) {
      for (j = 7; j > 0; j--) {
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    if(++count == 5)
    {
      break;
    }
  }
}
4.2 控制电机减速旋转


static void demo2(void)
{
  NRF_LOG_INFO("Demo 2/减速旋转5次后停止");
  uint16_t i,j;
  uint16_t speed = 1;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 512; i++) {
      for (j = 0; j < 8; j++) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(speed);
      }
    }
    NRF_P0->OUT = 0x00;
    if(speed < 3)
    {
      speed++;
      nrf_delay_ms(500);
    }
    else
    {
      speed = 1;
    }
    if(++count == 5)
    {
      break;
    }
  }
}
4.3控制电机加速旋转


static void demo3(void)
{
  NRF_LOG_INFO("Demo 3/加速旋转5次后停止");
  uint16_t i,j;
  uint16_t speed = 3;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 512; i++) {
      for (j = 0; j < 8; j++) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(speed);
      }
    }
    NRF_P0->OUT = 0x00;
    if(speed > 0)
    {
      speed--;
      nrf_delay_ms(500);
    }
    else
    {
      speed = 3;
    }
    if(++count == 5)
    {
      break;
    }
  }
}
4.4 逆时针旋转90°


static void demo4(void)
{
  NRF_LOG_INFO("Demo 4/逆时针旋转90°");
  uint16_t i,j;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 128; i++) {
      for (j = 7; j > 0; j--) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    if(++count == 5)
    {
      break;
    }
  }
}
4.5 逆时针旋转180度


static void demo5(void)
{  
  NRF_LOG_INFO("Demo 5/逆时针旋转 180度");
  uint16_t i,j;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 256; i++) {
      for (j = 7; j > 0; j--) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    if(++count == 5)
    {
      break;
    }
  }
}
旋转角度A与脉冲数B的关系
A = (5.625°/64)*B
若A等于360°,那么需要4096个脉冲
举报

更多回帖

发帖
×
20
完善资料,
赚取积分