STM Урок 10. HAL. Изучаем PWM (ШИМ). Мигаем светодиодами плавно

 

 

 

Урок 10

HAL. Изучаем PWM (ШИМ). Мигаем светодиодами плавно

 

 

Сегодня мы продолжим использование библиотеки HAL. Также сегодня мы коснёмся такой технологии, как PWM (ШИМ).

Тонкости данной технологии мы подробно рассматривали в уроке по контроллерам AVR. Я думаю, нет смысла ещё раз повторять.

Мы изучим, как именно широтно-импульсная модуляция реализована в контроллерах STM32, в частности в STM32F407, с которым мы и будем продолжать работать.

Проще всего управлять технологией PWM у данных контроллеров посредством таймеров. Урок по таймерам у нас уже был. Какой таймер чем занимается, мы уже кратко ознакомились, поэтому нам будет намного проще.

В качестве таймера для ШИМ мы возьмём таймер 4. Данный таймер является 16-битным. Доступно до 4 раздельных канала. Также в технической документации на контроллер указано, что таймер может выступать в роли PWM-генератора

 

image00

 

Точно также как и раньше проект создаем из самого первого (TEST001), называем его MYPWM

Запускаем Cube MX, отключим. во-первых все ножки портов светодиодов, а также ножку кнопки

 

image01image02

 

Включаем таймер, выбрав в выпадающем списке внутреннее тактирования, и включаем в нем каналы – все 4, выбрав там PWM

 

image03

 

Как мы видим, ножки портов, отвечающих за светодиоды на плате, включились сами в определенный альтернативный режим

 

image06

 

В настройках таймера в Configuration параметр Counter Period выставляем в 65535

 

image04

 

На всякий случай включим прерывания и всем 4м портам выставим скорость high. Генерируем проект

 

image05

image07

 

 

 

Добавляем код инициализации

 

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_TIM4_Init();

 

  /* USER CODE BEGIN 2 */

        HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);

        HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);

        HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);

        HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);

  /* USER CODE END 2 */

 

В функцию main пишем также

 

  /* USER CODE BEGIN 1 */

        uint32_t i,d;

  /* USER CODE END 1 */

 

И в бесконечный цикл пишем

 

/* USER CODE BEGIN 3 */

                for(i=0;i<=524288;i++)

                {

                        if(i<65536)        TIM4->CCR1=i;

                        else if ((i>65535)&&(i<131072)) TIM4->CCR1=131071-i;

                        else if((i>131071)&&(i<196608))        TIM4->CCR2=i-131072;

                        else if ((i>196607)&&(i<262164)) TIM4->CCR2=262164-i;

                        else if((i>262163)&&(i<327680))        TIM4->CCR3=i-262164;

                        else if ((i>327679)&&(i<393216)) TIM4->CCR3=393216-i;

                        else if((i>393216)&&(i<458752))        TIM4->CCR4=i-393216;

                        else TIM4->CCR4=524288-i;

                        for(d=0;d<300;d++)

                        {

                                        

                        }

                }

  }

  /* USER CODE END 3 */

 

Теперь соберём код, прошьём контроллер.

После этого мы должны видеть следующую картину

 

image08

 

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

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Купить плату можно здесь STM32F4-DISCOVERY

 

Смотреть ВИДЕОУРОК

 

STM32 HAL. Изучаем PWM (ШИМ). Мигаем светодиодами плавно

 

10 комментариев на “STM Урок 10. HAL. Изучаем PWM (ШИМ). Мигаем светодиодами плавно
  1. Дмитрий:

    Здравствуйте! Хотел у вас спросить, можете ли вы пояснить запись "TIM4->CCR1=i;" что происходит на ножке порта? В один пин выводится четырехбайтовое число?! Где можно посмотреть за что отвечает регистр ССRx?   

    • На ножке порта также продолжают формироваться импульсы с той же частотой, только скважность становится равна значению, полученному в правой части равенства.

  2. Дмитрий:

    ведь период ограничен 65535, а в CCRх передаеется 524288

    • Нигде такое число не передаётся. Число передаётся от 0 до 65535. Внимательно просчитайте в каждой строке, чему может быть равно i, а затем посчитайте разность в правых частях равенств. Мы нигде ни разу не превысили допустимый интервал.

  3. Дмитрий:

    Спасибо большое!)) дурацкая невнимательность всй губит!) Разобрался! 

  4. Стефан:

    Здравствуте Владимир!

    Огромное спасибо за ваши уроки. Все подробно объясняете.  Я уже много чего успел сделать и запустить, благодаря вам, хотя раньше с STM32  не сталкивался. 

    Не подскажете — как можно запустить ШИМ на частоту примерно 7kHz, а потом плавно менять частоту (не скважность) вверх — вниз, используя, например, две кнопки?

    Привет с Болгарии. Вы здесь тоже популярны 🙂

  5. Вячеслав:

    И где тут управление шим через HAL?
    Вы пишете в регистры напрямую.

  6. Seba:

    Что то автор уроков гонит мне кажется, причем в наглую.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*