Код инициализации и запуска ШИМ на контроллерах семейства STM8L. Проверялся на STM8L051F3. Тактирование от встроенного генератора HSI. Использован таймер TIM3 и выход канала 1 - PB1/TIM3_CH1. Использована периферийная библиотека STM8L15x_StdPeriph_Driver
Нужно
//! Выход PWM - TIM3_CH1 #define PWM_GPIO_PORT GPIOB #define PWM_GPIO_PIN GPIO_Pin_1 #define PWM_FREQ 2000 #define PWM_PERIOD (HSI_VALUE/8/2/PWM_FREQ)
Настройка PWM 2кГц со скважностью 40%
Состоит из трех этапов: * Настройка периода таймера (с перезагрузкой по событию Update) * Настройка режима и полярности выхода OC1 * Включение выхода OC1 на вывод МК (бит MOE или AOE в регистре TIMx_BKR)
CLK_PeripheralClockConfig(CLK_Peripheral_TIM3, ENABLE); /* 2000000/2/500 = 2000Hz (для HSI/8) */ TIM3_PrescalerConfig(TIM3_Prescaler_2,TIM3_PSCReloadMode_Update); TIM3_SetAutoreload(PWM_PERIOD); TIM3_CounterModeConfig(TIM3_CounterMode_Up); TIM3_ClearFlag(TIM3_FLAG_Update); TIM3_OC1PreloadConfig(ENABLE); TIM3_OC1Init(TIM3_OCMode_PWM1,TIM3_OutputState_Enable,200,TIM3_OCPolarity_High,TIM3_OCIdleState_Reset); TIM3_ITConfig(TIM3_IT_Update,ENABLE); TIM3_CtrlPWMOutputs(ENABLE); TIM3_Cmd(ENABLE);
Включение прерывания таймера (TIM3_ITConfig(TIM3_IT_Update,ENABLE);) для собственно работы ШИМ не требуется и сделано только для контроля: в обработчике прерывания переключается тестовый пин.
Альтернативный вариант инициализации:
TIM3->PSCR = 0x01; // Prescaler = 2 // Fill 16 bit timer2_arr to two 8 bit registers. // MSB register to be filled first. TIM3->ARRH = timer2_arr >> 8; TIM3->ARRL = timer2_arr & 0x00FF; // Fill 16 bit timer2_ccr1 to two 8 bit registers. // MSB register to be filled first. TIM3->CCR1H = timer2_ccr1 >> 8; TIM3->CCR1L = timer2_ccr1 & 0x00FF; TIM3->CCER1 |= TIM_CCER1_CC1P; // channel 1 active low TIM3->CCER1 |= TIM_CCER1_CC1E; // Enable channel 1 output // PWM mode 1. TIM3->CCMR1 |= (uint8_t)(1<<6); // Set output compare mode as 6 (0b110) TIM3->CCMR1 |= (uint8_t)(1<<5); // So channel 1 will be acitve while counter TIM3->CCMR1 &= (uint8_t)(~(1<<4)); // is lower than compare value. TIM3->BKR |= TIM_BKR_AOE; TIM3->CR1 |= TIM_CR1_CEN; // Enable counter
Изменение скважности ШИМ:
/** * Установка скважности PWM_VH * * @param ps значение скважности в % */ void SetPWM(uint8_t ps) { uint16_t ccr; ccr = ((PWM_PERIOD)*ps)/100; TIM3_SetCompare1(ccr); }
{ uint8_t i; //Скважность 50% i = 50; SetPWM(i); }
{ //Скважность 10% i = 50; SetPWM(i); }