Съдържание:

8 -канален програмируем таймер: 13 стъпки
8 -канален програмируем таймер: 13 стъпки

Видео: 8 -канален програмируем таймер: 13 стъпки

Видео: 8 -канален програмируем таймер: 13 стъпки
Видео: Кухонный таймер на Attiny13 и TM1637 2024, Ноември
Anonim
8 -канален програмируем таймер
8 -канален програмируем таймер
8 -канален програмируем таймер
8 -канален програмируем таймер
8 -канален програмируем таймер
8 -канален програмируем таймер

Въведение

Използвам микроконтролера PIC на Microchip за моите проекти от 1993 г. и направих цялото си програмиране на асемблерен език, използвайки Microchip MPLab IDE. Моите проекти варираха от прости светофари и мигащи светодиоди, до интерфейси за USB джойстик за R/C модели и анализатори на разпределителни устройства, използвани в индустрията. Разработката отне много дни, а понякога и хиляди редове асемблерен код.

След като получих Matrix Multimedia Flowcode 4 Professional, бях доста скептичен към софтуера. Изглеждаше твърде лесно за вярване. Реших да опитам и тествах всички различни макроси на компоненти, всички с голям успех. Най -добрата част от използването на Flowcode беше, че прости проекти могат да бъдат кодирани за една нощ. След като играх с I²C и часовник в реално време DS1307, реших да проектирам 8 -каналния таймер, използвайки Flowcode. Не като малък и лесен проект, вярвах, че това ще бъде чудесен проект да се науча на Flowcode.

Избор на микропроцесор и други компоненти

Поради необходимия брой входно -изходни щифтове беше ясно, че ще е необходимо 40 -пиново устройство. PIC 18F4520 е избран главно за неговата 32K програмна памет и 1536 байта памет за данни. Всички използвани компоненти са стандартни устройства с отвори, което прави възможно изграждането на веригата върху платката Vero, ако е необходимо. Това също помогна за разработването на макет.

Стъпка 1: Цели на проекта

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

Цели

- Прецизно отчитане на времето, с резервно копие на батерията.

- Всички програми и данни да бъдат запазени, дори след загуба на захранване.

- Прост потребителски интерфейс.

- Гъвкавост на програмирането.

Запазване на времето

Живеейки в зона, склонна към прекъсване на захранването, стандартните 50/60Hz от електропроводите няма да бъдат достатъчни за точно отчитане на времето. Часовникът в реално време беше от съществено значение и след като тествах няколко RTC чипа, реших да взема DS1307 поради простата му конфигурация на осцилатор и батерия. Доста точно отчитане на времето беше получено, като се използва само 32.768 kHz кристал, свързан към DS1307. Точността беше в рамките на 2 секунди за 2 -месечен пробен период, използвайки 4 различни марки кристали.

Задържане на данни

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

Прост потребителски интерфейс

Потребителският интерфейс се състои само от 2 елемента, 16 x 4 ред LCD дисплей с LED подсветка и 4 x 3 клавиатура. Цялото програмиране може да се извърши с натискане само на няколко бутона. Допълнения към интерфейса са звуков пиезо зумер и визуално мигаща LCD подсветка.

Стъпка 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, контролиращи напояването ми, което работи на 24V. Използвам канали 6-8 за включване на един от спомагателните изходи, за включване на 24V захранване за напоителната система.

Ръчно включено: Когато сте в основния екран, бутоните 1-8 могат да се използват за ръчно включване или изключване на канали.

Стъпка 3: Хардуер

Хардуер
Хардуер

Захранване: Захранването се състои от токоизправител, изглаждащ кондензатор и предпазител от 1 Amp за защита от претоварване. Това захранване след това се регулира от регулатор 7812 и 7805. 12V захранването се използва за задвижване на изходните релета, а всички останали вериги се захранват от 5V захранване. Тъй като регулаторът 7805 е свързан към изхода на регулатора 7812, общият ток трябва да бъде ограничен до 1 ампер през регулатора 7812. Препоръчително е тези регулатори да се монтират на подходящ радиатор.

I²C шина: Въпреки че Flowcode позволява хардуерно управление I²C, реших да използвам софтуерната конфигурация I²C. Това позволява по -голяма гъвкавост на присвояването на щифтове. Макар и по -бавен (50 kHz), той все още се представя отлично в сравнение с хардуерната I²C шина. И DS1307, и 24LC256 са свързани към тази I²C шина.

Часовник в реално време (DS1307): По време на стартиране регистърът RTC 0 и 7 се чете, за да се определи дали съдържа валидни времеви и конфигурационни данни. След като настройката е правилна, времето за RTC се отчита и времето се зарежда в PIC. Това е единственият път, когато времето се чете от RTC. След стартиране, 1Hz импулс ще присъства на пин 7 на RTC. Този 1Hz сигнал е свързан към RB0/INT0 и чрез рутинна услуга за прекъсване PIC времето се актуализира всяка секунда.

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

Сензор за ден/нощ: Като сензор за ден/нощ се използва стандартен резистор, зависим от светлина (LDR). Тъй като LDR се предлагат в много форми и разновидности, всички с различни стойности на съпротивление при едни и същи светлинни условия, използвах аналогов входен канал за отчитане на нивото на светлината. Дневните, както и нощните нива са регулируеми и позволяват известна гъвкавост за различни сензори. За да настроите някаква хистерезис, могат да бъдат зададени индивидуални стойности за Ден и Нощ. Състоянието ще се промени само ако нивото на светлината е под деня или над зададените точки през нощта за повече от 60 секунди.

LCD дисплей: Използва се 4-редов, 16-знаков дисплей, тъй като всички данни не могат да бъдат показани на двуредов дисплей. Проектът включва някои персонализирани знаци, които са дефинирани в макроса LCD_Custom_Char.

Спомагателни входове: И двата входа са буферирани с NPN транзистор. +12v и 0V също се предлагат на конектора, което позволява по -гъвкави връзки към външни връзки. Като пример, приемник за дистанционно управление може да бъде свързан към захранването.

Изходи: Всички изходи са електрически изолирани от веригата с помощта на 12V реле. Използваните релета са предназначени за 250V AC, при 10 ампера. Нормално отворените и нормално затворените контакти се извеждат към клемите.

Клавиатура: Използваната клавиатура е 3 x 4 матрична клавиатура и е свързана PORTB: 2..7.

Стъпка 4: Прекъсвания на клавиатурата

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

Исках да използвам прекъсването PORTB Прекъсване при смяна при всяко натискане на клавиш. За целта трябваше да се създаде персонализирано прекъсване в Flowcode, за да се гарантира, че посоката и данните на PORTB са настроени правилно преди и след всяко прекъсване на клавиатурата. Прекъсване се генерира при всяко натискане или отпускане на бутон. Програмата за прекъсване реагира само при натискане на клавиш.

МИСКОВО ПРЕКРАТЯВАНЕ

Активиране на кода

portb = 0b00001110; trisb = 0b11110001;

intcon. RBIE = 1;

intcon2. RBIP = 1;

intcon2. RBPU = 1;

rcon. IPEN = 0;

Код на манипулатора

if (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. За 10MHz часовник, използван в проекта, всяка инструкция ще бъде 400ns, а за да получа закъснение от 10us, имах нужда от 25 от тези инструкции.

Забележка във втория ред на Фигура 3: GetKeypadNumber Персонализиран код, че оригиналната команда delay_us (10) е деактивирана с “//”. Под това добавих моите 25 „wreg = porta;“команди за получаване на ново забавяне 10us. Без повиквания към никакви макроси в персонализирания код на Keypad_ReadKeypadNumber, макросът на клавиатурата вече може да се използва в рутина за прекъсване на услугата.

Трябва да се отбележи, че компонентите Flowcode Keypad и eBlocks не използват стандартните издърпващи се резистори на входните линии. Вместо това той използва 100K изтеглящи се резистори. Поради някои смущения, открити на клавиатурата по време на разработката, всички 100K резистори бяха заменени с 10K, а всички 10K резистори заменени с 1K5. Клавиатурата е тествана да работи правилно с проводници от 200 мм.

Стъпка 5: Използване на таймера

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

Всички екрани са настроени да показват цялата необходима информация, за да може потребителят да направи бързи промени в настройките. Ред 4 се използва за подпомагане при навигация през менютата и опциите на програмата. При нормална работа са налични общо 22 екрана.

ЛИНИЯ 1: Време и състояние

Показва текущия ден и час, последвано от икони на състоянието:

A - Показва, че Aux Input A е задействан и таймерът Aux Input A работи.

B - Показва, че Aux вход B е задействан и таймерът за Aux вход B работи.

C - Показва, че Aux изход C е включен.

D - Показва, че Aux изход D е включен.

} - Състояние на сензора за ден/нощ. Ако има, показва, че е нощ.

LINE 2: Програмни изходи

Показва каналите, които са били включени от различните програми. Каналите се показват в техните изходни номера, а „-“показва, че конкретният изход не е включен. Каналите, които са деактивирани в „Активни изходи на програмата“, все още ще бъдат посочени тук, но реалните изходи няма да бъдат зададени.

LINE 3: Реални изходи

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

ЛИНИЯ 4: Опции на менюто и клавишите (във всички менюта)

Показва функцията на клавишите “*” и “#”.

Централната част показва кои цифрови клавиши (0-9) са активни за избрания екран.

Състоянието на входа на Aux Input A & B също се показва чрез икона на отворен или затворен превключвател.

