Инструменты пользователя

Инструменты сайта


sources:stm8l_pwm_tim3

На главную, Исходники


STM8L Настройка ШИМ на базе 16-ти битного таймера

Код инициализации и запуска ШИМ на контроллерах семейства STM8L. Проверялся на STM8L051F3. Тактирование от встроенного генератора HSI. Использован таймер TIM3 и выход канала 1 - PB1/TIM3_CH1. Использована периферийная библиотека STM8L15x_StdPeriph_Driver

Определение

Нужно

1
2
3
4
5
6
//! Выход 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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);) для собственно работы ШИМ не требуется и сделано только для контроля: в обработчике прерывания переключается тестовый пин.

Альтернативный вариант инициализации:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)

Изменение скважности ШИМ:

1
2
3
4
5
6
7
8
9
10
11
/**
 * Установка скважности PWM_VH
 *
 * @param ps значение скважности в %
 */
void SetPWM(uint8_t ps)
{
    uint16_t ccr;
    ccr = ((PWM_PERIOD)*ps)/100;
    TIM3_SetCompare1(ccr);
}

1
2
3
4
5
6
{
    uint8_t i;
    //Скважность 50%
    i = 50;
    SetPWM(i);
}

1
2
3
4
5
{   
    //Скважность 10%
    i = 50;
    SetPWM(i);
}


На главную, Исходники

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
sources/stm8l_pwm_tim3.txt · Последнее изменение: 2025/01/29 13:15 — Юрий

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: GNU Free Documentation License 1.3
GNU Free Documentation License 1.3 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki