embeded/Cortex-M3 STM

로터리 엔코더.. 2?

구차니 2026. 8. 31. 18:23

동료직원 괴롭혀서 실장!

R1_1에 10k가 없었는데 하나 달았다.

 

PB5 에 SW가 있고

 

 

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
void USB_CDC_RxHandler(uint8_t* Buf, uint32_t Len)
{
  for(int idx = 0; idx < Len;idx++)
  if(Buf[idx] == 0x0D) Buf[idx] = 0x0A;
CDC_Transmit_FS(Buf, Len);
}


#define BUF_SIZE 50
uint8_t usb_buf[BUF_SIZE];
uint32_t count = 0;

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 & 0x03];
    char curr = lut[curr_gpio & 0x03];
    if((prev  + 1) % 4 == curr)
    { isCW = 1; }

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

    prev_gpio = curr_gpio;
  }
}

 

풀업되어있다가 누르면 떨어지는거라

1이면 안누른거

0이면 누른걸로 인식된다.

35 1 0 CW, 1 rel
36 0 0 CW, 1 rel
37 0 1 CW, 1 rel
38 1 1 CW, 1 rel
39 1 0 CW, 1 rel
40 0 0 CW, 1 rel
41 0 1 CW, 1 rel
42 1 1 CW, 1 rel
43 0 1 CCW, 1 rel
44 0 0 CCW, 1 rel
45 1 0 CCW, 1 rel
46 1 1 CCW, 1 rel
47 0 1 CCW, 1 rel
48 0 0 CCW, 1 rel
49 1 0 CCW, 1 rel
50 1 1 CCW, 1 rel
51 0 1 CCW, 1 rel
52 0 0 CCW, 1 rel
53 0 0 CCW, 0 push
54 0 0 CCW, 1 rel

 

도대체 왜! 이거 부품이 안달려 있는거야?!