embeded/Cortex-M3 STM

bluepill / 로터리 엔코더 테스트

구차니 2026. 8. 28. 12:40

오래되서 기억도 안나네 ㅋㅋ

PB5 - SW (스위치) <- 먼가 오작동.  + 쪽 3V3과 연결되지 않고 따로 전원 연결해줘야 하는 듯.

PB4 - CLK (로터리)

PB3 - DT (로터리)

귀찮아서 USB CDC 를 통해서 출력하게 함.

#define BUF_SIZE 50
uint8_t usb_buf[BUF_SIZE];
uint32_t count = 0;
int prev_gpio = 0;
void gpio_proc()
{
  int curr_gpio = 0;
  GPIO_PinState gpios[3];
  curr_gpio |= (gpios[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3));
  curr_gpio |= (gpios[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)) << 1;
  curr_gpio |= (gpios[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)) << 2;

  if(prev_gpio != curr_gpio)
  {
    sprintf((char*)usb_buf, "%ld %d %d %d\r\n", count, gpios[2], gpios[1], gpios[0]);
    CDC_Transmit_FS(usb_buf, BUF_SIZE);
    memset(usb_buf,0,BUF_SIZE);
    count++;

    prev_gpio = curr_gpio;
  }
}

 

시계방향 회전. 두 번 딱딱 걸리고 다시 0 0 0  으로 돌아온다.

[2026-08-28 12:20:17.496] 1897 0 0 0                                            
[2026-08-28 12:20:20.417] 1898 0 0 1                                            
[2026-08-28 12:20:20.469] 1899 0 1 1                                            
[2026-08-28 12:20:20.735] 1900 0 1 0                                            
[2026-08-28 12:20:20.767] 1901 0 0 0

 

반시계방향 회전

[2026-08-28 12:20:20.767] 1901 0 0 0                                            
[2026-08-28 12:20:21.906] 1902 0 1 0                                            
[2026-08-28 12:20:21.959] 1903 0 1 1                                            
[2026-08-28 12:20:22.202] 1904 0 0 1                                            
[2026-08-28 12:20:22.233] 1905 0 0 0  

 

정방향 0 - 1 - 3 - 2 - 0 으로

역방향 0 - 2 - 3 - 1 - 0 으로

표현되긴한데.. gray code 같기도 하고?

[링크 : https://woodforest.tistory.com/147]

 

그래서 저 값을 가지고 판단을 하면 이제 CW 방향인지 CCW 방향인지 판단이 가능해진다.

char prev_gpio = 0;
void gpio_proc()
{
  char curr_gpio = 0;
  GPIO_PinState gpios[3];
  curr_gpio |= (gpios[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3));
  curr_gpio |= (gpios[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)) << 1;
  // curr_gpio |= (gpios[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)) << 2;

  char lut[4] = {0, 1, 3, 2};

  if(prev_gpio != curr_gpio)
  {
    char isCW = 0;
    char prev = lut[prev_gpio];
    char curr = lut[curr_gpio];
    if((prev  + 1) % 4 == curr)
    { isCW = 1; }

    sprintf((char*)usb_buf, "%ld %d %d %s\r\n", count, gpios[1], gpios[0], isCW?"CW":"CCW");
    CDC_Transmit_FS(usb_buf, BUF_SIZE);
    memset(usb_buf,0,BUF_SIZE);
    count++;

    prev_gpio = curr_gpio;
  }
}

 

테스트 끝!

[2026-08-28 12:33:57.522] 0 0 1 CW                                              
[2026-08-28 12:33:57.555] 1 1 1 CW                                              

[2026-08-28 12:33:58.521] 2 1 0 CW                                              
[2026-08-28 12:33:58.553] 3 0 0 CW                                              

[2026-08-28 12:33:59.452] 4 1 0 CCW                                             
[2026-08-28 12:33:59.496] 5 1 1 CCW                                             

[2026-08-28 12:34:00.156] 6 1 0 CW                                              
[2026-08-28 12:34:00.178] 7 0 0 CW                                              

[2026-08-28 12:34:00.729] 8 1 0 CCW // 반시계 방향 한번 돌리기
[2026-08-28 12:34:00.779] 9 1 1 CCW                                             

[2026-08-28 12:34:04.895] 10 0 1 CCW // 드륵 느낌이 안나게 반시계 방향으로 천천히 돌림

[2026-08-28 12:34:06.098] 11 1 1 CW    // 드륵 느낌이 날때까지 시계 방향으로 돌림

[2026-08-28 12:34:07.518] 12 0 1 CCW  // 드륵 느낌이 안나게 반시계 방향으로 천천히 돌림

[2026-08-28 12:34:08.590] 13 1 1 CW  // 드륵 느낌이 날때까지 시계 방향으로 돌림

[2026-08-28 12:34:09.858] 14 0 1 CCW                                            
[2026-08-28 12:34:09.916] 15 0 0 CCW                                            

[2026-08-28 12:34:11.124] 16 1 0 CCW                                            
[2026-08-28 12:34:11.154] 17 1 1 CCW                                            

[2026-08-28 12:34:12.087] 18 1 0 CW                                             
[2026-08-28 12:34:12.127] 19 0 0 CW                                             

[2026-08-28 12:34:12.444] 20 0 1 CW                                             
[2026-08-28 12:34:12.476] 21 1 1 CW                                             

[2026-08-28 12:34:12.673] 22 1 0 CW                                             
[2026-08-28 12:34:12.693] 23 0 0 CW                                             

[2026-08-28 12:34:12.746] 24 0 1 CW                                             
[2026-08-28 12:34:12.778] 25 1 1 CW                                             

[2026-08-28 12:34:12.913] 26 1 0 CW  

 

역시 딴짓은 시원한 에어컨과

회사 전기와, 월급을 받으면서 딴짓을 해야 잘됨 ㅋㅋㅋ