Изходите могат да се включват/изключват ръчно чрез натискане на съответния клавиш на клавиатурата.

В менютата клавишите Star и Hash се използват за навигация през различните опции на програмата. За задаване на опциите се използват клавиши 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 Поставете таймера в режим на готовност. За да включите таймера отново, натиснете произволен клавиш.

По време на неправилни записи на която и да е стойност на времето, подсветката на LCD дисплея ще мига 5 пъти, за да покаже грешка. В същото време ще прозвучи зумер. Командите Exit и Next ще работят само когато текущият запис е правилен.

LCD подсветка

При първоначално стартиране LCD подсветката ще се включи за 3 минути, освен ако:

- Има хардуерна повреда (EEPROM или RTC не са намерени)

- Времето не е зададено в RTC

Подсветката на LCD дисплея отново ще се включи за 3 минути при всеки потребителски вход на клавиатурата. Ако LCD подсветката е изключена, всяка команда от клавиатурата първо ще включи LCD подсветката и ще игнорира натиснатия клавиш. Това гарантира, че потребителят ще може да чете LCD дисплея, преди да използва клавиатурата. Подсветката на LCD дисплея също ще бъде включена за 5 секунди, ако е активиран Aux Input A или Aux Input B.

Стъпка 6: Екранни снимки на менюто

Екранни снимки на менюто
Екранни снимки на менюто
Екранни снимки на менюто
Екранни снимки на менюто
Екранни снимки на менюто
Екранни снимки на менюто

С помощта на клавиатурата всяка от опциите може да се програмира лесно. Изображенията дават известна информация за това какво прави всеки екран.

Стъпка 7: Проектиране на системата

Проектиране на системата
Проектиране на системата

Цялото разработване и тестване е направено на макет. Разглеждайки всички раздели на системата, разбих системата на три модула. Това решение се дължи главно на ограниченията на размера на печатната платка (80 x 100 mm) на безплатната версия на Eagle.

Модул 1 - Захранване

Модул 2 - платка на процесора

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

Реших, че всички компоненти трябва да бъдат лесно достъпни и че не искам да използвам компоненти за повърхностно монтиране.

Нека да преминем през всеки от тях.

Стъпка 8: Захранване

Захранване
Захранване
Захранване
Захранване
Захранване
Захранване
Захранване
Захранване

Захранването е право напред и захранва процесора и релейните платки с 12V и 5V.

Монтирах регулаторите на напрежението на прилични радиатори, а също така използвах за захранване надценени кондензатори.

Стъпка 9: Платка на процесора

CPU платка
CPU платка
CPU платка
CPU платка
CPU платка
CPU платка
CPU платка
CPU платка

Всички компоненти, с изключение на LCD екрана, клавиатурата и релетата са монтирани на платката на процесора.

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

Щифтовете/гнездата за заглавки осигуряват лесно свързване към LCD екрана и клавиатурата.

За изходите към релетата използвах ULN2803. Той вече съдържа всички необходими задвижващи резистори и обратни диоди. Това гарантира, че процесорната платка все още може да бъде направена с помощта на безплатната версия на Eagle. Релетата са свързани към двете ULN2803. Долният ULN2803 се използва за 8 -те изхода, а горният ULN2803 за двата спомагателни изхода. Всеки спомагателен изход има четири транзистора. Връзките към релетата също са чрез щифтове/гнезда на заглавието.

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

ЗАБЕЛЕЖКА:

Ще забележите, че платката съдържа допълнителна 8 -пинова IC. Горната IC е PIC 12F675 и е свързана към цифров вход. Това беше добавено по време на проектирането на печатни платки. Това улеснява предварителната обработка на цифровия вход. В моето приложение един от цифровите входове е свързан към моята алармена система. Ако алармата прозвучи, в къщата ми светват определени светлини. Активирането и дезактивирането на моята алармена система дава различни звукови сигнали на сирената. С помощта на PIC 12F675 вече мога да правя разлика между активиране/дезактивиране и истинска аларма. 12F675 е снабден и с гнездо за програмиране.

Също така предвидих I2C порт чрез заглавен щифт/гнездо. Това ще ви бъде полезно по -късно с релейните платки.

Платката съдържа няколко джъмпера, които трябва да бъдат запоени, преди да се монтират IC гнездата.

Стъпка 10: Заключение на Flowcode

Заключение за кода на потока
Заключение за кода на потока
Заключение за кода на потока
Заключение за кода на потока
Заключение за кода на потока
Заключение за кода на потока

Тъй като съм свикнал да работя на ниво регистър при сглобяването, понякога беше трудно и разочароващо да използвам макросите на компонентите. Това се дължи главно на липсата ми на познания относно програмната структура на Flowcode. Единствените места, където съм използвал блоковете C или ASM, е да включвам изходите в рутина на прекъсване и в рутината Do_KeyPressed, за да деактивирам/разреша прекъсването на клавиатурата. PIC също се поставя в SLEEP с помощта на ASM блок, когато EEPROM или RTC не са намерени.

Помощ за използването на различните команди I²C, всички бяха получени от помощните файлове на Flowcode. Изисква се да се знае точно как работят различните I²C устройства, преди командите да могат да се използват успешно. Проектирането на верига изисква от дизайнера да има на разположение всички съответни технически листове. Това не е недостатък на Flowcode.

Flowcode наистина издържа на теста и силно се препоръчва за хора, които искат да започнат работа с гамата микропроцесори Microchip.

Програмирането и конфигурирането на Flowcode за PIC бяха зададени според снимките

Стъпка 11: Незадължителна I2C релейна платка

Допълнителна I2C релейна платка
Допълнителна I2C релейна платка
Допълнителна I2C релейна платка
Допълнителна I2C релейна платка
Допълнителна I2C релейна платка
Допълнителна I2C релейна платка

Платката на процесора вече има заглавни връзки за 16 релета. Тези изходи са транзистори с отворен колектор чрез двата чипа ULN2803. Това може да се използва за директно захранване на релетата.

След първите тестове на системата не ми харесаха всички проводници между платката на процесора и релетата. Тъй като включих I2C порт на платката на процесора, реших да проектирам релейната платка за свързване към I2C порта. Използвайки 16 -канален чип MCP23017 I/O Port Expander чип и транзисторен масив ULN2803, намалих връзките между процесора и релетата до 4 проводника.

Тъй като не можех да поставя 16 релета на 80 x 100 мм печатна платка, реших да направя две платки. Всеки MCP23017 използва само 8 от своите 16 порта. Платка 1 управлява 8 -те изхода, а платка 2 двата спомагателни изхода. Единствената разлика на дъските е адресите на всяка дъска. Това лесно се настройва с мини джъмпер. Всяка платка има конектори за захранване и I2C данни към другата платка.

ЗАБЕЛЕЖКА:

Ако е необходимо, софтуерът предвижда само една платка, която може да използва всичките 16 порта. Всички данни за изходното реле са достъпни на първата платка.

Тъй като схемата е незадължителна и много проста, не създадох схематично. Ако има достатъчно търсене, мога да го добавя по -късно.

Стъпка 12: По избор RF връзка

По избор RF връзка
По избор RF връзка
По избор RF връзка
По избор RF връзка
По избор RF връзка
По избор RF връзка

След приключване на проекта скоро разбрах, че трябва да изтегля много 220V AC кабели към таймера. Разработих RF връзка, използвайки стандартни 315MHz модули, които позволиха таймерът да бъде поставен в шкаф, а релейните платки в покрива, близо до всички 220V кабели.

Връзката използва AtMega328P, работещ на 16MHz. Софтуерът както за предавателя, така и за приемника е един и същ, а режимът се избира от мини джъмпер.

Предавател

Предавателят е просто включен в CPU I2C порта. Не се изисква допълнителна настройка, тъй като AtMega328P слуша същите данни като релейните платки I2C.

Данните се актуализират веднъж в секунда на I2C порта и предавателят изпраща тази информация по RF връзка. Ако предавателят не получава I2C данни за около 30 секунди, той ще предава непрекъснато данни, за да изключи всички релета към приемника.

Захранването на предавателния модул може да бъде избрано между 12V и 5V с мини джъмпер на платката. Захранвам предавателя си с 12V.

Приемник

Приемникът слуша кодирани данни от предавателя и ги поставя на I2C порт. Релейната платка просто се включва в този порт и работи по същия начин, както е включена в платката на процесора.

Ако приемникът не получи валидни данни за 30 секунди, приемникът непрекъснато ще изпраща данни към I2C порта, за да изключи всички релета на релейните платки.

Схеми

Един ден, ако има търсене за него. Скицата на Arduino съдържа цялата необходима информация за изграждане на веригата без електрическа схема.

Обхват

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

Стъпка 13: Краен продукт

Краен продукт
Краен продукт
Краен продукт
Краен продукт
Краен продукт
Краен продукт

Основното устройство е монтирано в стара кутия за проекти. Той съдържа следното:

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

- Захранващ борд

- платка на процесора

- ЛСД дисплей

- Клавиатура

- Предавател за RF връзка

- Допълнително устройство за дистанционно управление на дома, което ми позволява да включвам/изключвам светлините чрез дистанционното

Релейният блок се състои от следното:

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

- Захранващ борд

- RF Link приемник

- 2 x I2C релейни платки

Всички дъски са проектирани с еднакви размери, което улеснява подреждането им една върху друга с 3 мм дистанционери.

Препоръчано: