이번에 사용하는 엔코더는 MT6701 로 자기식 엔코더이다 .

image.png

Maximum Rotation Speed 55,000 RPM

회로는 아래처럼 구성되어 있고 ABZ모드를 사용하였다.

image.png

기본 PPR이 상당히 낮게 설정되어있어서 다른보드에 연결해서 I2C로 PPR를 최대치로 올려두었다.

image.png

image.png

image.png

STM32 엔코더 모드를 사용하면 쉽게 엔코더의 값을 읽어 올 수 있다.

 HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
 __HAL_TIM_SET_COUNTER(&htim3, 0);

시작하고 값 초기화 후 get_counter를 통해서 raw데이터를 읽어올 수 있다.

__HAL_TIM_GET_COUNTER(&htim3);
float encoderGetAngle(void)
{
    float angle;

    angle = (float)enc_pos * 360.0f / (PPR * 4);

    while(angle >= 360.0f) angle -= 360.0f;
    while(angle < 0.0f)    angle += 360.0f;

    return angle;
}

void encoderUpdate(void)
{
    uint16_t now;
    int32_t  diff;

    now = (uint16_t)__HAL_TIM_GET_COUNTER(&htim3);

    diff = (int32_t)now - (int32_t)enc_prev;

    if(diff > 32768)  diff -= 65536;
    if(diff < -32768) diff += 65536;

    enc_prev = now;
    //노이즈 제거
    if(diff > 1000 || diff < -1000)
    {
        return;
    }

    // 방향
    if(diff > 0)
        enc_dir = +1;
    else if(diff < 0)
        enc_dir = -1;
    else
        enc_dir = 0;

    enc_pos += diff;
}

image.png