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

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.参考代码(4相8拍,使用52840芯片驱动,使用P0.13、P0.14、P0.15、P0.16)

uint32_t control_IO[8] = {0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x18000, 0x10000, 0x12000};  //顺时针旋转     

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个脉冲

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章