Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Светодиодный индикатор

Расположение сегментов светодиодного индикатора
Рис.1 Расположение сегментов светодиодного индикатора

Светодиодные индикаторы являются самым простым средством для отображения символьной информации. Их конструкция представляет собой набор светодиодов, выполненных в виде сегментов определенной формы. На рис.1 приведена наиболее распространенная схема расположения сегментов, позволяющая отображать цифры 0…9 и многие другие дополнительные символы. В нутрии корпуса все светодиоды имеют общую точку соединения. Объединенными вместе могут быть аноды (общий анод) или катоды (общий катод). Самые распространенные цвета свечения - красный и зеленый. При равном токе потребления красные светодиоды, как правило, имеет большую светоотдачу. Энергопотребление зависит от напряжения питания и технологии изготовления. Ток сегмента у современных индикаторов может быть менее 1 мА.

Подключение индикатора при динамической индикации
Рис.2 Подключение индикатора при динамической индикации

Для того чтобы высветить на индикаторе необходимый символ, потребуется задействовать у микроконтроллера 8 выводов. Одну линию можно сэкономить если отказаться от сегмента H, когда в отображения точки (запятой) нет необходимости. При большем чисел используемых индикаторов количество линий ввода-вывода существенно возрастет. Два индикатора потребуют уже 16 линий, 3 индикатора - 24 и т.д. Ясно, что для большинства приложений такое расточительное использование выводов совершенно неприемлемо. Решить эту проблему можно применив динамическую индикацию. Для этого вместо непосредственного соединения сегментов с микроконтроллером, их объединяют в общие группы, как показано на рис.2. В схеме используется индикатор TOT-3361AH-LN на 3 знакоместа c общими катодами. Порт D задействован для управления светодиодами сегментов A…H. Катоды K0…K2 напрямую подключены к линиям 0…2 порта B соответственно(для индикаторов другого типа с суммарным током ≥20 мА понадобятся дополнительные буферные элементы). В начале на индикатор выводится символ, соответствующий нулевому знакоместу. При этом на линии PB0 выставляется низкий уровень напряжения, а на PB1 и PB2 высокий (иначе символ будет отображен во всех трех позициях). Через некоторый период времени выводится следующий по очередности символ и теперь уже катод K1 соединяется с землей(на линии PB1 присутствует низкий уровень, на PB0 и PB2 – высокий). Далее информация отображается в старшей позиции индикатора (на PB2 лог.0, на PB0, PB1 лог.1), затем снова в нулевой и т.д. При частоте обновления символов ≥ 50 Гц начинает проявляться инерция человеческого зрения. Мерцание (эффект от переключения) пропадает. Изображение воспринимается непрерывно, так как будто все символы светятся постоянно. Пример подпрограммы динамической индикации приведен ниже. Она принимает два параметра: код символа и номер позиции, в которой этот символ нужно отобразить.

;   Поскольку индикатор содержит 3 знакоместа, подпрограмма 
; вывода символов должна вызываться с частотой ≥ 150 Гц (3
; знакоместа x 50 Гц = 150 Гц). Период переключения должен 
; составлять 1/150 Гц = 6667 мкс, что на частоте 1 МГц у AVR
; составит 6667 циклов тактовой частоты генератора. Постоянные 
; промежутки времени удобнее всего отмерять таймером, работающем
; в режиме сброса при совпадении (режим CTC). У ATmega8 такой   
; режим существует у 16-разрядного таймер-счетчика 1 и 8-
; разрядного таймер-счетчика 2. Для этих целей (в случае 
; использования  таймер-счетчика 1) существуют два регистра      
; пространства РВВ: OCR1AH(старший байт), OCR1AL(младший байт). 
; Когда работа схемы сравнения разрешена, то счетный регистр    
; TCNT1H:TCNT1L начинает после каждого приходящего импульса на   
; единицу увеличивать свое содержимое до тех пор, пока его      
; значение не сравняется со значением записанным в 
; OCR1AH:OCR1AL. В это момент содержимое TCNT1H:TCNT1L             
; обнуляется и в РВВ TIMSK устанавливается флаг OCF1A. Если     
; предварительно установить бит OCIE1A в TIMSK и бит I в SREG, 
; то произойдет переход на обработчик прерывания по совпадению 
; от модуля сравнения A. У таймера-счетчика 1 существует также 
; еще и второй подобный модуль сравнения B с регистрами           
; сравнения OCR1BH:OCR1BL функционирование которого подобно     
; описанному выше.

   .def data = R16 ;регистр с кодом символа
   .def pos  = R17 ;регистр с номером текущей позиции индикатора
   .def temp = R18 ;регистр для промежуточных операций
 
	   .dseg 
       .org  SRAM_START      ;ячейки в SRAM для отображения 
   buffer: .byte  3       ;на индикаторе
            
       .cseg
       .org  0
   rjmp  initial          ;старт программы 

       .org  0x0006       ;обработчика прерывания по 
   rjmp  service_T1COMPA  ;совпадению от модуля сравнения A
                        
; Период следования прерываний в режиме CTC: T=(OCR1AH:OCR1AL+1)
; /(Fclk/N),где N – коэффициент деления предделителя    
; частоты на входе таймера-счетчика 1. Режим работы задается     
; битами WGM13:WGM10 (WGM10 и WGM11 в управляющем РВВ TCCR1A,    
; WGM12 и WGM13 в TCCR1B), а значение N задается битами          
; CS12:CS10 в регистре TCCR1A. Для периода T = 6667 мкс         
; (WGM13:WGM10 = 0100 – режем CTC), N =1(CS12:CS10 = 001 –      
; предделитель отключен) и Fclk=1 МГц – содержимое OCR1AH:OCR1AL  
; = 6667.

       .org  0x0020
initial:
   ldi   temp,high(RAMEND) ;инициализация стека 
   out   SPH,temp
   ldi   temp,low(RAMEND)
   out   SPL,temp
  .
   clr   pos
   clr   temp
   ldi   temp,1    ;заполняем буфер индикации числами 1…3
   sts   buffer,temp
   ldi   temp,2 
   sts   buffer+1,temp
   ldi   temp,3
   sts   buffer+2,temp
   out   TCCR1A,temp
   ldi   temp,(1<< WGM12)|(1<< CS10)
   out   TCCR1B,temp
   ldi   temp,high(6667)
   out   OCR1AH,temp
   ldi   temp,low(6667)
   out   OCR1AL,temp	
   ldi   temp,1<< OCIE1A
   out   TIMSK,temp
   sei
  . 
service_T1COMPA:   ;обработчик прерывания по совпадению OCR1A
   in    temp,SREG ;при входе сохраняем в стеке 
   push  temp      ;регистры temp, SREG  
   clr   temp   
   ldi   YH,high(buffer) ;заносим в указатель Y адрес 
   ldi   YL,low(buffer)  ;буфера индикации buffer
   add   YL,pos    ;добавляем к Y смещение, что соответствует 
   adc   YH,temp   ;ячейке с текущей позицией pos индикатора 
   ld    data,Y    ;заносим в data кодом символа текущей позиции
   rcall din_ind   ;вызов подпрограммы индикации
   inc   pos       ;циклически изменяем номер позиции 
   cpi   pos,3     ;индикатора 0->1->2->0 и т.д. 
   brne  PC+2
   clr   pos
   pop   temp      ;при выходе восстанавливаем из стека
   out   SREG,temp ;регистры temp, SREG  
   reti

;    Подпрограмма динамической индикации 
; ZH:ZL – указатель для табличной конвертации
; R18 – регистр для промежуточных операций
; R16 – номер символа в таблицей перекодировки ind_tabl
; при входе в подпрограмму
; R17 – номер позиции при входе в подпрограмму (0…2)
; флаг T при входе в подпрограмму определяет
; наличие (T=1) или отсутствие (T=0) запятой  
din_ind:
   clr   R18       ;очищаем вспомогательный регистр при входе
   ldi   ZH,high(2*ind_tabl) ;заносим в указатель Z адрес начала
   ldi   ZL,low(2*ind_tabl)  ;таблицы перекодировки символов
   add   ZL,R16    ;добавляем к указателю Z смещение,
   adc   ZH,R18    ;соответствующее положению символа в таблице
   lpm   R16,Z ;извлекаем в R16 из таблицы символ   
   bld   R16,7 ;заносим в старший разряд R16(сегмент H) значение 
   clt         ;запятой, которое передается через флаг T
   ldi   R18,0b11111110 
   sbrc  R17,0 ;если текущий разряд 1, то заносим в R18 маску
   ldi   R18,0b11111101 ;порта B для включения катода K1
   sbrc  R17,1 ;если текущий разряд 2, то заносим в R18 маску
   ldi   R18,0b11111011 ;порта B для включения катода K2
   push  R17        ;сохраняем в стеке регистр с номером позиции
   in    R17,PORTB;считываем в буфер R17 текущее состояние порта 
   ori   R17,0b00000111 
   and   R18,R17    
   out   PORTB,R17  ;гасим все сегменты, подавая на K0…K2 лог.1
   out   PORTD,R16  ;выводим в порт D очередной символ
   out   PORTB,R18  ;соединяем с землей следующий катод 
   pop   R17 ;восстанавливаем из стека регистр с номером позиции
   ret  

 ind_tabl:     ;таблица некоторых символов при общем катоде
 ;     HGFEDCBA    HGFEDCBA   символы  номер в таблице  
 .db 0b00111111, 0b00000110 ;  0,1         0,  1
 .db 0b01011011, 0b01001111 ;  2,3         2,  3
 .db 0b01100110, 0b01101101 ;  4,5         4,  5  
 .db 0b01111101, 0b00000111 ;  6,7         6,  7
 .db 0b01111111, 0b01101111 ;  8,9         8,  9
 .db 0b01110111, 0b01111100 ;  A,b        10, 11  
 .db 0b01011110, 0b01011110 ;  C,d        12, 13
 .db 0b01111001, 0b01110001 ;  E,F        14, 15
 .db 0b01000000, 0b00000000 ;  -,space    16, 17

Линии портов ввода-вывода у AVR имеют симметричные нагрузочные характеристики. Они допускают равные по величине втекающий и вытекающий токи до 20 мА. Поэтому с ними с одинаковым успехом могут применятся индикаторы как с общим анодом так и с общим катодом. Помимо этого выводы для подключения сегментов очень часто выполняют дополнительные функции опроса кнопок. На рис.2, например, с линией сегмента A, через токоограничивающей резистор RN соединена кнопка SBN. Периодически PD0 настраивается на ввод для считывания состояния кнопки. В роле нагрузочного сопротивления, в этом случае, выступает внутренний pull-up резистор.

Сокращение числа выводов микроконтроллера
Рис.3 Сокращение числа выводов микроконтроллера
а - при помощи сдвигового регистра
б - с использованием индикаторов с разной схемой подключения светодиодов

Количество выводов можно существенно сократить, если совместно с микроконтроллером использовать вспомогательные микросхемы. На рис.3а, например, показано как в этих целях используется сдвиговой регистр 74HC164 или подобный ему. Такое подключение освобождает 6 линий ввода-вывода. В некоторых случаях может оказаться оправданным применение дешифраторов семисегментного кода и счетчиков различного типа. Кроме того существует еще одна возможность экономии, основанная на использовании z-состояния линий портов. Схема на рис.3б аналогична схеме на рис.2 за тем лишь исключением, что параллельно индикатору с общим катодом HG1 дополнительно подключен трехразрядный индикатор с общим анодом HG2. Линии PB0…PB2 одновременно выполняют коммутацию анодов A0…A2 индикатора HG2 и катодов K0…K2 HG1 соответственно. Когда информация отображается в нулевой позиции HG2(анод A0), то на линии PB0 формируется высокий уровень напряжения. На линиях порта D выставляется лог.0 в тех сегментах, которые должны быть засвечены и z-состояние в сегментах, которые необходимо погасить. Когда активно младшее знакоместо HG1(катод K0) – на линии PB0 должен присутствовать низкий уровень напряжения, а в порт D выведено логическое значение при котором уровень лог.1 на линиях соответствует засвеченным сегментам и z-состояние погашенным. В случае если символы выводится в другие позиции индикатора, отличные от A0 и K0, то PB0 должна быть переведена в высокоимпедансное состояние. Естественно, что программа вывода при такой схеме переключения будет заметно сложнее приведенной на рис. Таблица символов окажется намного больше так как во-первых для каждого из них необходимо, кроме значения PORTD, надо будет хранить еще и содержимое регистра DDRD, через который соответствующие линии должны переводится в z-состояние (настраиваться на ввод). И во-вторых символам HG1 будут соответствовать иные, инверсные значения PORTD по отношению к индикатору c общим катодом HG2.

Динамическая индикация с большим числом разрядов индикатора
Рис.4 Динамическая индикация с большим числом разрядов индикатора

Когда количество индикаторов в схеме превышает 8-9, то более рациональным может оказаться использование динамической индикации с переключением сегментов, а не разрядов, как показано на рис.4. В этом случае длительность отображения каждого сегмента никогда не будет меньше 1/8 периода обновления информации.

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
Александр #
Мое почтение!
Задача: подключить к таймеру с семисегментным индикатором светодиодное табло из 5-мм светодиодов (по 6 – 10шт. в каждом сегменте), как на рисунке.
Проблема в том, что я не знаю как это сделать, точнее, как обеспечить достаточный для свечения светодиодов ток.
Чувствую, что решение не такое уж сложное...
Если кто знает – откликнитесь.
Прикрепленный файл: Screen Shot 2017-06-26 at 4.38.26 PM.png
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Солнечная панель 10Вт 12В поликристаллическая Набор для сборки - УНЧ 2х60 Вт на TDA7294
вверх