Przekształcanie wartości enkodera na pozycję serwa
Core/Src/main.c uint16_t percentToServoPosition(bool mode, uint16_t percent)
{
uint16_t ret =0;
float div = (percent/100.0f);
if(mode)
ret =START_POSITION + div * (END_POSITION - START_POSITION);
else
ret =END_POSITION - div * (END_POSITION - START_POSITION);
return ret;
}
Funkcja przekształca wartość z enkodera na odpowiednią pozycję serwa. Wartości są skalowane w zakresie od START_POSITION do END_POSITION, co pozwala na precyzyjne sterowanie pozycją serwa.
Ustawianie pozycji serwa
Core/Src/main.c void setServoPosition(uint16_t position)
{
__HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1, position);
}
Funkcja ustawia pozycję serwa poprzez aktualizację rejestru compare timera TIM10. Wartość przekazana do funkcji jest bezpośrednio wartością impulsu PWM.
Główna pętla sterująca
Core/Src/main.c __HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1, START_POSITION);
uint16_t servoPosition = 0;
while (1)
{
pulse_count = TIM4->CNT; // przepisanie wartosci z rejestru timera
positions = pulse_count/4; // zeskalowanie impulsow do liczby stabilnych pozycji walu enkodera
servoPosition = percentToServoPosition(true, pulse_count);
setServoPosition(servoPosition);
}
Główna pętla odczytuje licznik enkodera, skaluje wartość i ustawia odpowiednią pozycję serwa. Wartość jest przekształcana przez funkcję percentToServoPosition i ustawiana przez setServoPosition.