Автор: Поздеев Андрей
Семисегментные светодиодные индикаторы (далее LEDS), несмотря на широкое распространение жидкокристаллических индикаторов (ЖКИ или LCD), находят широкое применение в различных электронных устройствах, так как имеют некоторые преимущества в отображении информации, диапазоне рабочих температур и стойкости к механическим воздействиям. Конечно, LEDS проигрывают ЖКИ в плане потребляемой мощности.
Для отображения информации на нескольких LEDS, как правило, используют динамическую индикацию. При динамической индикации выводы сегментов нескольких LEDS соединяются параллельно, управляющее устройство, управляя общим анодом/катодом, поочередно зажигает индикаторы с необходимой информацией. За счет высокой частоты «развертки» свечение индикаторов кажется непрерывным.
В относительно простых устройствах управление LEDS осуществляет основной управляющий микроконтроллер (МК), однако нередки задачи, когда необходимо «разгрузить» основной контроллер.
Существуют готовые микросхемы для реализации динамической индикации управляемые по последовательному каналу, такие как MAX7219, MAX7221 и т.д. подробнее о LEDS-драйверах фирмы MAXIM можно почитать здесь. Однако указанные драйверы относительно дороги (10$-11$) и не всегда удовлетворяют предъявляемым требованиям.
Предлагаемый автором драйвер реализован на МК ATtiny2313 и позволяет управлять до 6-ти LEDS. Применение flash-микроконтроллера позволило создать универсальный драйвер, который легко адаптировать под имеющийся LEDS и схему включения умощняющих транзисторов. Кроме того предлагаемый драйвер позволяет регулировать яркость свечения LEDS методом ШИМ, учитывая тот факт, что зависимость между среднеквадратичным током через сегмент и яркостью свечения сегмента нелинейная - это позволяет снизить потребляемый устройством ток без существенной потери яркости свечения сегмента. Подробно использованный метод ШИМ описан здесь. Программно предусмотрена возможность параллельного включения двух микросхем с единым адресным пространством. Число управляемых LEDS индикаторов при этом увеличивается вдвое.
Вариант включения драйвера приведен на рис. 1. При расчете токоограничивающих резисторов необходимо учитывать, что время свечения сегментов составляет 1/6 периода развертки (период развертки – величина обратная частоте развертки значение см. ниже).
Обращаю внимание, что умощняющие транзисторы на рис. 1 включены в схеме с общим коллектором. Таким образом, максимальное напряжение на эмиттере определяется напряжением лог. 1 за вычетом напряжения насыщения база-эмиттер (типичное значение 0,5–0,7 В).
Рисунок 1 – Вариант включения драйвера LEDS индикаторов
Управление драйвером осуществляется по трех проводной последовательной шине данных SPI (разъем DATA).
Назначение выводов:
· DI – линия данных;
· SS – вход выбора кристалла, активный уровень лог. 0;
· CLK – тактовый сигнал.
Циклограмма записи данных в драйвер приведена на рис. 2:
Рисунок 2 – Циклограмма записи данных в драйвер LEDS индикаторов
Значения таймингов рис.2 равны:
· Th – от 25мкс до 150мс;
· Tl – от 25мкс до 150мс;
· Tss – от 10мкс до 150мс.
Примечание – максимальное время ограниченно программно для исключения ошибок в случае «зависания» управляющего контроллера или КЗ(обрыва) на линии.
Опрос линии DI происходит по перепаду с лог. 1 до лог. 0 по тактовой линии CLK. Данные передаются, начиная с младшего бита. Длина посылки 2 байта (16 битов). Байты передаются, начиная с младшего.
Старший (второй) байт данных является квалификатором данных, младший (первый) байт значение предаваемых данных.
Типы квалификаторов (ID_DATA) и их характеристики приведены в таблице 1:
Таблица 1
ID_DATA
|
Описание
|
0xA0...0xAB
|
Данные для отображения 0...5 знакоместа (цифры от «0» до «9»), DIGIT_ADDR = 0xA0
|
Данные для отображения 0...5 знакоместа (цифры от «0» до «9»), DIGIT_ADDR = 0xA5
|
0xB0
|
Данные для записи регистра stDotOnOff, DIGIT_ADDR = 0xA0
|
0xB1
|
Данные для записи регистра stDotOnOff, DIGIT_ADDR = 0xA5
|
0xB2
|
Данные для записи регистра stDotBrig, DIGIT_ADDR = 0xA0
|
0xB3
|
Данные для записи регистра stDotBrig, DIGIT_ADDR = 0xA5
|
0xB4
|
Данные для записи регистра stDigitOnOff, DIGIT_ADDR = 0xA0
|
0xB5
|
Данные для записи регистра stDigitOnOff, DIGIT_ADDR = 0xA5
|
0xB6
|
Данные для записи регистра stDigitBrig, DIGIT_ADDR = 0xA0
|
0xB7
|
Данные для записи регистра stDigitBrig, DIGIT_ADDR = 0xA5
|
0xB8
|
Данные яркости сегментов OCR0A, DIGIT_ADDR = 0xA0
|
0xB9
|
Данные яркости сегментов OCR0A, DIGIT_ADDR = 0xA5
|
0xC0...0xCF
|
Данные для записи переменной cSegData[0..15],
DIGIT_ADDR = 0xA0
|
0xB0...0xBF
|
Данные для записи переменной cSegData[0..15],
DIGIT_ADDR = 0xA5
|
Выше уже упоминалось о том, что драйвер поддерживает работу в параллельном режиме. Данная функция реализована за счет того, что квалификатор ID_DATA данных условно «первого» и условно «второго» драйвера различны. Для того чтобы скомпилировать прошивку для «первого» драйвера необходимо присвоить переменной/макросу DIGIT_ADDR значение 0xA0 (см. файл LEDS_DRIVER.h).
Описание переменных и регистров (см. таблицу 1):
· stDotOnOff – статус отображения точки: 1 – точка отображается, 0 – точка не отображается.
· stDotBrig – статус мерцания точки: 1 – точка мерцает, при условии, что она отображается (соответствующий бит регистра stDotOnOff установлен) , 0 – точка не мерцает.
· stDigitOnOff – статус отображения знакоместа: 1 – знакоместо отображается, 0 – знакоместо не отображается.
· stDigitBrig – статус мерцания знакоместа: 1 – знакоместо мерцает, при условии, что оно отображается (соответствующий бит регистра stDigitOnOff установлен) , 0 – знакоместо не мерцает.
Примечание – 0-й бит отвечает за 0-е знакоместо, 5-й бит отвечает за 5-е знакоместо.
· OCR0A – переменная отвечает за яркость свечения сегментов индикатора. Минимальное значение 5, максимальное значение 250.
· cSegData[] – массив определяет соответствие отображаемых сегментов данным полученным с квалификатором ID_DATA. Длина массива 16 ячеек, первые 10 элементов массива отвечают за отображение цифр от «0» до «9», но также доступны для записи. При записи элементов массива следует руководствоваться соответствием битов элементов и выводов МК (см. файл LEDS_DRIVER.h) пример заполнения элементов массива имеется в файле LEDS_DRIVER.c при объявлении массива. Массив находится в оперативной памяти и после отключении питания восстанавливаются исходные значения массива.
В файле LEDS_DRIVER.h определены следующие переменные/макросы
· DIGIT_INV – Выбор активных уровней шины DIGIT 1 - активный уровень лог. 0, 0 - активный уровень лог. 1;
· DATA_INV – Выбор активных уровней шины DATA 1 - активный уровень лог. 0, 0 - активный уровень лог. 1.
Так для приведенной схемы (рис. 1) значения будут следующие:
#define DIGIT_INV 0
#define DATA_INV 1
Примеры:
// вариант функции записи байтов в драйвер
void LEDS_Write_Byte(unsigned int data)
{
char n;
SPI_CLK_PORT |= (1 << SPI_CLK);
SPI_SS_PORT &=~ (1 << SPI_SS);
_delay_us(10);
for(n = 0;n < 16;n++)
{
if(data & (1 << n)) {SPI_DI_PORT |= (1 << SPI_DI);}
else {SPI_DI_PORT &=~ (1 << SPI_DI);}
_delay_us(25);
SPI_CLK_PORT &=~ (1 << SPI_CLK);
_delay_us(25);
SPI_CLK_PORT |= (1 << SPI_CLK);
}
SPI_SS_PORT |= (1 << SPI_SS);
}
Пример 1, отображение чисел 17.4 и 2.69, цифра 4 мигает, условно первый драйвер:
…
int main(void)
{
…
LEDS_Write_Byte(0xA001); // запись «1» в 0-е знакоместо
LEDS_Write_Byte(0xA107); // запись «7» во 1-е знакоместо
LEDS_Write_Byte(0xA204); // запись «4» в 2-е знакоместо
LEDS_Write_Byte(0xA302); // запись «2» в 3-е знакоместо
LEDS_Write_Byte(0xA406); // запись «6» в 4-е знакоместо
LEDS_Write_Byte(0xA509); // запись «9» в 5-е знакоместо
LEDS_Write_Byte(0xB00A); // отображение точек
LEDS_Write_Byte(0xB43F); // отображение знакомест
LEDS_Write_Byte(0xB604); // мерцание 2-го знакоместа
LEDS_Write_Byte(0xB8FA); // максимальная яркость
…
}
При записи в драйвер указанной информации на индикаторе мы увидим следующее:
Рисунок 3 – Символ «4» мигает
Пример 2, отображение температуры 27 и 65 градусов, пример записи пользовательского символа C, условно первый драйвер:
…
#define LEDS_PORT PORTB
#define LEDS_A 2
#define LEDS_B 7
#define LEDS_C 5
#define LEDS_D 1
#define LEDS_E 0
#define LEDS_F 4
#define LEDS_G 6
#define LEDS_DP 3
…
int main(void)
{
…
// Запись знака градуса («С»)
LEDS_Write_Byte(0xCA00 + (1 << LEDS_A) + (1 << LEDS_D) + (1 << LEDS_E) + (1 << LEDS_F));
LEDS_Write_Byte(0xA002); // запись «2» в 0-е знакоместо
LEDS_Write_Byte(0xA107); // запись «7» во 1-е знакоместо
LEDS_Write_Byte(0xA20A); // запись «C» в 2-е знакоместо
LEDS_Write_Byte(0xA306); // запись «6» в 3-е знакоместо
LEDS_Write_Byte(0xA405); // запись «5» в 4-е знакоместо
LEDS_Write_Byte(0xA50A); // запись «C» в 5-е знакоместо
LEDS_Write_Byte(0xB43F); // отображение знакомест
LEDS_Write_Byte(0xB8FA); // максимальная яркость
}
При записи в драйвер указанной информации на индикаторе отображается информация в соответствии с рисунком 4:
Рисунок 4
Пример 3, условия отображения аналогичные примеру 1, условно второй драйвер:
…
int main(void)
{
…
LEDS_Write_Byte(0xA601); // запись «1» в 0-е знакоместо
LEDS_Write_Byte(0xA707); // запись «7» во 1-е знакоместо
LEDS_Write_Byte(0xA804); // запись «4» в 2-е знакоместо
LEDS_Write_Byte(0xA902); // запись «2» в 3-е знакоместо
LEDS_Write_Byte(0xAA06); // запись «6» в 4-е знакоместо
LEDS_Write_Byte(0xAB09); // запись «9» в 5-е знакоместо
LEDS_Write_Byte(0xB10A); // отображение точек
LEDS_Write_Byte(0xB53F); // отображение знакомест
LEDS_Write_Byte(0xB704); // мерцание 2-го знакоместа
LEDS_Write_Byte(0xB9FA); // максимальная яркость
…
}
Возможные варианты прошивок приведены в таблице 2:
Таблица 2
DIGIT_INV
|
DATA_INV
|
DIGIT_ADDR
|
Прошивка
|
0
|
0
|
0xA0
|
Digit0Data0AddrA0.hex
|
0
|
1
|
0xA0
|
Digit0Data1AddrA0.hex
|
1
|
0
|
0xA0
|
Digit1Data0AddrA0.hex
|
1
|
1
|
0xA0
|
Digit1Data1AddrA0.hex
|
0
|
0
|
0xA5
|
Digit0Data0AddrA5.hex
|
0
|
1
|
0xA5
|
Digit0Data1AddrA5.hex
|
1
|
0
|
0xA5
|
Digit1Data0AddrA5.hex
|
1
|
1
|
0xA5
|
Digit1Data1AddrA5.hex
|
Технические характеристики драйвера:
· Частота «развертки», Гц – 651
· Напряжение лог. 1, не менее, В – 4,2*
· Напряжение лог. 0, не более, В – 0,7*
· Ток нагрузки лог. 1, не более, мА – 2
· Ток нагрузки лог. 0, не более, мА – 20
* Характеристики при напряжении питания 5В, подробнее см. даташит на МК ATtiny2313.
Рисунок 5 – Вид драйвера со стороны печатных проводников
Приложения:
1. Вариант реализованной схемы подключения и печатной платы в формате PCAD2002;
2. Проект в AVRStudio v.4.14 + WinAVR20080407;
3. Прошивки к таблице 2.
Обсуждение статьи на форуме
Copyright © Лаборатория Ирбиcов - Мягкой поступью к вершинам знаний и мастерства Все права защищены.