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 model Industry 5.0 wspiera zrównoważony rozwój w polskim przemyśle
Daniel Brzeziński z Rochester Electronics opowiada jak skutecznie zarządzać przestrzałością w branży półprzewodników
AI podważa zasady, które rządziły branżą przez dekady. Moc obliczeniowa staje się nową walutą technologii 






