| Динамическая индикация и регулировка яркости |
|
|
| Автор ARV | ||||||||||||
| 27.01.2008 г. | ||||||||||||
|
В конструкциях на микроконтроллерах часто применяют светодиодные семисегментные индикаторы. Если их число больше 1-го, то используется динамическая индикация, чтобы сэкономить выводы контроллера. И если самому принципу программной организации динамической индикации посвящено довольно много публикаций, то вопрос изменения яркости индикаторов остается за кадром и может вызвать затруднения у начинающих. Данная статья предназначена для устранения этого пробела.
Давайте кратко рассмотрим пример динамической индикации на МК типа ATmega8. Предположим, индикатор у нас содержит 3 разряда и подключен сегментами к выводам порта D микроконтроллера, а управление общими электродами (пусть это будут общие катоды) ведется линиями порта В. Чтобы организовать динамическую индикацию задействуем второй таймер. Этот таймер восьмибитный, с режимом ШИМ. Обычно для реализации динамической индикации используется режим СТС таймера, т.е. режим, при котором частота возникновения прерываний по совпадению значений счетчика таймера и регистра OCR2 определяется содержимым OCR2 и предделителем тактовой частоты таймера. Режим СТС хорош и удобен тем, что позволяет довольно гибко регулировать частоту прерываний путем записи в OCR2 разных значений, а в обработчике прерываний не заботиться об обновлении счетчика таймера, а заниматься только основными задачами. Чтобы не было заметно мерцания индикаторов, надо настроить таймер и OCR2 так, чтобы прерывания возникали не менее, чем с частотой 3*25=75 Гц. Каждый раз по прерыванию мы должны в обработчике сначала погасить все индикаторы путем вывода единиц в нужные разряды порта В (индикаторы-то у нас с общим катодом, потому лог.1 на катоде погасит индикатор), затем выбрать из заранее подготовленного массива выводимых символов очередной, т.е. следующий символ, вывести его в порт D, а потом установить 0 на линии порта В, соответствующей так же следующему индикатору. Таким образом, 75 раз в секунду (или чаще) мы сможем обновлять поочередно информацию на индикаторах, что создаст эффект их непрерывного свечения. Но теперь давайте подумаем, как решить задачу регулирования яркости нашего индикатора? В схеме динамической индикации обязательно присутствуют токоограничительные резисторы, определяющие средний ток через сегменты индикатора. Можно изменить их значение и тем самым изменить яркость. Но если обеспечить средний ток через светодиоды так, чтобы их хорошо было видно днем, то в темноте они будут светиться слишком ярко, размазывая изображение. Если снизить средний ток, чтобы индикаторы хорошо читались в темноте, то их не будет видно на ярком свету... То есть способ регулирования резисторами не подходит. Можно еще регулировать напряжение, от которого питаются индикаторы, но для этого потребуется дополнительные транзисторы, да и в плане экономичности такой подход неинтересен. Наиболее эффективен принцип ШИМ-регулирования среднего тока, который заключается в следующем. При частоте динамической индикации в 75 Гц каждый из индикаторов мигает с частотой в 3 раза меньшей, т.е. 25 Гц. Для каждого из индикаторов фаза «свечения» длится 13,3 миллисекунды, а отсутствие свечения - 26,7 миллисекунды, т.е. каждый индикатор питается прямоугольными импульсами тока со скважностью 1/3. Очевидно, что увеличить длительность свечения индикатора мы не можем (станут заметны мерцания), но можем уменьшить ее, сохранив неизменной частоту. Иначе говоря, мы можем уменьшить скважность питающих импульсов. Можем, но как?
Да очень просто! Для этого откажемся от режима СТС таймера и заставим его работать в режиме «быстрого ШИМ» (fast-PWM), а так же добавим в нашу программу обработку прерывания по переполнению таймера. Режим fast-PWM характеризуется тем, что при равенстве OCR2 и счетчика таймера TCNT2 возникает прерывание по совпадению, но счетчик не обнуляется (как в режиме СТС), а продолжает считать до переполнения, после чего возникает соответствующее прерывание. Легко видеть, что прерывания по переполнению и по совпадению будут следовать с одинаковой частотой, (которая будет определяться только параметрами предделителя таймера!) однако время, прошедшее от переполнения до совпадения, будет определяться значением OCR2. Если теперь в обработчике прерывания по переполнению мы будем просто выводить в регистр В единички, т.е. гасить индикаторы, а обработчик прерывания по совпадению оставим прежним, мы получим то, что хотели! Смотрите: чем большее значение OCR2 мы зададим, тем меньшее время будут светиться индикаторы, максимальное время свечения будет равно периоду переполнения таймера, а минимальное - практически ноль. Поясню сказанное парой рисунков, на которых красным условно показано изменение значения счетчика таймера во времени, синим - значение OCR2, а зеленым - состояние индикатора.
![]() OCR2 содержит большое значение - малая яркость индикатора
![]() OCR2 содержит малое значение - большая яркость индикатора Как видите, просто меняя значение OCR2 мы можем в широких пределах регулировать скважность импульсов тока через индикатор, а значит - яркость его свечения. Так как регулировка все равно может вестись только в сторону уменьшения тока, органиченного сопротивлением резисторов, следует выбрать эти сопротивления по максимальной яркости, а уж необходимую яркость обеспечивать регулированием. Конкретный диапазон значений OCR2 вам придется подобрать самостоятельно, исходя из собственных предпочтений и условий. В этой статье не рассмотрены конкретные примеры программной реализации подхода, т.к. ничего принципиально сложного тут нет. Так же не затрагиваются способы изменения значения OCR2: это может быть какая-то ручная регулировка при помощи кнопок, или автоматическая при помощи фоторезистора и АЦП - оставляю все эти аспекты на усмотрение читателей. Обращаю ваше внимание на то, что хотя в статье рассмотрен второй таймер, имеющийся в микроконтроллере Atmega8, ничто не мешает использовать для этой цели любой иной контроллер с таймером, который может работать в режиме fast-PWM. Надеюсь, изложенной информации достаточно для самостоятельной реализации ШИМ-регулирования яркости при динамической индикации. Добавить в любимые (0) | Просмотров: 44508
Только зарегистрированные пользователи могут оставлять коментарии. |
||||||||||||
| « Пред. | След. » |
|---|
R785211844650
Z210696637574
E368177590409





Коментарии (8)