LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

Generatory PWM – obsługa programowa

W przypadku opisu kanału wartość TIM_OCMode zmienia się z wartości TIM_OCMode_Toggle (dla sygnału zegarowego) na wartość TIM_OCMode_PWM1. Wartość TIM_Pulse, opisująca wypełnienie sygnału PWM, odczytywana jest z tablicy.
Projekt umożliwia konfigurowanie parametrów sygnału zegarowego i sygnału PWM, jest to realizowane poprzez następujące operacje:

//przerwanie wywolane przez joystick w pozycji - up
else if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
	if(b == 1)
	{
		//ustawienie aktualnej konfiguracji
		a += 1; 
		if(a > 11){a = 11;}
		//aktualizacja wartosci rejestru CCR4 licznika TIM1
		TIM1->CCR4 = 1000 - c[a];
	}
	else if(b == 2)
	{
		//ustawienie aktualnej konfiguracji
		a -= 1;
		if(a < 1){a = 1;}
		//aktualizacja wartosci rejestru ARR licznika TIM1
		TIM1->ARR = a * 34;
		//wyzerowanie wartosci rejestru CNT licznika TIM1
		TIM1->CNT = 0;
	}
     	//wyczyszczenie flagi przerwania
	EXTI_ClearITPendingBit(EXTI_Line9);
} 
oraz
//przerwanie wywolane przez joystick w pozycji - down
if(EXTI_GetITStatus(EXTI_Line10) != RESET)
{
	if(b == 1)
	{
		//ustawienie aktualnej konfiguracji
		a -= 1;
		if(a < 0){a = 0;}
		//aktualizacja wartosci rejestru CCR4 licznika TIM1
		TIM1->CCR4 = 1000 - c[a];
	}
	else if(b == 2)
	{
		//ustawienie aktualnej konfiguracji
		a += 1;
		if(a > 16){a = 16;}
		//aktualizacja wartosci rejestru ARR licznika TIM1
		TIM1->ARR = a * 34;
		//wyzerowanie wartosci rejestru CNT licznika TIM1
		TIM1->CNT = 0;	 
	}
	//wyczyszczenie flagi przerwania
	EXTI_ClearITPendingBit(EXTI_Line10);
}

Aktualizacja parametrów odbywa się bezpośrednio do rejestrów w przypadku sygnału PWM jest to aktualizacja rejestru CCR4 licznika TIM1, natomiast dla sygnału zegarowego aktualizowany jest rejestr ARR licznika oraz zerowanie rejestru CNT, zerowanie jest realizowane w celu uniknięcia sytuaji gdy rejestr CNT będzie posiadał większą wartość od ARR.
W przypadku wciśniecia joysticka (pozycja OK) następuje wyłączenie licznika, jest ono realizowane następująco:

//przerwanie wywolane przez joystick w pozycji - ok
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
	//ustawienie trybu dzialania
	b = 0;
	//wyłaczenie timera TIM1
	TIM_Cmd(TIM1, DISABLE);
	//wyłaczenie pinów wyjściowych timera
	TIM_CtrlPWMOutputs(TIM1, DISABLE);
  	//wyczyszczenie flagi przerwania
	EXTI_ClearITPendingBit(EXTI_Line8);
}

Funkcje obsługi przerwań odwołują się do zmiennych zadeklarowanych w pliku main.c, aby umożliwić odwoływania się do tych zmiennych w funkcji obsługi przerwania należy przeprowadzić ich inicjalizacje jest to realizowane poprzez:

//zdefiniowanie zmiennej zadeklarowanej w pliku main.c
extern int a;
extern int b;
extern int c[];

Mariusz Dziębowski
m.dziebowski@interia.pl

Tagi: GPIO, LED