Использование таймеров на STM32

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Введение в таймеры STM32

Таймеры в микроконтроллерах STM32 играют ключевую роль в управлении временем и событиями. Они позволяют выполнять задачи с точной временной привязкой, такие как генерация сигналов, измерение длительности событий и создание задержек. Таймеры могут работать в различных режимах, включая базовый таймер, таймер с прерываниями и таймер для широтно-импульсной модуляции (PWM). Важно понимать, что каждый таймер имеет свои особенности и возможности, которые могут быть использованы для различных задач.

Кинга Идем в IT: пошаговый план для смены профессии

Основные функции таймеров

Таймеры могут использоваться для:

  • Создания задержек: Это полезно для временной синхронизации различных процессов.
  • Измерения времени: Таймеры могут точно измерять длительность событий.
  • Генерации сигналов: Таймеры могут генерировать периодические сигналы с заданной частотой.
  • Управления периферийными устройствами: Например, для управления двигателями или светодиодами с помощью PWM.

Настройка базового таймера

Базовый таймер — это простой таймер, который можно использовать для создания задержек или отсчета времени. Для настройки базового таймера на STM32 необходимо выполнить следующие шаги:

Шаги настройки базового таймера

  1. Выбор таймера: Определите, какой из доступных таймеров вы будете использовать (например, TIM2, TIM3 и т.д.). Важно выбрать таймер, который не конфликтует с другими используемыми периферийными устройствами.
  2. Настройка предделителя (Prescaler): Предделитель определяет частоту, с которой таймер будет считать. Например, если частота системного тактового генератора 72 МГц, а предделитель установлен на 7200, то таймер будет считать с частотой 10 кГц. Это позволяет гибко настраивать частоту таймера в зависимости от требований приложения.
  3. Настройка автозагрузочного регистра (ARR): Этот регистр определяет, до какого значения будет считать таймер перед сбросом и генерацией события. Значение ARR определяет период таймера.

Пример настройки базового таймера

Пример настройки базового таймера:

c
Скопировать код
TIM_HandleTypeDef htim2;

void MX_TIM2_Init(void)
{
    __HAL_RCC_TIM2_CLK_ENABLE();
    
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 7200 – 1;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 10000 – 1;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim2);
    
    HAL_TIM_Base_Start(&htim2);
}

Этот код инициализирует таймер TIM2 с предделителем 7200 и периодом 10000, что позволяет создать таймер с частотой 1 Гц.

Использование таймера для генерации прерываний

Таймеры могут быть настроены для генерации прерываний по истечении определенного времени. Это полезно для выполнения периодических задач без постоянного опроса таймера. Прерывания позволяют микроконтроллеру выполнять другие задачи, пока таймер отсчитывает время.

Настройка прерываний

  1. Включение прерываний: Настройте таймер для генерации прерываний. Это включает настройку соответствующих регистров и разрешение прерываний в контроллере прерываний (NVIC).
  2. Обработчик прерываний: Напишите функцию-обработчик, которая будет выполняться при каждом прерывании. Эта функция должна быть зарегистрирована в таблице векторов прерываний.

Пример настройки таймера для генерации прерываний

Пример настройки таймера для генерации прерываний:

c
Скопировать код
void MX_TIM2_Init(void)
{
    __HAL_RCC_TIM2_CLK_ENABLE();
    
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 7200 – 1;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 10000 – 1;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim2);
    
    HAL_TIM_Base_Start_IT(&htim2);
}

void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim2);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        // Код, выполняемый при каждом прерывании
    }
}

Этот код инициализирует таймер TIM2 для генерации прерываний и включает обработчик прерываний, который будет вызываться при каждом истечении периода таймера.

Настройка и использование PWM (широтно-импульсной модуляции)

PWM используется для управления мощностью, яркостью светодиодов, скоростью двигателей и других задач. Таймеры STM32 могут генерировать PWM-сигналы с различной частотой и скважностью. PWM позволяет точно контролировать выходной сигнал, изменяя его ширину импульса.

Настройка PWM

  1. Настройка таймера: Настройте таймер для работы в режиме PWM. Это включает настройку предделителя, периода и режима работы таймера.
  2. Настройка каналов: Настройте каналы таймера для генерации PWM-сигналов. Каждый канал может быть настроен независимо для генерации сигналов с различной скважностью.

Пример настройки PWM

Пример настройки PWM:

c
Скопировать код
TIM_HandleTypeDef htim3;
TIM_OC_InitTypeDef sConfigOC;

void MX_TIM3_Init(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();
    
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 7200 – 1;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 1000 – 1;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim3);
    
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500; // 50% скважность
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
    
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}

Этот код инициализирует таймер TIM3 для генерации PWM-сигнала с частотой 1 кГц и скважностью 50%.

Практические примеры и советы

Пример 1: Генерация сигнала с фиксированной частотой

Используйте таймер для генерации сигнала с фиксированной частотой. Это может быть полезно для создания тактовых сигналов или управления периферийными устройствами. В этом примере мы используем таймер для генерации сигнала с частотой 1 кГц.

c
Скопировать код
void MX_TIM4_Init(void)
{
    __HAL_RCC_TIM4_CLK_ENABLE();
    
    htim4.Instance = TIM4;
    htim4.Init.Prescaler = 7200 – 1;
    htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim4.Init.Period = 1000 – 1;
    htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim4);
    
    HAL_TIM_Base_Start_IT(&htim4);
}

void TIM4_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim4);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM4)
    {
        // Генерация сигнала
    }
}

Пример 2: Управление яркостью светодиода с помощью PWM

Используйте PWM для управления яркостью светодиода. Изменяйте значение Pulse для изменения скважности и, соответственно, яркости. В этом примере мы используем функцию для установки яркости светодиода.

c
Скопировать код
void setLEDBrightness(uint16_t brightness)
{
    sConfigOC.Pulse = brightness;
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}

Советы

  • Используйте предделители для настройки точной частоты таймера. Это позволяет гибко управлять частотой таймера и адаптировать его под конкретные задачи.
  • Настраивайте прерывания для выполнения периодических задач без опроса таймера. Прерывания позволяют микроконтроллеру выполнять другие задачи, пока таймер отсчитывает время.
  • Экспериментируйте с PWM для управления различными устройствами, такими как двигатели и светодиоды. PWM позволяет точно контролировать выходной сигнал и управлять мощностью.

Таймеры STM32 предоставляют мощные инструменты для управления временем и событиями. Понимание их работы и умение их настраивать откроет перед вами множество возможностей в разработке встроенных систем. Важно экспериментировать и пробовать различные настройки, чтобы лучше понять, как таймеры могут быть использованы в вашем проекте.

Читайте также