/* PWM driver */

#include "My_PWM.h"
#include "PIN_config.h"
#include "stm32f10x_tim.h"

void PWM_Init(void)
{
	TIM_TimeBaseInitTypeDef  	TIM_TimeBaseStructure;				// Struktura pro nastaveni casove zakladny casovacu
	TIM_OCInitTypeDef  			TIM_OCInitStructure;				// Struktura pro nakonfigurovani PWM kanalu (pripojeni k timeru)

	PWM_OutPWM();													// Nakonfiguruje PWM vystupy jako alternativni funkci (=PWM)
	
	RCC->APB1ENR |= (RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3);	// Zapnuti hodin do casovace TIM2 a TIM3
	RCC->APB2ENR |= (RCC_APB2Periph_TIM1);							// Zapnuti hodin do casovace TIM1

	/* Globalni nastaveni casovacu pro generovani PWM */
	TIM_TimeBaseStructure.TIM_Prescaler = 0;						// Nastaveni preddelicky: 24MHz => krok PWM 41,667ns
  	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		// Mod citani: nahoru
	TIM_TimeBaseStructure.TIM_Period = 48000;				        // Nastaveni periody: 48000 => T = 2ms => 500Hz
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;			// Nastaveni pridavne delicky hodin na 1 => zadna pridavna preddelicka

	/* Time Base configuration  TIM2 */  	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);					// PWM LED 1 - 4
	/* Time Base configuration  TIM3 */
  	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);					// PWM LED 5, FAN
	/* Time Base configuration  TIM4 */

	/* Globalni nastaveni parametru PWM */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 				// Nastaveni PWM modu 1
  	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 	// Nenegovany vystup zapnuty
  	TIM_OCInitStructure.TIM_Pulse = DEFAULT_LED_PWM_PULSE;			// Nastaveni pocatecni delky pulzu
  	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 		// Promenna pulse urcuje delku nizke urovne
	
	/* Nastaveni kanalu 4 casovace TIM2 - LED PWM 1 */
	TIM_OC4Init(TIM2,&TIM_OCInitStructure); 						// Ulozeni nastaveni casovace do registru jadra (TIM2, kanal 4)
	/* Nastaveni kanalu 3 casovace TIM2 - LED PWM 2 */
  	TIM_OC3Init(TIM2,&TIM_OCInitStructure); 						// Ulozeni nastaveni casovace do registru jadra (TIM2, kanal 3)
	/* Nastaveni kanalu 2 casovace TIM2 - LED PWM 3 */
  	TIM_OC2Init(TIM2,&TIM_OCInitStructure); 						// Ulozeni nastaveni casovace do registru jadra (TIM2, kanal 2)
	/* Nastaveni kanalu 1 casovace TIM2 - LED PWM 4 */
  	TIM_OC1Init(TIM2,&TIM_OCInitStructure); 						// Ulozeni nastaveni casovace do registru jadra (TIM2, kanal 1)
	/* Nastaveni kanalu 3 casovace TIM3 - LED PWM 5 */
  	TIM_OC3Init(TIM3,&TIM_OCInitStructure); 						// Ulozeni nastaveni casovace do registru jadra (TIM3, kanal 3)
	/* Nastaveni kanalu 4 casovace TIM3 - FAN PWM */
  	TIM_OCInitStructure.TIM_Pulse = DEFAULT_FAN_PULSE;				// Nastaveni pocatecni delky pulzu
	TIM_OC4Init(TIM3,&TIM_OCInitStructure); 						// Ulozeni nastaveni casovace do registru jadra (TIM3, kanal 4)
	/* Nastaveni kanalu 1 casovace TIM1 - LCD backlight PWM */

	/* Povoleni auto nacteni parametru jednotlivych kanalu casovacu */
	TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);				// Povoleni opakovaneho nacteni konfigurace registru kanalu 4 TIM 2 pote co dobehne do konce
	TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);				// Povoleni opakovaneho nacteni konfigurace registru kanalu 3 TIM 2 pote co dobehne do konce
	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);				// Povoleni opakovaneho nacteni konfigurace registru kanalu 2 TIM 2 pote co dobehne do konce
	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);				// Povoleni opakovaneho nacteni konfigurace registru kanalu 1 TIM 2 pote co dobehne do konce
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);				// Povoleni opakovaneho nacteni konfigurace registru kanalu 3 TIM 3 pote co dobehne do konce
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);				// Povoleni opakovaneho nacteni konfigurace registru kanalu 4 TIM 3 pote co dobehne do konce
//	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);				// Povoleni opakovaneho nacteni konfigurace registru kanalu 1 TIM 1 pote co dobehne do konce

	/* Povoleni auto nacteni parametru casovacu */
	TIM_ARRPreloadConfig(TIM2, ENABLE);								// Povoleni opakovaneho nacteni konfigurace timeru 2 pote co dobehne do konce
	TIM_ARRPreloadConfig(TIM3, ENABLE);								// Povoleni opakovaneho nacteni konfigurace timeru 3 pote co dobehne do konce
	
	/* Spusteni casovacu */
	TIM_Cmd(TIM2, ENABLE);											// Spusteni casovace TIM2
	TIM_Cmd(TIM3, ENABLE);											// Spusteni casovace TIM3
}

void PWM_Vypnuti(void)
{
	PWM_OutLED_Disable();											// Prepnuti PWM pinu do rezimu pouze vystup
	PWM_Set_LED_1_OFF();											// Vypnuti vsech LED
	PWM_Set_LED_2_OFF();
	PWM_Set_LED_3_OFF();
	PWM_Set_LED_4_OFF();
	PWM_Set_LED_5_OFF();
	PWM_Set_LED_6_OFF();
}

void PWM_ZnovuZapnuti(void)
{
	PWM_OutLED_ReEnable();
}

// Konec souboru =================================================
