VBCores Документация
СайтGitHub
  • VBCores
  • Hardware
    • VBCore VB32G4
    • VB STM32 программатор
    • BLDC драйвер 30A
    • DC драйвер 15A
    • Stepper драйвер 10A
    • CAN-FD - Raspberry PI
      • Настройка CAN на RPI
      • Часто возникаемые ошибки при работе с CAN/CAN FD
      • Работа с CAN FD через Python
    • Power board 30A
    • SBus-HID
    • DC-DC преобразователь
    • Ethernet - CAN-FD
    • USB-HUB
    • IMU BNO055
    • IMU BHI360
    • Т-Энкодер
  • Настройка ПО
    • Arduino IDE
      • Подготовка модуля VBCore
      • Установка среды программирования на Windows
      • Установка среды программирования на Ubuntu
        • Возможные ошибки в Ubuntu при работе с Arduino
      • Выбор платы в Arduino IDE
      • Установка базовой библиотеки
      • Структура ПО для Arduino
      • Примеры
        • Работа с CAN и CAN FD на Arduino
        • Работа с I2C
        • I2C detect
        • Датчик BNO055 / I2C
        • Датчик AS5047P / SPI
        • Датчик AS5600 / I2C
        • Работа с бесколлекторными двигателями
          • Simple FOC. Управление скоростью. Нахождение количества пар полюсов.
          • Simple FOC. Управление моментом
          • Чтение данных с датчика тока
        • Работа с коллекторным двигателем
          • Вращение DC мотором
          • Чтение угла по энкодеру. Управление DC мотором по углу
          • Чтение скорости вращения мотора по энкодеру
        • Работа с шаговым двигателем
          • Вращение шагового двигателя.
          • Контроль двигателя по интерфейсу SPI
    • STM32 CUBE IDE
      • Типовые настройки
      • Подсказки начинающим
        • Cube IDE для начинающих
        • Clock configuration
        • Таймеры - прерывания
        • Таймеры - ШИМ
        • Отладка программ
        • Коммуникации - FDCAN
        • Управление DC-мотором
        • Backup программы
  • Cyphal CAN
    • Cyphal CAN
    • PyCyphal
    • Yakut
    • Cyphal Arduino
      • Отправка и получение сообщений по cyphal
  • Работа с ROS
    • Установка Ubuntu, ROS и Arduino
    • ROS_LIB
    • Примеры
      • Publisher. Hello World!
      • Publisher with Subscriber
      • Rotation by DC motor
  • Работа с научным ПО
    • TCP Server
    • LabView
    • Matlab
  • Инструкции
    • Стенд управления двигателями
    • Переделка датчика мотор-колеса
    • Стенд мотор-колеса
    • iPower Motor
    • AS5047p OEM
  • Практические занятия
    • Коллекторный двигатель
      • Устройство коллекторного двигателя
  • RPI Display
Powered by GitBook
On this page
  • Что такое ШИМ
  • Управление яркостью светодиода с помощью ШИМ
  • Настройка микроконтроллера
  1. Настройка ПО
  2. STM32 CUBE IDE
  3. Подсказки начинающим

Таймеры - ШИМ

Работа с широтно-импульсной модуляцией

PreviousТаймеры - прерыванияNextОтладка программ

Last updated 1 year ago

Хоть нам и удалось в прошлом разделе сделать "мигание по синусоиде", оно было прерывистым и не очень красивым. Хотелось бы добиться плавного изменения яркости, без заметного для глаза мерцания. В этом нам поможет ШИМ - широтно-импульсная модуляция (PWM - pulse-width modulation).

Что такое ШИМ

В прошлом упражнении мы уже видели, что у таймера есть период - значения, достигая которого он сбрасывается. Таким образом, можно говорить о частоте таймера, с этой частотой у нас вызывались прерывания и эта же частота будет использоваться для ШИМ.

ШИМ нужна для генерации сигналов, переключающихся между двумя значениями (условно, 0 и 1) с постоянной частотой:

Видно, что частота ("время" от начала одного сигнала до следующего) постоянно - эта та же частота, что была и у прерывания и задается с помощью Counter Period. Duty cycly, или коэффициент заполнения, отмеченный на графике, управляется с помощью второго счетчика - pulse, по достижении которого сигнал переходит в состояние 0.

Представим, что counter period у нас 20. Тогда для получения таких сигналов, как на рисунке, нам нужно выставить pulse:

  1. 10

  2. 15

  3. 5

Если частота ШИМ достаточно велика (тысячи КГц), то держа таким образом светодиод во включенном состоянии 50/75/25 процентов времени, мы получим стабильную яркость в 50/75/25 или любой другой процент от максимальной. Переключения с такой частотой будут не различимы для глаза.

Аналогичным образом можно управлять, например, скоростью DC-мотора

Управление яркостью светодиода с помощью ШИМ

Настройка микроконтроллера

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

Теперь необходимо настроить TIM2:

С Clock Source, Prescaler и Counter Period мы уже разбирались. Тут важны следующие новые настройки:

  • Channel1 - PWM Generation CH1 - указывает, что на первом канале таймера (который мы как раз привязали к светодиоду) нужно генерировать ШИМ

  • PWM Generation Channel 1 - Pulse - 10 - значение, контролирующее коэффициент заполнения сигнала. При pulse == 10 и period == 500, заполнение равно 2%

Очевидно, что чтобы менять яркость светодиода, необходимо просто менять значение pulse по синусоиде - при prescaler 16, частота таймера получилась равной 10 МГц, и с периодом 500 - частота ШИМ 20 КГц. С такой частотой, при управлении яркостью через pulse никакого мерцания заметно не будет, и можно рассматривать коэффициент заполнения просто как процент от максимальной яркости.

В таком случае, все что нам осталось сделать, это запустить ШИМ и в цикле устанавливать pulse как синус от какого-то X. Тут удобно привести большой кусок кода из main, в котором содержится вся эта логика:

/* USER CODE BEGIN 2 */
double x = 0;
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    HAL_Delay(0.05);
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 125*(sin(x*3.14)+1));
    if (x < 2) x += 0.001;
    else x = 0;
/* USER CODE END WHILE */

Залив этот код на контроллер, мы увидим, как светодиод плавно меняет яркость, без заметного мерцания.

Примеры сигналов