STM32_12.TestEnkoderSerwo

Encoder to Servo Test Bench

Test bench łączący enkoder z serwem. Firmware wykorzystuje tryb enkodera timera STM32F411CEU6 i PWM serwa do precyzyjnego sterowania pozycją.

STM32F4CHALEncoderServoTimer PWM

Informacje

  • Repozytorium: STM32_12.TestEnkoderSerwo
  • Płytka / obszar: STM32F411CEU / TIM encoder + PWM servo
  • Kategoria: Motion control
  • Status: Public repository

Opis techniczny

  • Kod startuje PWM na TIM10 oraz tryb enkodera na TIM4, a następnie cyklicznie odczytuje licznik TIM4->CNT.
  • Zakres serwa jest opisany stałymi START_POSITION i END_POSITION, które określają kalibrację impulsów sterujących serwem.
  • Funkcja percentToServoPosition() przelicza wejście na pozycję serwa, a setServoPosition() aktualizuje rejestr compare timera PWM.
  • Firmware używa dwóch timerów STM32 w różnych rolach: TIM4 pracuje jako wejście enkodera, a TIM10 generuje PWM dla serwa.
  • Główna pętla odczytuje licznik enkodera, skaluje wartość wejściową i aktualizuje pozycję serwa przez rejestr compare timera.

Co dzieje się w kodzie

Wybrane najważniejsze mechanizmy z projektu.

  • Główny mechanizm działania opiera się na odczycie licznika TIM4->CNT z enkodera i przekształceniu go na odpowiednią pozycję serwa.
  • Funkcja percentToServoPosition() przelicza wartość z enkodera na impuls PWM dla serwa, z wykorzystaniem stałych START_POSITION i END_POSITION.
  • Funkcja setServoPosition() aktualizuje rejestr compare timera TIM10, co powoduje odpowiednią pozycję serwa.
  • Kod implementuje prostą logikę przekształcenia impulsów enkodera na pozycję serwa bez konieczności dodatkowego sterowania.
  • Zastosowanie TIM4 w trybie enkodera pozwala na dokładne śledzenie ruchu wału, a TIM10 generuje odpowiednie impulsy PWM dla serwa.

Kluczowe fragmenty kodu

Kod jest skrócony do części istotnych dla zrozumienia projektu.

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.