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