Однажды мне попалось электронное цифровое реле времени ВЛ-76-С, новое, в упаковке, но в неисправном состоянии.
На печатных платах внутри никаких дефектов обнаружено не было.
Следовательно, это был производственный брак, сломанная прошивка.
Общий вид реле.
Что удивило, так это то, что использовался популярный и простой микроконтроллер ATTiny2313. Внешне данная конструкция состоит из контроллера в виде трёх декадных переключателей и клеммы, на которую выводится питание 220В и контакты исполнительного реле.
Диапазон настройки – 0,1…99,9 мин.
с шагом 0,1 мин.
(6 секунд).
Схем и прошивок данной конструкции в интернете нет, что неудивительно.
Недолго думая, я решил скопировать схему с печатной платы и потом сам написать программу на МК.
Конструкция состоит из трёх печатных плат, соединённых между собой.
Первая плата содержит источник питания и исполнительное реле TRA3. Блок питания выполнен по бестрансформаторной схеме: для снижения напряжения используются гасящие конденсаторы.
Вторая плата содержит МК ATTiny2313 и другие вспомогательные элементы.
На третьей плате расположены переключатели (сеттеры) и контрольный светодиод.
Фото третьей платы с обратной стороны.
Описание начну с третьей платы.
Уставки представляют собой 10-позиционные переключатели.
Маркировки на них нет, на каждом по 5 контактов.
Поэтому в зависимости от положения те или иные контакты замыкаются в различных сочетаниях.
Прозвонив контакты, я сразу уловил закономерность: один фиксированный контакт (общий) соединяется с остальными четырьмя контактами (информационными) согласно двоичному представлению числа, соответствующего номеру выбранной позиции.
Например, если выбрано положение «3», то общий вывод (пятый по счету) замыкается с третьим и четвертым выводами, поскольку число «3» в двоичном представлении — «0011».
Вот такой хитрый переключатель.
И их трое.
Они подключаются через разъемы ХР1 и ХР2 ко второй плате с МК.
Светодиод и еще какая-то ненужная нераспаянная хрень подключается через разъем ХР3, для которого на плате есть место.
Скорее всего это обычный шестиконтактный переключатель DPDT (квадратный, например PB22E06).
Возможно плата универсальная, но именно в этой модели она не используется.
Фото второй (основной) платы.
Прозванивая контакты переключателей, я не сразу понял принцип их подключения к портам МК.
На основной плате сразу бросаются в глаза 8 SMD-транзисторов.
Позже я узнал, что эти транзисторы используются в виде диодных пар с общим анодом.
Их базы идут к портам МК, а коллекторы и эмиттеры – к контактам переключателя.
Потом мне объяснили, что в таких случаях есть диодные пары, они по звуку похожи на транзисторы, но они не транзисторы.
Всего у нас от диодных пар к третьей плате уходит 16 проводников.
Три четверти из них (12 штук) приходят на информационные контакты выключателей (три на четыре), а 4 остаются свободными.
Нетрудно догадаться, что теоретически они предусмотрены для четвертого переключателя, которого и так не хватает, ведь места на плате для него вообще нет. Тем не менее, чтобы не нарушать логику рассуждений, упомяну об этом воображаемом четвертом переключателе.
Общие концы второго и третьего, а также первого и четвертого переключателей (но четвертый на плате не предусмотрен) попарно соединены дорожками в основной плате на ответных разъемах XS1 и XS2. Эти две пары подключены к выходам транзисторных групп.
Эти две одинаковые группы выполнены на транзисторах ВС857 и ВС847 (разной структуры).
Их входы подключены к МК.
Когда на вход этой группы подается логический «0», на выходе также будет логический «0».
Также на плате имеется разъем XP2 для прошивки прошивки МК, подключенный к контактам SPI интерфейса МК, соответствующий разъем XS3 для светодиода и разъем XP1, подключенный шлейфом к первой плате.
Следует помнить, что часть портов МК можно использовать как для SPI (для прошивки), так и для обычного ввода-вывода (работа в схеме).
Все вышесказанное отражено в схемах, которые я нарисовал сначала в черновике, затем в SPlan. Номиналы радиоэлементов, не имеющих маркировки (например, конденсаторов СМД), на схемах не указаны; они не так важны.
Сначала приведу схему основной платы и платы с мастерами (подписи к картинкам ниже).
Схема основной платы.
Схема третьей доски с мастерами
Давайте посмотрим, как опрашивается каждый мастер.
Сигналы с портов ПБ4 и ПБ5 МК с логическим «0» открывают транзисторы VT2 и VT1, а затем VT4 и VT3, соединяя общие контакты переключателей №1 и №2-№.
3 к нулевой шине соответственно.
Это происходит один за другим.
Сначала логический «0» поступает от PB4 (PB5 пока установлен на логическую «1»), соединяя второй и третий переключатель.
В этом состоянии значения сигналов регистрируются контроллером поочередно с входных портов PB3, PB2, PB1, PB0 через диодные группы 2VD1.2VD4 со второго и недостающего четвертого ключей.
Сразу же записываются значения сигналов с выводов PD6, PD5, PD4, PD3 МК, на которые через диодные группы 2VD5.2VD8 поступают сигналы от первого и третьего ключей.
Но, так как у нас есть только второй и третий свитч, соединенные общим контактом, то на первые указанные порты МК со второго свитча фактически будут поступать сигналы, а четвертый будет игнорироваться.
Аналогично вторая половина МК будет получать сигналы только от третьего коммутатора, а первая будет игнорироваться.
На этом этапе контроллер знает, в каких положениях установлены второй и третий переключатели.
После этого РВ4 устанавливают на «единицу», отключив второй и третий ключи, а РВ5 устанавливают на «ноль».
При этом первый и недостающий четвертый переключатели соединяются общим концом с «корпусом».
Их опрос происходит точно так же, как и в предыдущем случае, но теперь будут записываться сигналы от тех коммутаторов, которые были проигнорированы в прошлый раз.
Таким образом, контроллер знает информацию о положениях всех переключателей.
Этот процесс аналогичен опросу матричной клавиатуры, но в данном случае матрица представляет собой «4-слой» 2х2 с одним недостающим элементом.
Резисторы R8…R15 подтягивающие.
Хотя, можно было и в самом МК «подтянуться».
Точную тактовую частоту МК обеспечивает кварц 10 МГц.
R1 и C4 – цепь сброса МК.
Больше ничего интересного на этой плате нет.
Фото первой (силовой) платы со стороны элементов.
Фото первой (силовой) платы с обратной стороны.
Перейдем к рассмотрению схемы первой платы (рис.
выше).
Схема показалась очень интересной и местами непонятной.
Схема первой (силовой) платы.
C1C2 – для снижения напряжения.
R1 – для разрядки вышеперечисленного.
После диодного моста DB1 находятся два электролита.
Для усложнения схемы (или для надежности) - схема каскадной стабилизации VT3R6VD3 - VT7R12VD5. VD5 похож на SMD-транзистор с неиспользуемым эмиттером.
Здесь обеспечивается стабилизированное постоянное напряжение 12В.
Далее идет линейный стабилизатор VR1 на 5В.
Параллельно напряжение с диодного моста DB1 снимается через диод VD2 на другой стабилизатор 24В VT1R3VD1. Это напряжение подается на обмотку ЭМ реле Rel1 и на R17. Последнее непонятно почему.
Сигнал с транзисторной группы VT9VT10 поступает на другой конец R17. Схема этой группы аналогична схеме на основной плате.
На вход этой транзисторной группы через разъем поступает сигнал с отдельного порта МК ПБ6. Для чего это? Зачем подключать резистор R17 к 24В? Скорее всего, была идея, что вместо резистора можно установить что-нибудь другое, например внутренний контрольный светодиод, запрограммировав определенным образом порт PB6 МК.
Либо дополнительный коммутационный узел.
Но, все равно, это ерунда, как выразились мои друзья-радиоинженеры, посмотрев на конструкторскую плату.
Второй конец реле ЭМ Rel1 подключен к аналогичной группе транзисторов VT2VT5, и он подключен к порту МК PD0. Сигнал «0» с этого порта включает исполнительное реле.
Самое интересное, что внешний светодиод подключается не параллельно реле, а в эмиттерный промежуток транзистора VT2, причем через два разъема (минуя основную плату).
На клемме контакты номера 1 и 2, судя по наклейке на реле, остаются пустыми.
Но в схеме контакт №2 соединен с общим проводом, а контакт №1 идет на вход транзисторной группы ВТ6ВТ8. Выход из этой группы поступает на порт PD2 МК.
Позже в спецификации к этой модели реле я прочитал, что эти контакты используются для управления в других моделях реле, собранных в том же корпусе.
Рассматриваемая мной модель не предполагает управления, но может быть реализована при написании программы на МК, поскольку в схеме предусмотрена такая возможность.
Управление может означать запуск, сброс (как в «триггерном», так и в обычном режиме) и все, что придет в голову.
В характеристиках остальных реле есть временные диаграммы, показывающие поведение реле в зависимости от заданного управляющего сигнала.
Там же ниже написано: по желанию заказчика мы можем реализовать любую возможную схему.
И последний пункт схемы.
Этот сигнал управления с вывода №1 также поступает на бесполезный транзистор VT4, питаемый напряжением 12В.
Это опять же усложнение схемы.
А может здесь есть какая-то другая идея? Я не вникал глубоко.
Буду рад любым комментариям.
Маркировка контактов разъема отмечена точкой после названия самого разъема.
Римские цифры после символа «~» обозначают бесполезные и недостающие контакты.
Последних в схеме довольно много, но я не буду на них останавливаться.
Ниже представлены эскизы каждой платы с обозначениями разъемов, контактов и основных элементов.
ЭСценки из досок.
Рассмотрим описание исходного кода программы МК.
Сама программа проста и была написана мной на CVAVR за 20 минут. Я укажу алгоритм, по которому будет выполняться программа.
Кому-то эта информация может показаться очень банальной, но новичкам она не будет лишней.
В моей версии алгоритма мастера на реле времени будут опрашиваться не один раз, а постоянно.
Более того, опрос продолжится даже после срабатывания реле.
Это позволит вам вносить коррективы на лету.
Возможно этот алгоритм не совпадает с исходным алгоритмом работы этого реле, но исходный алгоритм мне не знаком.
Именно на примере приведенного алгоритма и будет рассмотрено описание программы.
Исходный код программы на языке C с описанием.
Подключаем библиотеку для работы с микроконтроллером ATTiny2313, а также библиотеку функций задержки.
Далее делаем необходимые макроподстановки, согласно схемным назначениям портов МК.#include <tiny2313.h> #include <delay.h>
Эти замены удобны тем, что в тексте программы вместо, например, PORTB.5 можно написать getAD, что удобнее.
Комбинация getAD во время компиляции будет интерпретироваться как PORTB.5. Итак, первая замена – это выходы для подключения первого (А) и четвертого (D) мастер-выключателей.
Второй – для второго (Б) и третьего (С).
Далее происходит замена включения реле.
И, наконец, подмена «Ctrl», которая не используется в программе и в рассматриваемой модели.
Вам не обязательно это писать.
#define getAD PORTB.5
#define getBC PORTB.4
#define RL PORTD.0
#define Ctrl PIND.2
Переменные A, B, C используются для хранения номеров позиций соответствующих трех переключателей и принимают значения от 0 до 9. unsigned char A,B,C;
Переменная i — это текущее значение числа десятых долей минуты (6 секунд), то есть номера минимального «тикания» реле.
Переменная t — количество десятых минут (тиков), полученных от мастера.
unsigned int i=0,t;
Основные функции программы представлены ниже.
Я не понял первые 6 строк.
Они генерируются с помощью вспомогательной утилиты CodeWizadAVR и связаны с наличием внешнего кристалла 10 МГц.
void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Следующие две строки настраивают порт B нашего МК.
По схеме ставим на вход младшие 4 бита, а на выход - старшие (PB7 не используется, а PB6 бесполезен, но по задумке схемы является выход).
Поэтому согласно принципам настройки МК, которые я не буду излагать, в регистр DDRB записываем число 240 (F0 в шестнадцатеричной записи).
Начальный уровень вывода — «1», за исключением ненужного PB7. И на всякий случай подключим ко входам «подтягивающие резисторы» МК, хотя они уже установлены в схеме.
Для этого мы присвоим регистру PORTB значение 7F в шестнадцатеричной записи.
PORTB=0x7F;
DDRB=0xF0;
Порт D настраивается таким же образом.
Все контакты являются входными, кроме двух младших.
«Подтягивающие резисторы» на входах и начальный выходной уровень «1» на выходах аналогичны.
PORTD=0x7D;
DDRD=0x03;
Следующие пять строк относятся к настройке одного из таймеров МК.
Этот таймер шестнадцатибитный, то есть обеспечивает счет до 2^16=65536. Частота счета определяется тактовой частотой МК и коэффициентом деления (одним из пяти заданных).
В описываемой программе было решено считать 6 секунд (минимальный шаг задачи), затем увеличить переменную i на 1 и сбросить таймер на начало счета.
Для того чтобы обеспечить вышеизложенное, нужно взять максимальный коэффициент деления 1024 и досчитать до 58594. Последнее вычислить нетрудно.
Частота МК – 10000000 Гц.
Используя коэффициент деления 1024, частота таймера составит 10000000/1024=9765,625 Гц, а период составит 1024/10000000=0,0001024 секунды.
В течение 6 секунд будет соблюдено 6/0,0001024=58593,75 таких периодов.
Это число лежит в пределах 16-битного таймера, но оно не целое, поэтому нам придется округлить его до 58594. В этом случае погрешность нашего реле времени будет незначительной: 58594-58593,75=0,25; 0,25*0,0001024=0,0000256; 0,0000256*999=0,0255744. То есть за максимально возможный промежуток времени (99,9 минут) погрешность этого реле времени составит примерно 25,6 миллисекунды, что вполне приемлемо на практике.
Кстати, производитель тоже оговаривает погрешность устройства, и наша ошибка будет не хуже.
Записываем значение 5 в регистр конфигурации таймера TCCR1B. Не вдаваясь в подробности, это означает, что таймер запускается и коэффициент деления равен 1024. Записываем значение 0 в регистр TCNT1. Этот регистр 16-битный и разделен на две 8-битные половины: младшую (L) и старшую (H).
В него записывается значение, от которого будет отсчитываться таймер.
Нам нужно считать с нуля.
В регистр OCR1A записывается значение, до которого будет считать таймер, после чего он вызовет функцию прерывания.
В этот момент выполнение основной функции программы будет прервано и будут выполнены действия, указанные в функции этого прерывания.
После обработки прерывания выполнение основной функции продолжится.
Это значение, как уже говорилось выше, равно 58594 (E4E2 в шестнадцатеричной записи).
Поскольку регистр OCR1A тоже разделен на две половины, то указанное выше значение записываем по частям.
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0xE4;
OCR1AL=0xE2;
Следующие две строки настраивают правильное разрешение прерываний (не вдаваясь в подробности).
TIMSK=0x40;
#asm("sei")
В основном цикле постоянно опрашиваются главные переключатели (согласно алгоритму в описании схемы) с использованием задержек в 30 мс для корректности и стабильности работы.
Установив для PORTB.5 значение «0» (getAD=0), мы подготавливаем первый переключатель.
Его выводы подключены к порту D МК к контактам 6, 5, 4, 3. Направление — от низкого к высокому.
То есть младший бит коммутатора соединен с относительно младшим битом (бит 3) порта D МК.
Следовательно, чтобы получить информацию от порта D МК о положении первого переключателя, необходимо выполнить битовый сдвиг вправо на три позиции (PIND> > 3), инвертировать полученные биты с помощью команды «~ » (поскольку по схеме информация поступит в «0») и обнулит ненужные старшие четыре бита полученного 8-битного значения.
Последняя операция производится путем логического поразрядного умножения результата на число 15 (00001111 в двоичном представлении).
После этой операции переменной А будет присвоено значение положения первого переключателя.
Далее первый переключатель отключается, а второй и третий подготавливаются.
Значение со второго переключателя на переменную B снимается с порта B МК таким же образом, но без операции сдвига, так как выходы этого переключателя подключены к нижним выводам порта B МК, а также в в том же направлении.
Информация от третьего переключателя передается в переменную С так же, как и от первого.
После этого второй и третий ключи «замыкаются» (getBC=1) и заданное значение (количество десятых минут) от трёх переключателей пересчитывается в переменную t. while(1){
delay_ms(30);
getAD=0;
delay_ms(30);
A=(~(PIND>>3)&15);
delay_ms(30);
getAD=1;
getBC=0;
delay_ms(30);
B=(~PINB)&15;
C=(~(PIND>>3)&15);
delay_ms(30);
getBC=1;
t=100*A+10*B+C;
}
}
Сравнение этой переменной и аналогичной переменной реального времени i происходит в функции прерывания.
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
Теги: #Программирование микроконтроллеров #Производство и разработка электроники #Электроника для начинающих #C++ #обратное проектирование #attiny2313 #реле времени
-
Восстановление Данных Стало Проще
19 Oct, 24 -
Подпороговое Восприятие
19 Oct, 24 -
Ссылка «Все» На Странице Блога
19 Oct, 24 -
Что Такое Нейралинк? Разбор
19 Oct, 24 -
Играй В Коробку
19 Oct, 24