[[:start|На главную]], [[sources:start|Исходники]]
----
====== STM8L Настройка ШИМ на базе 16-ти битного таймера ======
{{tag>исходники PWM ШИМ}}
Код инициализации и запуска ШИМ на контроллерах семейства STM8L. Проверялся на STM8L051F3. Тактирование от встроенного генератора HSI.
Использован таймер TIM3 и выход канала 1 - PB1/TIM3_CH1.
Использована периферийная библиотека [[https://www.st.com/en/embedded-software/stsw-stm8016.html|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) =====
Изменение скважности ШИМ:
/**
* Установка скважности 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);
}
----
[[:start|На главную]], [[sources:start|Исходники]]
~~DISCUSSION~~