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


Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



