// TIM1 komplementární výstup #include "stm8s.h" #include "milis.h" void init_tim(void); void set_pwm(uint8_t value); void main(void){ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // 16MHz z interního RC oscilátoru //CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); // 24MHz pokud máme krystal (a přepnutý 1 Flash Wait State) //CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE); // 24MHz Xtal oscillator init_milis(); // milis kvůli delay_ms() init_tim(); // spustit TIM1 while (1){ // ukázka pro změření rychlosti přeběhu set_pwm(64); // nastavit 25% střídu delay_ms(40); set_pwm(192); // nastavit 75% střídu delay_ms(40); } } void set_pwm(uint8_t value){ //TIM1_UpdateDisableConfig(DISABLE); // vypnout Update událost pokud bych chtěl natavit více PWM kanálů zároveň TIM1_SetCompare1(value); //TIM1_UpdateDisableConfig(ENABLE); } void init_tim(void){ GPIO_Init(GPIOC,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST); // PC1 (TIM1_CH1) GPIO_Init(GPIOB,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST); // PB0 (TIM1_CH1N) TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 255, 0); // Strop 255, prescaler /1 => 16us perioda // Povolit komplementární výstupy CH1,CH1N timeru v režimu PWM1 TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 127, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET, TIM1_OCNIDLESTATE_RESET); TIM1_CtrlPWMOutputs(ENABLE); // povolit výstupy timeru globálně TIM1_OC1PreloadConfig(ENABLE); // povolit preload na CC1 abychom neměli glitche TIM1_Cmd(ENABLE); // spustit timer }