Обратная Разработка Реле Времени Вл-76-С

Однажды мне попалось электронное цифровое реле времени ВЛ-76-С, новое, в упаковке, но в неисправном состоянии.

На печатных платах внутри никаких дефектов обнаружено не было.

Следовательно, это был производственный брак, сломанная прошивка.



Обратная разработка реле времени ВЛ-76-С

Общий вид реле.

Что удивило, так это то, что использовался популярный и простой микроконтроллер ATTiny2313. Внешне данная конструкция состоит из контроллера в виде трёх декадных переключателей и клеммы, на которую выводится питание 220В и контакты исполнительного реле.

Диапазон настройки – 0,1…99,9 мин.

с шагом 0,1 мин.

(6 секунд).

Схем и прошивок данной конструкции в интернете нет, что неудивительно.

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

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

Первая плата содержит источник питания и исполнительное реле TRA3. Блок питания выполнен по бестрансформаторной схеме: для снижения напряжения используются гасящие конденсаторы.

Вторая плата содержит МК ATTiny2313 и другие вспомогательные элементы.

На третьей плате расположены переключатели (сеттеры) и контрольный светодиод.

Обратная разработка реле времени ВЛ-76-С

Фото третьей платы с обратной стороны.

Описание начну с третьей платы.

Уставки представляют собой 10-позиционные переключатели.

Маркировки на них нет, на каждом по 5 контактов.

Поэтому в зависимости от положения те или иные контакты замыкаются в различных сочетаниях.

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

Например, если выбрано положение «3», то общий вывод (пятый по счету) замыкается с третьим и четвертым выводами, поскольку число «3» в двоичном представлении — «0011».

Вот такой хитрый переключатель.

И их трое.

Они подключаются через разъемы ХР1 и ХР2 ко второй плате с МК.

Светодиод и еще какая-то ненужная нераспаянная хрень подключается через разъем ХР3, для которого на плате есть место.

Скорее всего это обычный шестиконтактный переключатель DPDT (квадратный, например PB22E06).

Возможно плата универсальная, но именно в этой модели она не используется.



Обратная разработка реле времени ВЛ-76-С

Фото второй (основной) платы.

Прозванивая контакты переключателей, я не сразу понял принцип их подключения к портам МК.

На основной плате сразу бросаются в глаза 8 SMD-транзисторов.

Позже я узнал, что эти транзисторы используются в виде диодных пар с общим анодом.

Их базы идут к портам МК, а коллекторы и эмиттеры – к контактам переключателя.

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

Всего у нас от диодных пар к третьей плате уходит 16 проводников.

Три четверти из них (12 штук) приходят на информационные контакты выключателей (три на четыре), а 4 остаются свободными.

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

Общие концы второго и третьего, а также первого и четвертого переключателей (но четвертый на плате не предусмотрен) попарно соединены дорожками в основной плате на ответных разъемах XS1 и XS2. Эти две пары подключены к выходам транзисторных групп.

Эти две одинаковые группы выполнены на транзисторах ВС857 и ВС847 (разной структуры).

Их входы подключены к МК.

Когда на вход этой группы подается логический «0», на выходе также будет логический «0».

Также на плате имеется разъем XP2 для прошивки прошивки МК, подключенный к контактам SPI интерфейса МК, соответствующий разъем XS3 для светодиода и разъем XP1, подключенный шлейфом к первой плате.

Следует помнить, что часть портов МК можно использовать как для SPI (для прошивки), так и для обычного ввода-вывода (работа в схеме).

Все вышесказанное отражено в схемах, которые я нарисовал сначала в черновике, затем в SPlan. Номиналы радиоэлементов, не имеющих маркировки (например, конденсаторов СМД), на схемах не указаны; они не так важны.

Сначала приведу схему основной платы и платы с мастерами (подписи к картинкам ниже).



Обратная разработка реле времени ВЛ-76-С

Схема основной платы.



Обратная разработка реле времени ВЛ-76-С

Схема третьей доски с мастерами Давайте посмотрим, как опрашивается каждый мастер.

Сигналы с портов ПБ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 – цепь сброса МК.

Больше ничего интересного на этой плате нет.

Обратная разработка реле времени ВЛ-76-С

Фото первой (силовой) платы со стороны элементов.



Обратная разработка реле времени ВЛ-76-С

Фото первой (силовой) платы с обратной стороны.

Перейдем к рассмотрению схемы первой платы (рис.

выше).

Схема показалась очень интересной и местами непонятной.



Обратная разработка реле времени ВЛ-76-С

Схема первой (силовой) платы.

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В.

Это опять же усложнение схемы.

А может здесь есть какая-то другая идея? Я не вникал глубоко.

Буду рад любым комментариям.

Маркировка контактов разъема отмечена точкой после названия самого разъема.

Римские цифры после символа «~» обозначают бесполезные и недостающие контакты.

Последних в схеме довольно много, но я не буду на них останавливаться.

Ниже представлены эскизы каждой платы с обозначениями разъемов, контактов и основных элементов.



Обратная разработка реле времени ВЛ-76-С

ЭСценки из досок.

Рассмотрим описание исходного кода программы МК.

Сама программа проста и была написана мной на 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 #реле времени

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.