LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

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

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

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

 

Fot. 6. Kontroler helikoptera Syma 107 po rozebraniu obudowy

Fot. 6. Kontroler helikoptera Syma 107 po rozebraniu obudowy