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

Maximum Rotation Speed 55,000 RPM
회로는 아래처럼 구성되어 있고 ABZ모드를 사용하였다.

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



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;
}
