Sterownik modelu helikoptera na STM32 z manipulatorami MEMS
Na rysunku 4 przedstawiono przebiegi ramki danych odpowiadające powyższym zależnościom, są one generowane programowo przez mikrokontroler STM32F4. Dla każdego pola przedstawiono ustawienia timera wbudowanego w mikorkontroler w trybie generacji przebiegu PWM, przy założeniu, że SystemCoreClock = 168 MHz.
Rys. 4. Przebiegi ramki danych wraz z ustawieniem timera w trybie generacji przebiegu PWM, przy założeniu, że SystemCoreClock = 168 MHz
Główna pętla maszyny stanów programu zaimplementowanego w programie dla mikrokontrolera:
switch (cState)
{
case st_Start:
nState = st_Yaw;
TIM_TimeBaseStructure.TIM_Period = 3200*2;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM2->CCR1 = 1600*2;
TIM2->CNT = 3200*2;
cState = nState;
break;
case st_Yaw:
nState = st_Pitch;
Buffer_Yaw = (-1*Buffer[2]);
if (((int8_t)Buffer_Yaw)>MoveRangeValue)
{
YAW_value = 127;
}
else if (((int8_t)Buffer_Yaw)<(-1*MoveRangeValue))
{
YAW_value = 0;
}
else if ((((int8_t)Buffer_Yaw)<(MoveRangeValue/2)) && (((int8_t)Buffer_Yaw)>(-1*MoveRangeValue/2)))
{
YAW_value = 63; // engine off: 63 ~= 127/2
}
else
{
if((((int8_t)Buffer_Yaw+MoveRangeValue)*127/(2*MoveRangeValue)) > 127)
{
YAW_value = 127;
}
else
{
YAW_value = ((int8_t)Buffer_Yaw+MoveRangeValue)*127/(2*MoveRangeValue);
}
}
SetCurrentPWMOutput(YAW_value);
break;
case st_Pitch:
nState = st_Throttle;
if (((int8_t)Buffer[0])>MoveRangeValue)
{
PITCH_value = 127;
}
else if (((int8_t)Buffer[0])<(-1*MoveRangeValue))
{
PITCH_value = 0;
}
else if ((((int8_t)Buffer[0])<(MoveRangeValue/3.5)) && (((int8_t)Buffer[0])>(-1*MoveRangeValue/3.5)))
{
PITCH_value = 63; // engine off: 63 ~= 127/2
}
else
{
if((((int8_t)Buffer[0]+MoveRangeValue)*127/(2*MoveRangeValue)) > 127)
{
PITCH_value = 127;
}
else
{
PITCH_value = ((int8_t)Buffer[0]+MoveRangeValue)*127/(2*MoveRangeValue);
}
}
SetCurrentPWMOutput(PITCH_value);
break;
case st_Throttle:
nState = st_Adjust;
uint8_t i;
for(i = 8; i < 16; ++i)
{
if(GPIO_ReadInputDataBit(GPIOE, (uint16_t)1 << i)==(uint8_t)Bit_SET)
{
varSetBit(Buffer_Throttle,i-8);
}
else
{
varClrBit(Buffer_Throttle,i-8);
}
}
if (((int8_t)Buffer_Throttle)<0)
{
THROTTLE_value = 0;
}
else
{
if((((int8_t)Buffer_Throttle)*127/MoveRangeValue) > 127)
{
THROTTLE_value = 127;
}
else
{
THROTTLE_value = ((int8_t)Buffer_Throttle)*127/MoveRangeValue;
}
}
SetCurrentPWMOutput(THROTTLE_value);
break;
case st_Adjust:
nState = st_Stop;
SetCurrentPWMOutput(ADJUST_value);
break;
case st_Stop:
nState = st_Start;
TIM_TimeBaseStructure.TIM_Period = 32240*2;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM2->CCR1 = 240*2;
TIM2->CNT = 32240*2;
cState = nState;
break;
default:
break;
}
W celu wykorzystania płytki STM32F4DISCOVERY do sterowania helikoptera Syma 107, należy zmodyfikować nieznacznie jego kontroler. Należy wydobyć z obudowy płytkę kontrolera i przeciąć dwie ścieżki, aby wyodrębnić sam moduł nadawczy złożony z diod LED. Na fotografiach 5…11 przedstawiono kolejne etapy modyfikacji kontrolera Syma 107 i jego płytki.

Fot. 5. Kontroler helikoptera Syma 107 (optyczny, emisja sygnału odbywa się za pomocą IRED)

Fot. 6. Kontroler helikoptera Syma 107 po rozebraniu obudowy


Jak dobrać odpowiedni format banera reklamowego do wydarzenia plenerowego?
„Shadow AI” w firmach: dlaczego tak wielu pracowników korzysta ze sztucznej inteligencji bez zgody firmy?
ADALM2000 – Regulowany układ wyzwalania zewnętrznego 

![https://www.youtube.com/watch?v=XkeyLmtLfxo O konkursie organizowanym przez firmę TRUMPF Huettinger i polskie uczelnie techniczne opowiada Alicja Peresada i prof. Jacek Rąbkowski oraz kilkoro nagrodzonych dyplomantów: mgr inż. Jakub Dobosz, inż. Maja Zielińska, dr inż. Jakub Kołodziej, dr inż Weronika Hryniewska-Guzik i dr inż. Grzegorz Bartyzel. Zapraszamy do obejrzenia filmu! [materiał redakcyjny]](https://mikrokontroler.pl/wp-content/uploads/2026/07/TRUMPF-czolowka.png)



