Содержание

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


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

Код инициализации и запуска ШИМ на контроллерах семейства 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)

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

/**
 * Установка скважности 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);
}


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