使用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個脈衝

 

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