Программирование прямого и комплементарного ШИМ-сигналов с настройкой «мертвого времени» на микроконтроллере STM32 | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 28 декабря, печатный экземпляр отправим 1 января.

Опубликовать статью в журнале

Библиографическое описание:

Программирование прямого и комплементарного ШИМ-сигналов с настройкой «мертвого времени» на микроконтроллере STM32 / А. А. Емельянов, В. В. Бесклеткин, А. Ю. Иванин [и др.]. — Текст : непосредственный // Молодой ученый. — 2017. — № 24 (158). — С. 1-10. — URL: https://moluch.ru/archive/158/44592/ (дата обращения: 16.12.2024).



Программирование прямого и комплементарного ШИМ-сигналов с настройкой «мертвого времени» на микроконтроллере STM32

Емельянов Александр Александрович, доцент;

Бесклеткин Виктор Викторович, ассистент;

Иванин Александр Юрьевич, студент;

Пестеров Дмитрий Ильич, студент;

Юнусов Тимур Шамильевич, студент;

Иванов Павел Евгеньевич, студент;

Соснин Александр Сергеевич, студент

Российский государственный профессионально-педагогический университет (г. Екатеринбург)

Целью данной работы является программирование студентами на лабораторном стенде прямого и комплементарного ШИМ-сигналов с настройкой «мертвого времени». Программирование осуществляется в среде CooCox CoIDE.

Для реализации этой цели необходимо решить следующие задачи:

‒ Формирование синусоидального базового сигнала в цифровой форме с помощью задания углов, определяемых как 2π/125;

‒ Ввод структур для использования портов ввода-вывода, таймера и настройки «мертвого времени»;

‒ Включение тактирования периферийных устройств;

‒ Ввод функции инициализации:

1) Назначение портов ввода-вывода (GPIO – General Ports Input/Outputs);

2) Инициализация таймера (TIM1);

3) Инициализация ШИМ с обязательным включением комплементарных каналов;

4) Заполнение поля «TIM_DeadTime»;

‒ Описание функции прерывания (SysTick_Handler);

‒ Формирование массива, соответствующего новому сигналу, сдвинутому на 90° по отношению к базовому сигналу.

«Мертвое» время (DeadTime) – это задержка по времени положительных фронтов управляющих сигналов для исключения аварийных ситуаций в стойках. Стойка - это основной элемент силовой схемы, состоящий из двух последовательно соединённых транзисторов и обратных диодов, соединённых параллельно с ними (рис. 1) [1].

Управление стойкой происходит с помощью ШИМ. Обычно для стойки с двумя транзисторами скважность задается только для верхнего ключа, а нижний ключ работает в комплементарном (созависимом) режиме (рис. 2). Это означает, что когда верхний ключ включен, то нижний выключен, и наоборот, когда нижний ключ включен, верхний должен быть выключен. Такой комплементарный способ управления применяется в большинстве преобразователей. Микроконтроллер STM32F103C8T6 имеет в своем наборе таймер TIM1, с помощью которого можно назначить комплементарные выводы для генерации ШИМ-сигнала. Таким образом, программисту необходимо задать скважность ШИМ только для верхнего ключа, а на соответствующем выводе микроконтроллера аппаратно сформируется комплементарный сигнал для нижнего ключа.

Рис. 1. Один из вариантов исполнения стойки

Рис. 2. Комплементарное управление транзисторами в стойке

Особое внимание следует обратить на момент выключения верхнего транзистора и включения нижнего. На практике время срабатывания транзисторов отлично от нуля, и возможна ситуация, когда один транзистор уже успел включиться, а другой еще не успел выключится, что приводит к короткому замыканию между положительным и отрицательным контактами стойки. Ток, который возникает в таком аварийном режиме, называют «сквозным». Для предотвращения таких ситуаций используют генерацию «мертвого» времени, то есть происходит смещение фронтов сигналов (рис. 3), и возникают паузы в управлении, которые гарантируют безопасное включение и отключение транзисторов в стойке.

Рис. 3. Генерация «мертвого» времени

Алгоритм набора кода в среде разработки CooCox CoIDE состоит в следующем:

  1. Запускаем среду программирования CooCox CoIDE.
  2. После запуска CooCox CoIDE в строке меню нажать: Project → New Project.
  3. В появившемся окне в поле «Project name» ввести имя своему проекту.
  4. Далее нужно выбрать поле с надписью «Chip».
  5. Появится окно с выпадающими списками различных фирм микроконтроллеров (рис. 4). Необходимо открыть список ST, затем из выпадающего списка открыть подсписок STM32F103x, после чего найти микроконтроллер STM32F103C8, выбрать его левым щелчком мыши и нажать Finish (рис. 5).
  6. После проделанных действий появится главное окно с репозиторием для выбора необходимых для проекта библиотек (рис. 6).

Рис. 4. Выбор фирмы микроконтроллера

Рис. 5. Выбор микроконтроллера

Рис. 6. Выбор библиотек в репозитории

Необходимо подключить следующие библиотеки:

‒ RCC – для управления тактовым генератором;

‒ GPIO – для управления портами ввода-вывода;

‒ TIM – для управления таймерами.

  1. После выбора необходимых библиотек в панели файлов нужно выбрать файл «main.c», весь код будет находится здесь.
  2. С помощью директивы «#include <>» необходимо подключить заголовочные файлы (рис. 7).

Рис. 7. Подключение заголовочных файлов

  1. Далее нужно ввести все структуры, которые будут использоваться в коде, а также ввести массив для построения синусоидальной ШИМ (рис. 8). Массив имеет тип «uint16_t», что означает, что данный массив не имеет отрицательных значений, а также числа, входящие в этот массив, могут принимать значения в диапазоне от 0 до 65535.

Рис. 8. Ввод структур и массива синуса

  1. Для удобства восприятия кода программа была разделена на несколько подпрограмм (функций). Вначале необходимо ввести и заполнить функцию «void initRcc(void)» (рис. 9) для включения тактирования всех используемых периферийных устройств. Данная функция имеет тип «void».

Рис. 9. Функция включения тактирования

  1. Следующим шагом будет ввод и заполнение функции инициализации всех периферийных устройств «void initAll(void)». Данная функция, как и предыдущая, также имеет тип «void». Но так как она имеет большой объем, необходимо разбить ее на участки:

‒ Назначение портов ввода-вывода (рис. 10). Все выводы назначены как альтернативные функции с двумя состояниями;

Рис. 10. Назначение GPIO в функции initAll()

‒ Инициализация таймера TIM1 (рис. 11);

Рис. 11. Инициализация таймера

‒ Для генерации «мертвого времени» необходимо заполнить всего два поля, как показано на рис. 12;

Рис. 12. Настройка «мертвого» времени

‒ Инициализация ШИМ (рис. 13);

Рис. 13. Инициализация ШИМ

‒ Необходимо инициализировать системный таймер. Для этого нужно написать функцию SysTick_Config(), в аргументах которой указывается частота тактирования. Необходимо указать частоту 1200, в итоге должно получиться SysTick_Config(1200).

  1. После ввода и заполнения функции тактирования необходимо заполнить функцию прерывания SysTick_Handler (рис. 14), в которой будет проходить процесс записи значений массива в регистры сравнения таймера.

Рис. 14. Описание функции прерывания

  1. После того как все функции были введены и заполнены, нужно объявить их перед функцией «int main()» (рис. 15).

Рис. 15. Объявление функций

  1. Следующим шагом необходимо записать данные функции между фигурными скобками в «main()» (рис. 16). Цикл «while» в этом проекте останется пустым. После этого код можно считать завершенным.

Рис. 16. Функция main()

  1. После написания кода программы, его необходимо скомпилировать. Для этого в панели инструментов нужно нажать «Build». В случае успешной компиляции в консоли появится надпись «BUILD SUCCESSFUL», а также будет указан размер программы. Если в коде присутствуют ошибки, то в консоли будет указано, где именно находятся эти ошибки, а также появится надпись «BUILD FAILED».
  2. После завершения компиляции последним этапом станет загрузка рабочей программы в микроконтроллер. Для этого нужно через специальный кабель (удлинитель USB) подключить программатор, расположенный на лабораторном стенде, к компьютеру. После подключения в панели инструментов нажать «Download Code to Flash» и дождаться окончания загрузки. В случае удачной загрузки в консоли появятся надписи: «Erase: Done»; «Program: Done»; «Verify: Done». Если существуют проблемы с подключением платы к компьютеру, то появится надпись «Error: Connect failed, check config and cable connection». Необходимо проверить кабель, к которому подключено устройство.

На рис. 17 представлен общий вид лабораторного стенда с микроконтроллерами STM32.

Рис. 17. Общий вид лабораторного стенда для программирования микроконтроллеров STM32

Цифрами обозначены номера лабораторных работ, которые приведены ниже:

‒ 1 — программирование двухфазного генератора с синусоидальными напряжениями со сдвигом 90°;

‒ 2 — программирование прямого и комплементарного ШИМ-сигналов с настройкой «мертвого времени»;

‒ 3 — программирование изменения скважности импульсов ШИМ на микроконтроллере STM32 с помощью кнопки;

‒ 4 — программирование трехфазного генератора с синусоидальными напряжениями со сдвигом 120°;

‒ 5 — регулирование скважности сигнала при помощи аналогового потенциометра с настройкой «мертвого времени».

В каждой монтажной плате имеются клеммы для подключения к соответствующим каналам цифрового осциллографа. Результаты первой и третьей лабораторных работ опубликованы в журнале «Молодой ученый». В данной статье приведено содержание лабораторной работы на монтажной плате с микроконтроллером под номером 2 (рис. 17). Остальные работы будут опубликованы в следующих статьях.

Осциллограмма прямого и комплементарного ШИМ-сигналов с настройкой «мертвого времени» приведена на рис. 18.

Рис. 18. Осциллограмма прямого и комплементарного ШИМ-сигналов с настройкой «мертвого времени»

Литература:

  1. Анучин А. С. Системы управления электроприводов: учебник для вузов / А. С. Анучин. – М.: Изд. дом МЭИ, 2015. – 373 с.
  2. Огородников И. Н. Микропроцессорная техника: введение в Cortex-M3: учеб. пособие / И. Н. Огородников. – Екатеринбург: изд-во Урал. Ун-та, 2015. – 116 с.
  3. Джозеф Ю. Ядро Cortex-M3 компании ARM. Полное руководство / Ю. Джозеф; пер. с англ. А. В. Евстифеева. – М.: Додэка-XXI, 2012. – 552 с.
Основные термины (генерируются автоматически): GPIO, комплементарный ШИМ-сигнал, BUILD, лабораторный стенд, верхний ключ, инициализация таймера, настройка, нижний ключ, функция, монтажная плата.


Похожие статьи

Регулирование скважности сигнала при помощи аналогового потенциометра с настройкой «мертвого времени» на микроконтроллере STM32

Программирование изменения скважности импульсов ШИМ на микроконтроллере STM32 с помощью кнопки

Программирование синусоидального и пилообразного сигналов с помощью цифро-аналогового преобразователя на микроконтроллере STM32

Программирование трехфазного генератора с синусоидальными напряжениями со сдвигом 120° на микроконтроллере STM32

Программирование двухфазного генератора с синусоидальными напряжениями со сдвигом 90° на микроконтроллере STM32

Моделирование передачи данных через трехфазный каротажный кабель средствами MATLAB Simulink (часть 1)

Моделирование передачи данных через трехфазный каротажный кабель средствами MATLAB Simulink (часть 2)

Программирование линейного асинхронного двигателя (Z1 = 18) с трехфазной обмоткой индуктора с нулевым проводом

Моделирование синхронного неявнополюсного дугостаторного двигателя (Z1 = 12) с трехфазной обмоткой индуктора с нулевым проводом

Программирование линейного асинхронного двигателя (Z1 = 12) с трехфазной обмоткой индуктора с нулевым проводом

Похожие статьи

Регулирование скважности сигнала при помощи аналогового потенциометра с настройкой «мертвого времени» на микроконтроллере STM32

Программирование изменения скважности импульсов ШИМ на микроконтроллере STM32 с помощью кнопки

Программирование синусоидального и пилообразного сигналов с помощью цифро-аналогового преобразователя на микроконтроллере STM32

Программирование трехфазного генератора с синусоидальными напряжениями со сдвигом 120° на микроконтроллере STM32

Программирование двухфазного генератора с синусоидальными напряжениями со сдвигом 90° на микроконтроллере STM32

Моделирование передачи данных через трехфазный каротажный кабель средствами MATLAB Simulink (часть 1)

Моделирование передачи данных через трехфазный каротажный кабель средствами MATLAB Simulink (часть 2)

Программирование линейного асинхронного двигателя (Z1 = 18) с трехфазной обмоткой индуктора с нулевым проводом

Моделирование синхронного неявнополюсного дугостаторного двигателя (Z1 = 12) с трехфазной обмоткой индуктора с нулевым проводом

Программирование линейного асинхронного двигателя (Z1 = 12) с трехфазной обмоткой индуктора с нулевым проводом

Задать вопрос