Товары из Китая

Индикаторные модули SA40-2003-V1. Как это устроено


Индикаторные модули SA40-2003-V1. Как это устроено

Упоминания об этих модулях в интернете мне не попадалось.

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

Под катом — разборка и немного реверсинга.

Итак, спереди они выглядят обычными семисегментными индикаторами:

Индикаторные модули SA40-2003-V1. Как это устроеноНу да, немаленькие.

А вот сзади уже всё не так однозначно.

Индикаторные модули SA40-2003-V1. Как это устроеноПокрупнее:

Индикаторные модули SA40-2003-V1. Как это устроеноБерём в руки паяльник, моток оплётки и снимаем плату с индикатора:

Индикаторные модули SA40-2003-V1. Как это устроеноПлата односторонняя.

Индикаторные модули SA40-2003-V1. Как это устроеноНа ней распаяны микросхемы 74AC164(поменьше) и ULN2003А. Ещё тут есть пачка 100-омных резисторов и единственный керамический конденсатор, висящий на линии питания одной из микросхем.

Восстановленная принципиальная схема модуля:

Индикаторные модули SA40-2003-V1. Как это устроено74AC164 — это 8-битный сдвиговый регистр, позволяющий управлять 8 светодиодами всего по двум проводам(сигнал сброса не обязателен — без него вполне можно обойтись, и в этих модулях он даже не выведен на внешний контакт):

Индикаторные модули SA40-2003-V1. Как это устроеноМикросхемы можно складывать стопкой, в смысле — соединять последовательно, при этом не занимая на контроллере дополнительные выводы, что очень полезно при использовании контроллеров типа ATtiny и прочей мелочёвки. При использовании RC-цепочки можно вообще обойтись одним выводом МК на всю индикаторную линейку.

ULN2003A — это набор сравнительно высоковольтных ключей для управления внешними нагрузками. Отдельно взятый ключ имеет следующую схему:

Индикаторные модули SA40-2003-V1. Как это устроеноДля управления индуктивными нагрузками(например, реле) её вывод 9 должен быть соединен с плюсом питания, при управлении светодиодами это не нужно, и поэтому он оставлен болтаться в воздухе.

Зачем тут вообще дополнительные ключи, если 74AC164 способна управлять светодиодами напрямую?

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

Индикаторные модули SA40-2003-V1. Как это устроеноИз-за этого в модуле пришлось использовать две линии питания: LVCC(5 вольт) для питания сдвигового регистра и HVCC(8 вольт) для питания самого индикатора. Кстати, рабочий ток одного сегмента — 15 мА(см. даташит на индикатор).

Расположение внешних контактов модуля:

Индикаторные модули SA40-2003-V1. Как это устроено

Управление 7-сегментными индикаторами через 74AC164
Пример схемы:

Индикаторные модули SA40-2003-V1. Как это устроеноПрограмма:

// Управление семисегментными индикаторами через регистр сдвига 74HC164(ОА)

#include <avr/io.h>
#include <util/delay.h>

// Массив комбинаций сегментов
unsigned char SEGMENTE[] =
{
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};

unsigned int volt;

// Функция сдвига
void write_byte(unsigned char data)
{
for(unsigned char i = 0; i < 8 ; i++)
{
if((data & 0x80) != 0) // Сравниваем 8-й бит с нулем
PORTB |= (1 << PB0); // DATA 1
else
PORTB &= ~(1 << PB0); // DATA 0

data = data << 1; // Сдвигаем биты
PORTB |= (1 << PB1); // CLK 1
PORTB &= ~(1 << PB1); // CLK 0
}
}

int main(void)
{
DDRB |= (1 << PB3)|(1 << PB1)|(1 << PB0);
PORTB = 0x00;

ACSR |= (1 << ACD); // Выключаем аналаговый компаратор
DIDR0 |= (1 << ADC1D); // Отключаем неиспользуемые цифровые входы

ADMUX |= (1 << MUX0); // Вход ADC1
ADCSRA |= (1 << ADEN) // Разрешение АЦП
|(1 << ADPS2)|(1 << ADPS1); // Предделитель на 64

while(1)
{
// Расчитаем максимальное входное напряжение на делителе
// Umax = Uin*(R1+R2)/R2
// Umax = 5*(100k+10k)/10k = 55V
// Расчитаем коэффициент делителя напряжения
// K = (R1+R2)/R2
// K = (100k + 10k)/10k = 11
// Расчитаем результат преобразования в мВ
// U = (ADC*Uref*K*100)/1024

ADCSRA |= (1 << ADSC); // Начинаем преобразование
while (ADCSRA & (1 << ADSC)){} // Ждем завершения преобразования
volt = ((unsigned long)ADC*5*11*100)/1024;

PORTB |= (1 << PB3); // Выключаем индикатор
write_byte(~SEGMENTE[volt%100/10]); // Выводим 1 разряд
write_byte(~((SEGMENTE[volt%1000/100])|0x80)); // Выводим 2 разряд
write_byte(~SEGMENTE[volt%10000/1000]); // Выводим 3 разряд
PORTB &= ~(1 << PB3); // Включаем индикатор
_delay_ms(100);
}
}

Не знаю, почему в модуле применили 74HC164 вместо 74HC595, но железка довольно забавная. Где-то валяется пачка блоков фискальной памяти от кассовых аппаратов на мелких контроллерах вроде ATMega48 — можно как раз собрать на них часы:)


СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *