Spkb-optics.ru

СПКБ Оптик
7 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Автоматический выключатель с таймером времени

Программный многозадачный таймер на МК

В различного рода сложности реализуемых алгоритмов при программировании МК, всегда возникают рутинные циклические и не очень задачи. Одни требуют повышенной точности, другие таким критерием не обязаны обладать. Аппаратных таймеров на борту МК может быть приличное количество, например STM32F4 — аж 14 штук, и это не считая SysTick (системного), а в других и пара тройка за счастье: тот же PIC16, например.

Для решения таких не спешных, не критичных ко времени задач можно и нужно применить программный таймер, на базе одного из аппаратных. Но обо всем по порядку.

Вместо предисловия

Спросим у ГУГЛА что он об этом думает?

Не задумываясь поисковик выдает примерно такой результат:

Предисловие

Как разработчик АСУ ТП, я часто программирую ПЛК различных фирм. Для любого ПЛК в среде разработки заготовлены библиотеки для программных таймеров. Почти все они имеют однотипную функциональность. Использование таймеров в программе ПЛК требуется во многих родах задачах, все их описывать смысла нет, поэтому я покажу пару примеров из АСУ ТП и эти примеры «грубо портируем» в данный модуль.

Мини ТЗ

Какого вида таймеры нужны в данном модуле? Я остановил выбор на четырех видах:

  • Таймер с задержкой на включение
  • Таймер с задержкой на выключение
  • Циклический таймер
  • Одиночный таймер

Первые два таймера явно перекочевали из АСУ ТП и программирования ПЛК. Два последних являются логическим расширением аппаратного таймера любого МК. Рассмотрим каждый вид таймера по отдельности.

Таймер с задержкой на включение

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

Читать еще:  Выключатель автоматический хт1в 160 tmd

В мире МК данный таймер найдет себе применение если необходимо обеспечить антидребез «сухого» контакта, для детектирования длинного нажатия на клавишу и т.д. Сфера деятельности данного таймера явно этим не исчерпывается.

Таймер с задержкой на выключение

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

Нужно это бывает, когда необходимо остановить задачу не одновременно с её «родителем», а немного позже. Данный вид таймера может показаться кому то экзотичном, при программировании МК, может и так, но как говорится пусть будет.

Циклический таймер

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

Одиночный таймер

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

Теперь все это реализуем в коде.

Модуль SwTimer

Название модуля говорит само за себя. Модуль состоит из двух файлов: хидера и сорца.

Данный хидер содержит дефайн, указывающий количество софтовых таймеров в массиве. Объявлен enum для «осознанного» описания режимов работы таймеров. Далее следует сама структура программного таймера. Единственное на что, хотелось бы обратить внимание, то что сам таймер является 24-х битным. В данной структуре это позволяет программному таймеру занимать место в 8 байт. 24 бита при переполнении аппаратного таймера в 1 мс позволяет достичь задержки в 4,66 часа или 16 777 секунд. Вполне достаточно.

Читать еще:  Форд фокус 2 выключатель массы

Главная функция, обеспечивающая работу всего модуля:

Данная функция должна вызываться при переполнении аппаратного таймера. В ней организован весь алгоритм работы модуля. Заглянем в код:

В цикле проходимся по всему массиву таймеров. Если таймер пуст = EMPTY, то переходим к следующему таймеру. В зависимости от режима работы таймера организована своя логика.

Вызов данной функции можно организовывать как из прерывания аппаратного таймера, так и из цикла в основной программе по флагу.
Вот пример из прерывания для STM32.

А вот из основного цикла:

Данная функция устанавливает режим работы конкретного таймера, устанавливает необходимую задержку.

Считываем состояние статуса таймера. Возвращает -1, если указанный таймер пустой.

Применение

Проинициализируем несколько таймеров с разными режимами. В основном цикле используем на наше усмотрение:

Если необходимо остановить циклический или одиночный таймер, то необходимо сбросить бит включения и выставить бит отключения.

Повторное включение через установку запускающего бита On.

Считывание статуса можно производить как функцией, так и непосредственно считывая бит.

Если таймер больше не нужен, то сократить время выполнения функции обработки массива таймеров можно если не просто остановить таймер, а удалить его, то есть перевести в режим ПУСТО. Для этого вызываем функцию подготовки таймера с режимом SWTIMER_MODE_EMPTY. Или прямо это указываем.

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

Данная статья является переработанным материалом урока STM32. Уроки по программированию STM32F4. Урок № 4. Программный многозадачный таймер STM32F4. автором которого я и являюсь.

Видео, демонстрирующие функции данного модуля программного многозадачного таймера:

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector