Оглавление:

8-канальный программируемый таймер: 13 шагов
8-канальный программируемый таймер: 13 шагов

Видео: 8-канальный программируемый таймер: 13 шагов

Видео: 8-канальный программируемый таймер: 13 шагов
Видео: 8-ми канальный таймер.Задержка отключения по управляющему входу. 2024, Ноябрь
Anonim
8-канальный программируемый таймер
8-канальный программируемый таймер
8-канальный программируемый таймер
8-канальный программируемый таймер
8-канальный программируемый таймер
8-канальный программируемый таймер

Вступление

Я использую микроконтроллеры Microchip PIC для своих проектов с 1993 года и все свое программирование выполнял на языке ассемблера, используя Microchip MPLab IDE. Мои проекты варьировались от простых светофоров и мигающих светодиодов до интерфейсов USB-джойстиков для моделей с дистанционным управлением и анализаторов коммутационного оборудования, используемых в промышленности. На разработку уходило много дней, а иногда и тысячи строк кода ассемблера.

После получения Matrix Multimedia Flowcode 4 Professional я довольно скептически отнесся к программе. В это было слишком легко поверить. Я решил попробовать и с большим успехом протестировал все различные макросы компонентов. Лучшая часть использования Flowcode заключалась в том, что простые проекты можно было написать за одну ночь. Поигравшись с I²C и часами реального времени DS1307, я решил разработать 8-канальный таймер с использованием Flowcode. Не будучи маленьким и легким проектом, я считал, что это будет отличный проект, чтобы научить себя Flowcode.

Выбор микропроцессора и других компонентов

Из-за количества требуемых выводов ввода-вывода было ясно, что потребуется устройство с 40 выводами. Был выбран PIC 18F4520, в основном из-за его 32 КБ памяти программ и 1536 байт памяти данных. Все используемые компоненты представляют собой стандартные устройства со сквозным отверстием, что позволяет при необходимости построить схему на плате Vero. Это также помогло в разработке макета.

Шаг 1. Цели проекта

Цели проекта
Цели проекта

Цели

- Точное время с резервным аккумулятором.

- Все программы и данные должны быть сохранены даже после отключения питания.

- Простой пользовательский интерфейс.

- Гибкость программирования.

Хранение времени

Если вы живете в зоне, подверженной сбоям в электроснабжении, стандартные 50/60 Гц от линий электропередачи не будут достаточными для точного отсчета времени. Часы реального времени были необходимы, и после тестирования нескольких микросхем RTC я остановился на DS1307 из-за его простой конфигурации генератора и резервного аккумулятора. Достаточно точное измерение времени было получено с использованием только кристалла 32,768 кГц, подключенного к DS1307. Точность была в пределах 2 секунд в течение двухмесячного испытательного периода с использованием кристаллов 4 разных марок.

Хранение данных

Все данные программы таймера должны быть сохранены даже во время сбоя питания. Благодаря наличию до 100 различных программ и различных данных конфигурации стало ясно, что 256 байтов встроенной EEPROM PIC будут недостаточно большими. 24LC256 I²C EEPROM используется для хранения всей программной информации.

Простой пользовательский интерфейс

Пользовательский интерфейс состоит всего из 2 элементов: ЖК-дисплея 16 x 4 строки со светодиодной подсветкой и клавиатуры 4 x 3. Все программирование может быть выполнено нажатием всего нескольких кнопок. Дополнениями к интерфейсу являются звуковой пьезозуммер и визуальная мигающая подсветка ЖК-дисплея.

Шаг 2: гибкость программирования

Гибкость программирования
Гибкость программирования

Для обеспечения достаточной гибкости программы таймер имеет 100 программ, которые можно настроить индивидуально. Для каждой программы можно установить время включения, время выключения, выходные каналы и день недели. Каждая программа имеет три режима:

- Авто: время включения, время выключения, выходной канал и день недели.

- Выкл.: Отдельную программу можно отключить, не удаляя настройки. Чтобы снова включить программу, просто выберите другой режим.

- День / ночь: время включения, время выключения, выходной канал и день недели. Работает так же, как автоматический режим, но будет

Включайте выходы между периодами включения и выключения только в темноте. Это также позволяет полностью контролировать день / ночь.

в качестве дополнительной гибкости для включения света на закате и выключения на рассвете.

Пример 1: Включает свет после 20:00 и выключает свет на восходе солнца.:

Вкл: 20:00, Выкл: 12:00, Пример 2: Включает свет на закате и выключает свет в 23:00.

Вкл: 12:00

Выкл: 23:00

Пример 3: Включает свет на закате и выключает свет на рассвете.

Вкл: 12:01

Выходной: 12:00

Доступны дополнительные опции, работающие независимо от 100 программ включения / выключения.

Активные программные каналы: вместо отключения нескольких программ можно отключить отдельные выходные каналы без необходимости изменения программ.

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

Вспомогательные выходы: доступны два дополнительных выхода (помимо 8 выходных каналов). Их можно запрограммировать на включение с помощью определенных выходных каналов или цифровых входов. В моей установке у меня есть выходы 6-8, управляющие моим поливом, работающим от 24В. Я использую каналы 6-8 для включения одного из вспомогательных выходов, чтобы включить питание 24 В для системы полива.

Включение вручную: на главном экране кнопки 1-8 можно использовать для ручного включения или выключения каналов.

Шаг 3: Оборудование

Аппаратное обеспечение
Аппаратное обеспечение

Источник питания: источник питания состоит из выпрямителя, сглаживающего конденсатора и предохранителя на 1 А для защиты от перегрузки. Затем эта подача регулируется регуляторами 7812 и 7805. Источник питания 12 В используется для управления выходными реле, а все остальные цепи питаются от источника питания 5 В. Поскольку регулятор 7805 подключен к выходу регулятора 7812, общий ток должен быть ограничен до 1 А через регулятор 7812. Эти регуляторы рекомендуется устанавливать на подходящем радиаторе.

Шина I²C: Хотя Flowcode допускает аппаратное управление I²C, я решил использовать программную конфигурацию I²C. Это обеспечивает большую гибкость при назначении контактов. Хотя он и медленнее (50 кГц), он по-прежнему отлично работает по сравнению с аппаратной шиной I²C. И DS1307, и 24LC256 подключены к этой шине I²C.

Часы реального времени (DS1307): во время запуска считываются регистры RTC 0 и 7, чтобы определить, содержат ли они действительное время и данные конфигурации. После правильной настройки время RTC считывается, и время загружается в PIC. Это единственный раз, когда время считывается из RTC. После запуска на выводе 7 RTC будет присутствовать импульс частотой 1 Гц. Этот сигнал с частотой 1 Гц подключается к RB0 / INT0, и через процедуру обслуживания прерывания время PIC обновляется каждую секунду.

Внешняя EEPROM: все программные данные и опции хранятся во внешней EEPROM. Данные EEPROM загружаются при запуске, а копия данных сохраняется в памяти PIC. Данные EEPROM обновляются только при изменении настроек программы.

Датчик «день / ночь»: в качестве датчика «день / ночь» используется стандартный светозависимый резистор (LDR). Поскольку LDR бывают разных форм и разновидностей, все с разными значениями сопротивления при одинаковых условиях освещения, я использовал аналоговый входной канал для считывания уровня освещенности. Уровни дневного и ночного режимов можно регулировать, что позволяет гибко использовать различные датчики. Чтобы настроить некоторый гистерезис, можно установить индивидуальные значения для дня и ночи. Состояние изменится только в том случае, если уровень освещенности ниже дневного или выше ночного заданных значений в течение более 60 секунд.

ЖК-дисплей: используется 4-строчный, 16-символьный дисплей, так как все данные не могут быть отображены на 2-строчном дисплее. В проект включены некоторые пользовательские символы, которые определены в макросе LCD_Custom_Char.

Вспомогательные входы: Оба входа буферизуются с помощью транзистора NPN. +12 В и 0 В также доступны на разъеме, что позволяет более гибко подключать внешние соединения. Например, к источнику питания можно подключить приемник дистанционного управления.

Выходы: Все выходы электрически изолированы от цепи с помощью реле 12 В. Используемые реле рассчитаны на 250 В переменного тока и 10 ампер. К клеммам выведены нормально разомкнутые и нормально замкнутые контакты.

Клавиатура: Используемая клавиатура представляет собой матричную клавиатуру 3 x 4 и подключается к PORTB: 2..7.

Шаг 4: прерывания с клавиатуры

Прерывания с клавиатуры
Прерывания с клавиатуры
Прерывания с клавиатуры
Прерывания с клавиатуры
Прерывания с клавиатуры
Прерывания с клавиатуры

Я хотел использовать прерывание PORTB Interrupt on Change при нажатии любой клавиши. Для этого в Flowcode нужно было создать пользовательское прерывание, чтобы гарантировать, что направление PORTB и данные установлены правильно до и после каждого прерывания клавиатуры. Прерывание генерируется каждый раз при нажатии или отпускании кнопки. Программа прерывания реагирует только на нажатие клавиши.

ПОЛЬЗОВАТЕЛЬСКОЕ ПРЕРЫВАНИЕ

Включить код

portb = 0b00001110; trisb = 0b11110001;

intcon. RBIE = 1;

intcon2. RBIP = 1;

intcon2. RBPU = 1;

rcon. IPEN = 0;

Код обработчика

если (intcon & (1 << RBIF))

{FCM_% n ();

portb = 0b00001110;

trisb = 0b11110001;

wreg = portb;

clear_bit (intcon, RBIF);

}

Обнаружены проблемы

Во время прерывания процедура обслуживания прерывания не должна ни при каких условиях вызывать любой другой макрос, который может использоваться где-то в остальной части программы. Это в конечном итоге приведет к проблемам переполнения стека, поскольку прерывание может произойти в то же время, когда основная программа также находится в той же подпрограмме. Это также определяется как СЕРЬЕЗНАЯ ОШИБКА Flowcode при компиляции кода.

В пользовательском коде клавиатуры под GetKeyPadNumber есть такой вызов макроса Delay_us, который вызовет переполнение стека. Чтобы преодолеть это, я удалил команду Delay_us (10) и заменил ее 25 строками «wreg = porta;» команды. Эта команда считывает PORTA и помещает его значение в регистр W, просто чтобы получить некоторую задержку. Эта команда будет скомпилирована в одну инструкцию, аналогичную команде ассемблера movf porta, 0. Для тактовой частоты 10 МГц, используемой в проекте, каждая инструкция будет составлять 400 нс, а для получения задержки 10 мкс мне понадобилось 25 из этих инструкций.

Обратите внимание на вторую строку рисунка 3: Пользовательский код GetKeypadNumber, что исходная команда delay_us (10) отключена с помощью «//». Ниже я добавил свои 25 «wreg = porta;» команды, чтобы получить новую задержку 10 мкс. Без вызовов каких-либо макросов внутри пользовательского кода Keypad_ReadKeypadNumber, макрос Keypad теперь можно использовать внутри подпрограммы обслуживания прерывания.

Следует отметить, что компоненты Flowcode Keypad и eBlocks не используют стандартные подтягивающие резисторы на входных линиях. Вместо этого используются понижающие резисторы 100 кОм. Из-за некоторых помех, обнаруженных на клавиатуре во время разработки, все резисторы 100 кОм были заменены на 10 кОм, а все резисторы 10 кОм заменены на 1 кОм. Клавиатура была проверена на правильность работы с проводами 200 мм.

Шаг 5: Использование таймера

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

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

СТРОКА 1: Время и статус

Показывает текущий день и время, а затем значки состояния:

A - указывает, что сработал вспомогательный вход A и работает таймер вспомогательного входа A.

B - указывает, что сработал вспомогательный вход B и работает таймер вспомогательного входа B.

C - указывает, что дополнительный выход C включен.

D - указывает, что дополнительный выход D включен.

} - Состояние датчика день / ночь. Если присутствует, означает, что сейчас ночь.

СТРОКА 2: Программные выходы

Показывает каналы, которые были включены разными программами. Каналы отображаются под номерами выходов, а знак «-» указывает на то, что конкретный выход не включен. Каналы, которые были отключены в «Program Outputs Active», по-прежнему будут отображаться здесь, но настоящие выходы не будут установлены.

СТРОКА 3: Реальные выходы

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

СТРОКА 4: Меню и ключевые параметры (во всех меню)

Указывает на функцию клавиш «*» и «#».

Центральная часть указывает, какие цифровые клавиши (0–9) активны для выбранного экрана.

Состояние входа дополнительных входов A и B также отображается с помощью значка переключателя «Открыто» или «Закрыто».

Выходы можно включить / выключить вручную, нажав соответствующую кнопку на клавиатуре.

Во всех меню кнопки со звездочкой и решеткой используются для навигации по различным параметрам программы. Клавиши 0-9 используются для установки опций. Если несколько параметров доступны на одном экране или в меню программирования, клавиша Hash используется для перехода по различным параметрам. Текущая выбранная опция всегда будет обозначаться символом «>» в левой части экрана.

0-9 Введите значения времени

1-8 Изменить выбор канала

14 36 Пошаговое переключение программ, 1 шаг назад, 4 шага назад 10 программ, 3 шага вперед, 6 шагов вперед 10

программы

1-7 Установите дни недели. 1 = воскресенье, 2 = понедельник, 3 = вторник, 4 = среда, 5 = четверг, 6 = пятница, 7 = суббота

0 На главном экране удалите все ручные настройки и таймеры входа A и входа B. В других меню изменения

выбранные варианты

# На главном экране отключит все ручные настройки, таймеры входа A и входа B и программные выходы, пока

следующее событие.

* и 1 Перезагрузите таймер

* и 2 Очистить все программы и параметры, восстановить настройки по умолчанию.

* и 3 Перевести таймер в режим ожидания. Чтобы снова включить таймер, нажмите любую клавишу.

При неправильном вводе любого значения времени подсветка ЖК-дисплея мигнет 5 раз, указывая на ошибку. В то же время раздастся зуммер. Команды Exit и Next будут работать только в том случае, если текущая запись верна.

ЖК-подсветка

При первом запуске подсветка ЖК-дисплея будет включена на 3 минуты, если:

- Аппаратный сбой (EEPROM или RTC не найдены)

- Время не установлено в RTC

Подсветка ЖК-дисплея снова включится на 3 минуты при любом вводе пользователя с клавиатуры. Если подсветка ЖК-дисплея выключена, любая команда клавиатуры сначала включает подсветку ЖК-дисплея и игнорирует нажатую клавишу. Это гарантирует, что пользователь сможет прочитать данные на ЖК-дисплее перед использованием клавиатуры. Подсветка ЖК-дисплея также будет включена на 5 секунд, если активирован дополнительный вход A или дополнительный вход B.

Шаг 6: снимки экрана меню

Снимки экрана меню
Снимки экрана меню
Снимки экрана меню
Снимки экрана меню
Снимки экрана меню
Снимки экрана меню

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

Шаг 7: Дизайн системы

Дизайн системы
Дизайн системы

Вся разработка и тестирование проводились на макетной плате. Глядя на все разделы системы, я разбил систему на три модуля. Это решение было в основном связано с ограничениями размера печатной платы (80 x 100 мм) бесплатной версии Eagle.

Модуль 1 - Источник питания

Модуль 2 - плата ЦП

Модуль 3 - Релейная плата

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

Пройдемся по каждому из них.

Шаг 8: Источник питания

Источник питания
Источник питания
Источник питания
Источник питания
Источник питания
Источник питания
Источник питания
Источник питания

Источник питания прямолинейный и обеспечивает питание ЦП и релейных плат напряжением 12 В и 5 В.

Я установил регуляторы напряжения на приличных радиаторах, а также использовал переоцененные конденсаторы для питания.

Шаг 9: плата ЦП

Плата ЦП
Плата ЦП
Плата ЦП
Плата ЦП
Плата ЦП
Плата ЦП
Плата ЦП
Плата ЦП

Все компоненты, кроме ЖК-экрана, клавиатуры и реле, смонтированы на плате ЦП.

Клеммные колодки были добавлены для упрощения соединений между источником питания, двумя цифровыми входами и датчиком освещенности.

Штыри / гнезда разъема обеспечивают легкое подключение к ЖК-экрану и клавиатуре.

Для выходов на реле я использовал ULN2803. Он уже содержит все необходимые управляющие резисторы и обратные диоды. Это обеспечило возможность изготовления платы ЦП с использованием бесплатной версии Eagle. Реле подключены к двум ULN2803. Нижний ULN2803 используется для 8 выходов, а верхний ULN2803 - для двух дополнительных выходов. Каждый вспомогательный выход имеет четыре транзистора. Подключение к реле также осуществляется через штырьки / гнезда заголовка.

PIC 18F4520 был оснащен разъемом для программирования, чтобы облегчить программирование с помощью программатора PicKit 3.

ЗАМЕТКА:

Вы заметите, что на плате есть дополнительная 8-контактная микросхема. Верхняя микросхема - это PIC 12F675, подключенная к цифровому входу. Это было добавлено во время проектирования печатной платы. Это упрощает предварительную обработку цифрового входа. В моем приложении один из цифровых входов подключен к моей системе сигнализации. Если звучит будильник, в моем доме включается определенный свет. При постановке на охрану и снятии с охраны моя сигнализация издает разные звуковые сигналы сирены. Используя PIC 12F675, я теперь могу различать постановку / снятие с охраны и настоящую тревогу. 12F675 также оснащен разъемом для программирования.

Я также предусмотрел порт I2C через контактный разъем / разъем заголовка. Это пригодится позже с релейными платами.

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

Шаг 10: Заключение Flowcode

Заключение Flowcode
Заключение Flowcode
Заключение Flowcode
Заключение Flowcode
Заключение Flowcode
Заключение Flowcode

Поскольку я привык работать на уровне регистров в сборке, иногда было сложно и неприятно использовать макросы компонентов. В основном это произошло из-за моего незнания структуры программирования Flowcode. Единственные места, где я использовал блоки C или ASM, - это включение выходов внутри процедуры прерывания и в подпрограмме Do_KeyPressed для отключения / включения прерывания клавиатуры. PIC также переводится в спящий режим с помощью блока ASM, когда EEPROM или RTC не найдены.

Помощь по использованию различных команд I²C была получена из файлов справки Flowcode. Прежде чем использовать команды, необходимо точно знать, как работают различные устройства I²C. Проектирование схемы требует, чтобы разработчик имел в наличии все соответствующие таблицы данных. Это не недостаток Flowcode.

Flowcode действительно выдержал испытание и настоятельно рекомендуется тем, кто хочет начать работать с микропроцессорами семейства Microchip.

Программирование и конфигурация кода потока для PIC были установлены, как показано на картинках.

Шаг 11: Дополнительная плата реле I2C

Дополнительная плата реле I2C
Дополнительная плата реле I2C
Дополнительная плата реле I2C
Дополнительная плата реле I2C
Дополнительная плата реле I2C
Дополнительная плата реле I2C

На плате ЦП уже есть разъемы для 16 реле. Эти выходы представляют собой транзисторы с открытым коллектором через две микросхемы ULN2803, которые могут использоваться для непосредственного питания реле.

После первых тестов системы мне не понравились все провода между платой процессора и реле. Поскольку я включил порт I2C на плату ЦП, я решил спроектировать плату реле для подключения к порту I2C. Используя 16-канальную микросхему расширителя портов ввода-вывода MCP23017 и массив транзисторов ULN2803, я сократил количество соединений между ЦП и реле до 4-х проводных.

Поскольку я не мог разместить 16 реле на печатной плате 80 x 100 мм, я решил сделать две платы. Каждый MCP23017 использует только 8 из 16 портов. Плата 1 обрабатывает 8 выходов, а плата 2 - два вспомогательных выхода. Единственная разница на платах - это адреса каждой платы. Это легко устанавливается с помощью мини-джемпера. Каждая плата имеет разъемы для подачи питания и данных I2C на другую плату.

ЗАМЕТКА:

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

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

Шаг 12: Дополнительная радиочастотная связь

Дополнительная радиочастотная связь
Дополнительная радиочастотная связь
Дополнительная радиочастотная связь
Дополнительная радиочастотная связь
Дополнительная радиочастотная связь
Дополнительная радиочастотная связь

После завершения проекта я вскоре понял, что мне нужно протянуть к таймеру много проводки 220В переменного тока. Я разработал ВЧ-канал с использованием стандартных модулей 315 МГц, которые позволили разместить таймер внутри шкафа, а релейные платы - внутри крыши, рядом со всей проводкой 220 В.

Ссылка использует AtMega328P, работающий на частоте 16 МГц. Программное обеспечение для передатчика и приемника одинаковое, а режим выбирается мини-перемычкой.

Передатчик

Передатчик просто подключается к порту I2C ЦП. Никакой дополнительной настройки не требуется, поскольку AtMega328P прослушивает те же данные, что и релейные платы I2C.

Данные обновляются один раз в секунду на порте I2C, и передатчик отправляет эту информацию по каналу RF. Если передатчик не получает данные I2C в течение примерно 30 секунд, передатчик будет непрерывно передавать данные, чтобы выключить все реле на приемном устройстве.

Питание модуля передатчика можно выбрать в диапазоне от 12 В до 5 В с помощью мини-перемычки на печатной плате. Я питаю свой передатчик от 12 В.

Получатель

Приемник прослушивает кодированные данные от передатчика и помещает данные в порт I2C. Релейная плата просто подключается к этому порту и работает так же, как она была подключена к плате ЦП.

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

Схемы

Однажды, если на это будет спрос. Эскиз Arduino действительно содержит всю необходимую информацию для построения схемы без принципиальной схемы.

Диапазон

В моей установке передатчик и приемник находятся на расстоянии около 10 метров друг от друга. Таймер находится внутри шкафа, а реле - на потолке.

Шаг 13: конечный продукт

Конечный продукт
Конечный продукт
Конечный продукт
Конечный продукт
Конечный продукт
Конечный продукт

Основной блок был помещен в коробку старого проекта. Он содержит следующее:

- Трансформатор 220В / 12В

- Плата блока питания

- Плата процессора

- ЖК дисплей

- клавиатура

- Передатчик RF Link

- Дополнительный домашний пульт дистанционного приемника, чтобы я мог включать / выключать свет с помощью пульта дистанционного управления

Релейный блок состоит из следующего:

- Трансформатор 220В / 12В

- Плата блока питания

- Приемник RF Link

- 2 релейных платы I2C

Все доски были спроектированы с одинаковыми размерами, что позволяет легко складывать их друг на друга с помощью 3-миллиметровых распорок.

Рекомендуемые: