Навигация
· Главная
· Архив новостей
· Лаборатория
· Личные сообщения
· Личный кабинет
· О нас
· Пользователи
· Справочник
· Статьи
· Форум
· Школа
· Энциклопедия

Универсальный драйвер динамической индикации для семисегментных светодиодных индикаторов
Автор: Поздеев Андрей



          Семисегментные светодиодные индикаторы (далее 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 В).

Вариант включения драйвера LEDS индикаторов

Рисунок 1 – Вариант включения драйвера LEDS индикаторов

Управление драйвером осуществляется по трех проводной последовательной шине данных SPI (разъем DATA).

Назначение выводов:

·       DI – линия данных;

·       SS – вход выбора кристалла, активный уровень лог. 0;

·       CLK – тактовый сигнал.

Циклограмма записи данных в драйвер приведена на рис. 2:

Циклограмма записи данных в драйвер LEDS индикаторов

Рисунок 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); // максимальная яркость

 …

}

При записи в драйвер указанной информации на индикаторе мы увидим следующее:

Символ «4» мигает

Рисунок 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ов - Мягкой поступью к вершинам знаний и мастерства Все права защищены.

Опубликовано на: 2009-03-23 (13727 Прочтено)

[ Вернуться назад ]




Web-ring: электроника, электронные компоненты и приборы
rand prev next

ChipFind: поисковая система по поставщикам радиокомпонентов Rambler\'s Top100 Рейтинг@Mail.ru


Сайт оптимизирован для отображения в браузере Mozilla Firefox версии 2 и выше с разрешением 1024*768 точек и выше.

При неполадках с отображением кнопок, обновите проигрыватель Macromedia Flash.

PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.

Открытие страницы: 0.14 секунды
The Russian localization - project Rus-PhpNuke.com