Управление светодиодами на микроконтроллере

Управление светодиодами на микроконтроллере

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five http://jquery2dotnet.com/ centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

Первым примером в изучении микроконтроллеров является подключение и управление светодиодом, это самый простой и наглядный пример. Этот пример стал классическим при изучении микроконтроллеров, как программа «Hello World!» при изучении прочих языков программирования.

Светодиоды могут использоваться для индикации в различных электронных устройствах. Отображать режимы работы устройства, выводить сообщения об ошибках, информацию о наличии или отсутствии управляющего сигнала и т.д.

Из документации на микроконтроллер мы знаем, что у микроконтроллеров AVR максимальный ток, который способна пропустить каждая линия порта ввода/вывода составляет 40 mA. Превышение этого значения выведет из строя вывода порта. Поэтому ток, протекающий через вывод микроконтроллера не должен превышать 30 mA , самым оптимальным будет ток 20 mA.

Подключить светодиод к микроконтроллеру можно двумя способами

1. Подключение маломощного светодиода

Если ток потребления светодиода в рабочем режиме не превышает 30 мА, а номинальное напряжение не превышает напряжения питания микроконтроллера, то мы можем подключать его к линии порта ввода/вывода.

Что бы ограничить ток, протекающий через ножку микроконтроллера нужно рассчитать номинал резистора R1.

Сопротивление рассчитывается по формуле:

где Vs — напряжение источника питания, Vd — прямое напряжение светодиода, а I — номинальный ток светодиода.

Таким образом, мы нашли R1 = 150 Om и дальше подбирается ближайшее большее значение сопротивления.

Если не известно прямое напряжение светодиода, сопротивление можно рассчитать по закону Ома.

где U — напряжение источника питания, а I — номинальный ток светодиода.

Определив номинал резистора R1, необходимо рассчитать мощность P, измеряемая в ваттах, которая будет выделяться в резисторе, в виде тепла при протекании тока в цепи.

где U – напряжение, приложенное к участку цепи, а I — номинальный ток светодиода

Рассчитав выделяемую мощность на резисторе, выбираем ближайшее большее значение мощности резистора. Если рассеиваемой мощности резистора будет недостаточной, то он может выйти из строя.

Если светодиод используется для индикации потребляемый ток можно ограничить до 10 mA. Очень заметных изменений в свечении светодиода мы не заметим, а время работы источника питания увеличим, если это батарейки или аккумулятор.

2. Подключение мощного светодиода

Если значение номинального тока светодиода превышает предельное значению тока линии вывода, либо напряжение питания светодиода больше чем значение питания микроконтроллера, тогда для подключения светодиода необходимо использовать буферный элемент – транзистор в режиме ключа.

Таким образом, мы ушли от токовых ограничений вывода линии порта микроконтроллера. Резистор на базе – ограничительный. Может варьироваться в широких пределах 1-10 kOm, в любом случае транзистор будет работать в режиме насыщения. Использовать можно любой N-P-N транзистор. Коэффициент усиления, практически не имеет значения. Выбирается транзистор по току коллектора (нужный нам ток) и напряжению коллектор — эмиттер (напряжение которым запитывается нагрузка). Необходимо учитывать, что значение максимально допустимого тока коллектора транзистора должно быть больше чем значение номинального тока светодиода, а так же не забывать про рассеиваемую мощность транзистора.

Определившись со схемой подключения светодиода к микроконтроллеру ATmega8 нам нужно на чем-то эту схему собрать.

1. Собрать нашу схему в симуляторе Proteus. Этот способ хорош тем, что можно быстро собрать схему, не нужно тратить деньги на приобретение радиокомпонентов.

2. Собрать схему на макетной плате и прошить микроконтроллер программатором. Придется потратить деньги, но мы получим опыт подкрепленный практикой.

Собрав схему можно преступить к написанию программы в CodeVisionAVR
Исходный код:

Описание программы:

Директивой #include подключаем внешние файлы. Заголовочный файл используемого микроконтроллера mega8.h и функцию задержки delay.h . Перед компиляцией CodeWisioneAVR вставит вместо строки

текст, содержащийся в файлах.

определяем идентификатор led. Перед компиляцией CodeWisioneAVR в тексте программы заменит led на значение 30.

Объявляем основную функцию программы main строчкой

Эта функция должна присутствовать в каждой программе и только одна. Она нечего не передает и не возвращает. В каком бы месте эта функция не находилась программа начнет выполняться именно с нее.

В выходной регистр порта C записываем ноли,

соответственно на всех ножках порта C будет напряжение 0 В.

В регистр направления данных порта C записываем единицы,

порт будет работать как выход.

Организовываем бесконечный цикл оператором while. Оно будет выполняться до тех пор, пока значение в скобках истинно, т.е. не равно нулю.

В теле цикла записываем команды, которые будут устанавливать интервалы включения и выключения светодиода.

Нам нужно переключить только одну ножку порта C, для этого мы воспользовались побитным доступом к портам ввода/вывода микроконтроллера. Указав в регистр порта С бит в который мы запишем значение

мы включаем или отключаем наш светодиод.

Для организации интервалов между включением и выключением светодиодов мы используем функцию задержки,

которую подключили в начале программы файлом delay.h. Задержка генерируется в миллисекундах. Все идентификаторы led в программе будут заменены при компиляции на указанное значение 30, т.е. задержки между интервалами включения и выключения будут по 30 миллисекунд.

Написав код программы, компилируем его и записываем в микроконтроллер или загружаем в симулятор Proteus.

Регулятор силы свечения светодиода на микроконтроллере AVR ATmega32

В этом проекте мы будем управлять яркостью свечения одноваттного светодиода с помощью микроконтроллера ATmega32 (семейство AVR). Мы будем делать это, используя ШИМ (широтно-импульсную модуляцию).

Общий принцип управления яркостью свечения

Управляя скоростью модуляции ШИМ (Pulse Width Modulation, PWM) можно регулировать силу свечения светодиода – данный принцип пояснен на следующем рисунке.

Если на представленном рисунке выключатель будет замкнут на протяжении некоторого времени, то на протяжении этого же времени лампочка будет гореть. Если переключатель будет замкнут в течение 8ms и будет разомкнут 2ms в течение интервала 10ms, тогда лампочка будет гореть только в течение интервала 8ms. В рассмотренном примере можно сказать, что среднее выходное напряжение (на лампочке) будет составлять 80% от напряжения батареи.

В другом случае выключатель замыкается на 5ms и размыкается на эти же самые 5ms в течение интервала 10ms, таким образом среднее напряжение на лампочке будет составлять 50% от напряжения батареи. Принято говорить, что если напряжение батареи 5В и цикл занятости составляет 50%, то среднее напряжение на оконечном устройстве (лампочке) будет составлять 2.5В.

В третьем рассмотренном на рисунке случае цикл занятости составляет 20% и поэтому среднее напряжение на оконечном устройстве (лампочке) будет составлять 20% от напряжения батареи.

В микроконтроллере ATmega32 мы имеем четыре ШИМ канала (PWM channels), которые обозначаются как OC0, OC1A, OC1B и OC2. В нашей схеме мы будем использовать канал OC0 для изменения яркости свечения светодиода.

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega32 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. Конденсатор 100 мкФ (подключенный по питанию) (купить на AliExpress).
  4. Светодиод на 1 Ватт (купить на AliExpress).
  5. Транзистор TIP127 (купить на AliExpress).
  6. Кнопки (2 шт.).
  7. Конденсатор на 100 нФ (2 шт.) (купить на AliExpress).
  8. Резистор 100 Ом (купить на AliExpress).
  9. Резистор 1 кОм (2 шт.) (купить на AliExpress).
  10. Источник питания с напряжением 5 Вольт.

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Принцип работы схемы

Рассматриваемая схема устройства регулирования силы свечения светодиода на микроконтроллере AVR ATmega32 приведена на следующем рисунке.

В микроконтроллере ATmega32 четыре ШИМ (PWM) канала используются на четырех контактах. Мы можем использовать только выход ШИМ на этих контактах. Поскольку мы решили использовать PWM0 (8-битный канал) мы должны использовать ШИМ сигнал с контакта OC0 (PORTB 3-й контакт). Как можно видеть из схемы, мы соединяем базу транзистора к контакту OC0 микроконтроллера чтобы управлять мощным светодиодом.

Параллельно кнопкам увеличения/уменьшения яркости свечения подсоединены конденсаторы для предотвращения биений (нежелательных колебаний, шумов). Всегда, когда нажата кнопка, на контакте, к которому она подсоединена, присутствует определенный шум. Этот шум стабилизируется в течение нескольких миллисекунд. Но для микроконтроллера пики этого шума (до того как он стабилизируется) действуют как триггеры. Этот эффект можно исключить как программным, так и аппаратным способом, программным – проще. Но мы в данной схеме используем аппаратный способ путем добавления конденсаторов, которые сводят к нулю эффект биения от кнопок.

В микроконтроллерах ATmega есть два способа генерации ШИМ:

  1. Фазовая (правильная) ШИМ.
  2. Быстрая ШИМ.

Мы будем использовать более простой способ – быстрый метод формирования ШИМ.

Сначала необходимо выбрать частоту ШИМ, которая будет зависеть от используемого приложения (применения). Для светодиода эта частота должна быть не менее 50 Гц. Мы выберем частоту счетчика времени 1 МГц. Теперь чтобы получить быструю ШИМ 50 Гц на микроконтроллере ATmega, мы должны задействовать соответствующие биты в регистре TCCR0 – это единственный регистр, который нам будет нужен для получения 8 битной быстрой ШИМ.

Читайте также  Расчет площади радиатора для светодиода

На представленном рисунке:

1. CS00, CS01, CS02 (выделены желтым цветом) – выбирают prescalar (предварительное масштабирование) для выбора частоты временного интервала. Таблица для соответствующих prescalar показана на рисунке ниже. Таким образом, для предварительного масштабирования, равного 1, oscillator clock=counter clock (шкала осциллятора равна шкале счетчика). То есть установим CS00=1, остальным двум битам установим нулевые значения.

2. Биты WGM01 и WGM00 изменяют чтобы выбрать нужный режим генерации формы сигнала. Исходя из необходимых нам параметров (быстрая ШИМ – Fast PWM) по таблице, представленной на следующем рисунке, выбираем WGM00=1 и WGM01=1.

3. Теперь мы знаем, что ШИМ – это сигнал с различными интервалами ON и OFF сигнала (различными продолжительностями включения). Для получения различных продолжительностей включения (отношение длительности импульса к периоду повторения) нам необходимо выбрать значение между 0 и 255 (от 0 до 2^8 поскольку мы используем 8 битную ШИМ). Допустим мы выбрали значение 180, это значит что счетчик начинает счет от 0 и когда он достигает значения 180, то отклик на выходе может быть приведен в действие (запустится триггер). Этот триггер может быть инвертирующим и неинвертирующим. То есть выход можно сконфигурировать так, чтобы по достижении счетчиком заданного значения он либо опускал фронт импульса, либо поднимал его. Этот выбор производится с помощью установки битов CM00 и CM01 (выделены зеленым цветом на рисунке выше).

Как показано в следующей таблице, с помощью установки этих битов можно выбрать режим как с инвертированием, так и без инвертирования. Мы выберем режим с инвертированием, таким образом установим эти биты в COM00=1 и COM01=1.

За установку того самого значения, которое задает различные продолжительности включения (отношение длительности импульса к периоду повторения), в микроконтроллере ATmega32 отвечает байт OCR0 (Output Compare Register 0) – в нем сохраняется нужное нам значение от 0 до 255. Пример выбранного нами режима инвертирования показан на рисунке ниже. Таким образом, если мы запишем в OCR0=180, то контроллер будет изменять уровень сигнала на выходе когда счетчик досчитает до 180 (начиная с 0).

Если необходимо будет изменить яркость свечения светодиода, то тогда в байт OCR0 следует записать другое число (вместо 180). В представленной схеме присутствуют 2 кнопки. Одна кнопка служит для увеличения числа в байте OCR0 (увеличение яркости свечения), а другая – для уменьшения числа в байте OCR0 (уменьшение яркости свечения).

Исходный код программы на языке C (Си)

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке C (Си).

Управление светодиодами tinyAVR

Управление светодиодами заключается в их включении и выключении с помощью специальной схемы. Единственный способ включить и выключить светодиод в схеме на рис. 2.4 — подать и отключить напряжение питания. Однако светодиоды можно включать/выключать при помощи микроконтроллера и получать интересные световые узоры. На рис. 2.8 показана принципиальная схема, состоящая из микроконтроллера Tinyl3 и пяти светодиодов.

Все светодиоды подключены к контактам микроконтроллера через резисторы. Два светодиода (LED1 и LED2) подключены по схеме с общим анодом к источнику питания, а остальные три (LED1, LED2 и LED3)— по схеме с общим катодом к общей шине. Эти два разных способа использованы только для примера. Для микросхем 74-й серии TTL-вентилей (например, 7400 или 74LS00) предпочтительнее подключение внешней нагрузки к источнику питания, чем к общей шине. Однако для современных микросхем КМОП (таких, как микроконтроллеры AVR) способ подключения светодиодов не имеет значения.

В схеме на рис. 2.8 светодиоды LED1 и LED2 загорятся, когда на соответствующем выходе контроллера будет логический нуль, а остальные светодиоды — когда на соответствующих выходах появится логическая единица. Величина сопротивления резистора зависит от требуемого тока через светодиод, который не должен превышать выходной ток микроконтроллера. Максимальный выходной ток микроконтроллеров AVR — 40 мА. Напряжение источника питания должно быть больше порогового напряжения включения светодиодов. Например, двух щелочных батареек (3 В) будет достаточно для включения красных светодиодов. Однако синие светодиоды работать не будут. Для их работы напряжение питания должно быть равно 5 В.

Микроконтроллер может переключать светодиоды с любой частотой. Однако если частота коммутации превышает 20 Гц, то светодиоды будут неприятно мерцать. При увеличении частоты, например»до 100 Гц, мерцание исчезнет и светодиоды будут казаться постоянно включенными. На самом деле светодиоды будут включаться и выключаться с частотой 100 Гц, однако человеческий глаз не может реагировать на столь быстрое переключение. Это интересное явление (оно называется модуляцией интенсивности свечения) мы будем использовать для изменения интенсивности свечения светодиодов.

Рис. 2.9. Сигнал с широтно-импульсной модуляцией

На рис. 2.9 показан сигнал с широтно-импульсной модуляцией (ШИМ, PWM), имеющий частоту F=UT (показана на верхнем графике). Предположим, что частота F равна 100 Гц. При постоянной частоте сигнала меняем время нахождения сигнала в состоянии логической единицы. Пусть это время равно ΤΊ. Отношение периода Т к времени 71 называется скважностью сигнала. Сигналы, показанные на рис. 2.9, можно без труда сгенерировать при помощи микроконтроллерной схемы, приведенной на рис. 2.8. Если сигнал, обозначенный как 50%, подать на светодиод LED3 через контакт РВ2 данной схемы, то наблюдатель увидит интенсивность свечения 50% от той, которая будет получена в случае подачи на контакт РВ2 постоянной логической единицы (при котором яркость максимальна). Так происходит потому, что теперь средний ток через светодиод составляет 50% от максимального.

Если же на светодиод LED3 подать сигнал, помеченный как 75%, то интенсивность составит 75% от максимальной. Можно задать любое значение сигнала от 0% (минимальная интенсивность) до 100% (максимальная интенсивность). Сигнал с широтно-импульсной модуляцией можно сгенерировать либо программно, либо аппаратно (при помощи встроенных в микроконтроллер AVR таймеров). Использование аппаратных таймеров позволяет микроконтроллеру выполнять другие дополнительные задачи. Эти способы управления светодиодами будут встречаться во многих последующих проектах. Особенно удобно с помощью ШИМ управлять многоцветными светодиодами, создавая большое количество промежуточных цветов и оттенков.

Помимо управления интенсивностью свечения следует также обсудить способы соединения светодиодов. До настоящего момента мы рассматривали подключение только одного светодиода к одному контакту микроконтроллера. Кроме этого, светодиоды можно соединять последовательно или параллельно. Возможно последовательное соединение светодиодов с одним резистором (рис. 2.10).

Число светодиодов, последовательно подключаемых к выводу микроконтроллера, будет определяться напряжением включения светодиодов и напряжением питания. При напряжении питания, равном 5 В, можно последовательно подключить два красных светодиода. Но два синих светодиода подключить так не удастся, поскольку напряжение включения цепочки из двух синих светодиодов будет выше, чем напряжение питания +5 В. По той же причине не удастся последовательно подключить и три красных светодиода.

Рис. 2.10. Последовательное соединение светодиодов

Если нужно подключить три светодиода, то лучше их соединить параллельно, как показано на рис. 2.11.

Рис. 2.11. Подключение параллельно соединенных светодиодов к контроллеру

Рис. 2.12. Вариант подключения последовательно соединенных светодиодов через транзистор

Обратите внимание, что вместо одного резистора и параллельного подключения светодиодов мы выбрали вариант подключения по одному резистору на каждый светодиод и последующее параллельное соединение этих· цепей. Так сделано потому, что светодиоды из одной партии могут иметь различные напряжения включения; и если при этом соединить параллельно несколько светодиодов, то светодиод с самым низким напряжением включения будет доминировать над остальными (потреблять больший ток и светиться ярче остальных). В худшем случае весь ток пойдет через один светодиод, а остальные вовсе не загорятся. При параллельном подключении нескольких светодиодов суммарный ток через все светодиоды должен быть меньше, чем максимальный ток выхода микроконтроллера. Если же ток через светодиоды превышает возможности микроконтроллера, то можно применить схему, показанную на рис. 2.12, где η-р-и-транзистор управляет несколькими последовательно соединенными светодиодами.

Напряжение V(Drive), подаваемое на светодиоды, должно быть больше суммы напряжений включения всех последовательно включенных светодиодов. Резистор R1 определяет ток через светодиоды. Резистор Rb в цепи базы п-р-и-транзистора служит для ограничения тока базы; сопротивление Rb вычисляется по току коллектора (который течет и через светодиоды) и по коэффициенту усиления транзистора. Вот пример: предположим, что вы хотите соединить последовательно пять красных светодиодов и подать на них ток 30 мА. Из табл. 2.1 видно, что напряжение включения красного светодиода равно 2 В, следовательно, потребуется источник 10 В. Падение на выводах коллектора и эмиттера транзистора составит 0,5 В. Желательно получить напряжение V(Drive) в 15 В, поэтому сопротивление R1 = (15 – 10,5) В/30 мА = 150 Ом. Для данного случая подойдет транзистор малой мощности типа ВС547. Обычно значение β для ВС547 составляет 100, поэтому требуемый ток базы 30 мА/100 = 300 мкА. Если микроконтроллер питается напряжением +5 В, то за логическую единицу можно принять напряжение в 4,5 В. Падение напряжения V(be) на переходе «база-эмиттер» примерно равно 0,7 В. Таким образом, Rb = (4,5 – 0,7) В/300 мкА = 12,6 кОм. Следовательно, в качестве Rb вполне подойдет сопротивление 10 кОм. Для схемы, приведенной на рис. 2.13, необходимо, чтобы все последовательно соединенные светодиоды были одного цвета. При расчете нужно учесть суммарное падение напряжения на всех этих светодиодах, чтобы определить напряжение V(Drive) и значения R1 и Rb.

Читайте также  Монтаж тросовых проводок

На рис. 2.13 показано, как можно соединить несколько светодиодов параллельно и подключить к контроллеру через п-р-и-транзистор. Такая схема нужна, когда суммарный ток через светодиоды превышает выходной ток микроконтроллера. Предположим, что вы хотите управлять десятью параллельными светодиодами (каждый с током в 20 мА). Потребуется ток в 200 мА, что гораздо больше, чем может дать один вывод микроконтроллера. Однако для управления этими светодиодами будет вполне достаточно п-р-и-транзистора средней мощности с максимальным током коллектора 1 А. Расчет сопротивления резистора для каждого из светодиодов (а также сопротивления Rb) аналогичен рассмотренному ранее.

Рис. 2.13. Вариант подключения параллельно соединенных светодиодов через транзистор

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

Занятие №1. Простейшая программа

Автор: AntonChip. Дата публикации: 18 декабря 2010 .

Задача: Разработаем программу управления одним светодиодом. При нажатии на кнопку светодиод горит, при отпускании гаснет.

Для начала разработаем принципиальную схему устройства. Для подключения к микроконтроллеру любых внешних устройств используются порты ввода-вывода. Каждый из портов способен работать как на вход так и на выход. Подключим светодиод к одному из портов, а кнопку к другому. Для этого опыта мы будем использовать контроллер Atmega8. Эта микросхема содержит 3 порта ввода-вывода, имеет 2 восьмиразрядных и 1 шестнадцатиразрядный таймер/счетчик. Также на борту имеется 3-х канальный ШИМ, 6-ти канальный 10-ти битный аналого-цифровой преобразователь и многое другое. По моему мнению микроконтроллер прекрасно подходит для изучения основ программирования.

Для подключения светодиода мы будем использовать линию PB0, а для считывания информации с кнопки воспользуемся линией PD0. Схема приведена на рис.1.

Занятие №2. Переключение светодиода

Автор: AntonChip. Дата публикации: 19 декабря 2010 .

Задача: Разработаем устройство управления светодиодом при помощи одной кнопки. При каждом нажатии на кнопку выход порта к которому подключен светодиод должен менять свое состояние на противоположное. Эта задача легко решается при помощи D-триггера, но все же рассмотрим как ее можно решить при помощи микроконтроллера.

Схема устройства такая же как в занятии 1. Алгоритм программы прост. Сначала настраиваем порты ввода-вывода. Проверяем состояние младшего разряда порта D(PD0) к которому подключена кнопка, а затем выполняем операцию сравнения, где PD0 проверяется на равенстве единице. Если условие выполняется программа переходит к началу цикла, если нет то выполняется еще одна операция сравнения, но уже линии PB0. Сначала оператор сравнения проверяет PB0 на равенство нулю, если результат истина(PB0=0), то разряд сбрасывается в единицу (PB0=1). Если ложно, устанавливается в ноль (PB0=0). Далее в программу вносим процедуру ожидания, без нее наш светодиод будет так часто мигать, что наш глаз не заметит этого. Основной цикл программы будет приостанавливается как только произойдет переключение светодиода и будет возобновляться как только будет отпущена кнопка.

Занятие №3. Мигание светодиодом

Автор: AntonChip. Дата публикации: 21 декабря 2010 .

Задача: Разработаем устройство управления светодиодом. Кнопка будет включать и выключать мигание светодиода. Пока кнопка нажата светодиод мигает с частотой 2,5 Hz, если кнопка отпущена светодиод не горит.

Алгоритм программы:

— Производим чтение порта D;
— Проверяем PD0, если он равен нулю включаем алгоритм мигания;
— Если PD0 равен единице выключаем алгоритм мигания и тушим светодиод;
— Переходим к началу основного цикла(первый пункт);
— Пишем алгоритм мигания светодиодом (зажигаем светодиод, пауза, гасим светодиод, пауза);
— Переходим к началу алгоритма(первый пункт).

Занятие №4. Бегущие огни

Автор: AntonChip. Дата публикации: 22 декабря 2010 .

Задача: разработаем устройство которое должно обеспечивать движение огня в двух разных направлениях. Переключение направления движения будет осуществляться с помощью переключателя S1. В соответствие с поставленной задачей наше устройство должно управлять восемью светодиодами HL1-HL8. Подключим восемь светодиодов к порту D микроконтроллера через токоограничительные резисторы по 220 Ом. Переключатель подключим к младшему разряду порта C.

Занятие №5. Бегущие огни с использованием таймера

Автор: AntonChip. Дата публикации: 22 декабря 2010 .

Доработаем программу «Бегущие огни», изменив процедуру формирования задержки. Чтобы не загружать процессор новая процедура задержки должна использовать один из внутренних таймеров/счетчиков и не использовать прерывания.

В микроконтроллере Atmega8 имеются 3 таймера: 2 восьмиразрядных и 1 шестнадцатиразрядный. Для формирования временных интервалов таймер просто подсчитывает тактовые импульсы от системного генератора.

В нашем случае частота равна 4 MHz, а период импульсов 1/4MHz=0,25мкс. Для того чтобы получить на выходе 200мс, необходимо иметь коэффициент деления равный 200мс/0,25мкс= 800000. Восьмиразрядный таймер имеет максимальный коэффициент пересчета 28=256, а шестнадцатиразрядный 216=65536. То есть даже шестнадцатиразрядного таймера нам не хватит для формирования требуемой задержки. Тогда воспользуемся предварительным делителем. Этот делитель производит предварительное деление тактового сигнала перед тем как он поступит на вход таймера.

Занятие №6. Бегущие огни. Использование прерываний по таймеру

Автор: AntonChip. Дата публикации: 29 декабря 2010 .

На предыдущем занятии мы использовали таймер для формирования задержки, но не использовали его главного преимущества: способности вызывать прерывания. В подобных случаях(формирование задержки) применяют прерывания по таймеру. Это позволяет более точно формировать промежутки времени, но и главное разгрузить центральный процессор.

В данном случае мы будем использовать режим работы таймера – сброс при совпадении(СТС). В этом режиме таймер сам периодически вырабатывает запросы на прерывания с заранее заданным периодом.

Все функции управления движением огней выполняет процедура обработки прерывания. При каждом вызове прерывания процедура производит сдвиг огней на 1 шаг в нужном направлении.

Занятие №7. Операторы управления битами

Автор: AntonChip. Дата публикации: 15 января 2011 .

Сдвиг влево ( // 0b00000101

temp = temp // теперь в переменной temp число 10 или 0b00001010

temp = temp // теперь в переменной temp число 160 или 0b10100000

Выражения, в которых над переменной производится какая-либо операция, а потом результат операции присваивается этой же переменной, можно записывать короче, используя составные операторы.

temp = 42; // 0b00101010

temp // теперь в переменной temp число 80 или 0b01010000

Операция сдвига влево на n разрядов эквивалентна умножению переменной на 2n.

Занятие №8. Реализация ШИМ

Автор: AntonChip. Дата публикации: 16 января 2011 .

Цифровые устройства, например, микроконтроллер может работать только с двумя уровнями сигнала, т.е. ноль и единица или выключено и включено. Таким образом, вы можете легко использовать его для контроля состояния нагрузки, например включит или выключить светодиод. Так же вы можете использовать его для управления любым электрическим прибором, используя соответствующие драйверы (транзистор, симистор, реле и т.д.).Но иногда нужно больше, чем просто «включить» и «выключить» устройство. Поэтому, если вы хотите контролировать яркость светодиода (или лампы) или скорости двигателя постоянного тока, то цифровые сигналы просто не могу этого сделать. Эта ситуация очень часто встречается в цифровой технике и называется Широтно-Импульсной Модуляцией(PWM).

Подключение LCD(HD44780) к микроконтроллерам AVR

Автор: AntonChip. Дата публикации: 28 февраля 2011 .

В этой статье приведен пример подключения LCD индикатора к микроконтроллеру AVR, а именно ATmega8. При выборе LCD cледует различать обычные многопозиционные LCD серии ИЖКЦ, модули на их основе с микросхемой HT1611 и алфавитно-символьные LCD с встроенным контроллером. Именно последние и относят к наиболее перспективным изделиям. В подтверждение тому множество фирм в мире, специализирующихся на выпуске подобной продукции. Крупнейшие из них находятся в Тайване, Китае, Японии, США.

Подключение LCD(HD44780) по 4-х разрядной шине. Русификация LCD

Автор: AntonChip. Дата публикации: 17 марта 2011 .

Для активизации четырехбитового режима надо программно сформировать сигналы управления согласно временным диаграммам на рис.1. По структуре они совпадают с диаграммой 8-ми разрядной шины за исключением удвоенного числа импульсов «Е». Линии связи проходят через старшие разряды шины данных DB4-DB7, младшие DB0-DB3 остаются не задействованными.

ШИМ управление RGB светодиодом на микроконтроллере PIC12F629

Недавно я получил небольшую посылку с радиодеталями из Китая, с Алиэкспресс. Среди прочих деталек в посылке пришел вот такой пакетик с интересными трехцветными RGB светодиодами.

Название RGB Led происходит от аббревиатуры трех основных цветов — R (Red, красный), G (Green, зеленый) и B (Blue, синий). Таким образот, RGB Led это комбинированный трехцветный светодиод, в корпусе которого в действительности размещены три светодиода разных цветов. Яркостью каждого цвета можно управлять отдельно, изменяя ток через соответствующий диод. теориетически, изменяя соотношение яркостей мы можем получить любой цвет, в том числе и белый.

На рисунке показана распиновка RGB светодиода с общим катодом

Обычно трёхцветный светодиод имеет четыре вывода. Один вывод — общий для всех трех цветовых компонент, и три отдельных вывода для раздельного управления цветами. В зависимости от того, какие из электродов светодиодов соединены вместе внутри общего корпуса, RGB светодиод может быть с общим катодом (ОК) или с общим анодом (ОА). Это нужно иметь в виду при подключении светодиода к источнику тока. Мне приехали светодиоды с общим катодом.

Для использования такого светодиода достаточно подключить его к источнику постоянного тока через три токоограничивающих резистора. Изменяя сопротивление резисторов можно менять яркость цветовых составляющих и подбирать нужный оттенок свечения диода. нужно следить за тем, чтобы ток через светодиод не превысил максимально допустимого, иначе светодиод попросту сгорит.

RGB светодиод удобно использовать в качестве многофункционального индикатора. Один такой диод может отображать несколько состояний или режимов работы какого-либо устройства, таким образом мы экономим пространство на панели прибора. Например, при использовании такого индикатора в зарядном устройстве, красным цветом можно показывать процесс заряда, зеленым — окончание заряда а синим — неисправность аккумулятора.

Читайте также  Какой прибор преобразует переменный ток в постоянный?

Наибольший интерес представляет управление таким светодиодом от микроконтроллера с использованием широтно-импульсной модуляции (ШИМ или PWM). ШИМ — это способ управления мощностью нагрузки посредством изменения скважность (ширины) электрических импульсов при постоянной частоте. С помощью ШИМ микроконтроллер может динамически изменять яркость свечения компонентов RGB диода, создавая различные световые эффекты по заданной программе. Можно динамически менять как общую яркость свечения, так и получать любые цветовые оттенки. Все зависит только от вашей фантазии и поставленной задачи. Например, используя фильтры и аналогово — цифровой преобразователь микроконтроллера, очень легко создать цветомузыкальную индикацию для усилителя звуковой частоты.

LED1, LED2 и LED3 это соответственно красный, зеленый и синий компоненты нашего RGB светодиода. Вывод общего катода соединяется с минусом питания. Светодиоды подключены в выводам микроконтроллера через токоограничивающие резисторы R1..R3 сопротивлением 240 Ом. резистор R4 сопротивлением 1…10 килоом подтягивает вывод MCLR контроллера к плюсу питания. Это необходимо для правильной работы программы. Кнопкой S1 можно мерять последовательности световых эффектов. (См. далее)

Прошивку я залил в микроконтроллер с помощью моего самодельного программатора — клона фирменного PicKit2. Эта простая конструкция была собрана на китайской макетной беспаечной плате типа Breadboard. вот так это выглядит:

Эту схему можно использовать для управления большим количеством светодиодов, как RGB, так и дискретных, одиночных разноцветных светодиодов. Например можно красиво подсвечивать рекламные панно. В таком случае светодиодные цепочки нужно подключать через ключи на мощных биполярных или MOSFET транзисторах примерно вот так:

Программная часть проекта была позаимствована на англоязычном британском сайте, посвященном радиоэлектронике. Вот ссылка на источник. Прошивка для PIC12F629 написана на ассемблере в среде MPLAB IDE v7.31. скачать прошивку и ее исходные коды можно по ссылке в конце статьи. Кроме того, я вложил в архив проект для симулятора Proteus 8.6

Управление светодиодом

Управление осуществляется с помощью кнопки S1 (см. схему), подключенной к порту GP5 микроконтроллера (вывод 2 микросхемы).

Одиночное нажатие на кнопку. Пауза или продолжение текущей последовательности.
Вы можете нажать S1 в любое время, чтобы остановить текущую последовательность и зафиксировать текущий цвет светодиода. Еще одно нажатие продолжит выполнение программы.

Двойное нажатие — выбор следующей последовательности.
дважды нажмите кнопку с промежутком менее 0,5 секунды. так как вы делаете «двойной щелчок» компьютерной мышкой. такое действие позволяет переключать имеющиеся в прошивке последовательности. При этом все значения ШИМ сбрасываются в 0, то есть светодиод гаснет, и начинается следующая последовательность. Когда вы переберете все последовательности, вы вернетесь на самую первую. Достижение последней секвенции индицируется тремя короткими вспышками синего и зеленого светодиодов

Нажатие и удерживание более 1.2 сек. — переход в режим сна. Текущее состояние светодиода и программы записывается в энергонезависимую память EEPROM и схема переходит в состояние «сна». Последующее длительное нажатие снова включает схему и последовательность продолжается.

Формат данных последовательности световых эффектов

Поскольку к проекту прилагаются исходные коды прошивки, вы можете изменить существующие последовательности или создать новые. На скриншоте показан формат данных последовательностей. Коды последовательностей находятся в файле SequenceData.inc

Красным обведен маркер окончания секвенции. Это байт со значением 255 (FF).

Fade Rate — скорость изменения цвета

Hold Time — время задержки

Red — Красный цвет

Green — Зеленый цвет

Blue — Синий цвет

Мигающий светодиод | Программирование микроконтроллеров AVR

При написании программы часто возникает необходимость в формировании определенного интервала времени между отдельными командами. Наглядным примером тому может послужить гирлянда, в которой лампочки загораются в определенной последовательности через промежутки времени. В нашем случае для индикации задержки времени будем использовать мигающий светодиод, а лучше два и разного цвета. Мы будем управлять длительностью их включения и выключения, т. е. изменять частоту мигания.

Частота работы микроконтроллера

Большинство команд микроконтроллеров AVR выполняются в один такт генератора задающей частоты. В качестве которого широко используют встроенную в МК RC-цепочку или подключают к выводам XTAL1 и XTAL2 кварцевый резонатор.

Например, если МК работает с частотой 1 Гц, то одна команда будет выполняться за одну секунду

По умолчанию у МК ATmega8 задействован собственный внутренний генератор частоты, а точнее RC-цепочка, которая работает на частоте 1000 000 Гц = 1 МГц. Поэтому время выполнения одной команды равно:

Из этого следует, что если мы запишем подряд две команды, каждая из которых засветит отдельный светодиод, то визуально мы увидим, что они оба засветились одновременно.

PORTD = 0b000000001; // Подаем питание на 1-й светодиод

PORTD = 0b000000010; // Подаем питание на 2-й светодиод

Но на самом деле второй LED загорится с разницей во времени 0,000001 секунды от первого. Наши глаза не могут заметить такой малой разницы во времени. Уже при частоте изображений более 24 Гц (t = 1/24 ≈ 0,042 с) наше зрение формирует из отдельных картинок непрерывный фильм. Поэтому в большинстве случаев мы не различаем 25-й кадр.

Для того, чтобы оба светодиода засветились с разницей во времени 0,5 секунды необходимо между соответствующими двумя командами ( PORTD = 0b000000001; и PORTD = 0b000000010; ) поместит еще 500 000 однотактных пустых команд, т. е. заставить МК полсекунды не выполнять никаких полезных действий. Или, как говорят, нужно “убить” 500 000 тактов. Если код пишется на Ассемблере, то программисты применяют различных циклы, которые “съедают” определенное число тактов и тем самым получают различные интервалы времени.

PORTD = 0b000000001; // Подаем питание на 1-й светодиод

Для получения задержки 0,5 секунды сюда нужно вставить

500 000 однотактных команд

PORTD = 0b000000010; // Подаем питание на 2-й

Функция _delay_ms() и мигающий светодиод

При написании кода на Си в Atmel Studio имеется очень удобная функция _delay_ms() . Для работы данной функции ее необходимо предварительно подключить директивой препроцессора #include .

В круглых скобках данной функции можно задавать время в миллисекундах, тогда перед скобками нужно записать ms, или в микросекундах – us:

При использовании данной функции для того, чтобы при компиляции Atmel Studio не выдавала никаких предупреждений, следует объявить частоту с помощью оператора #define . Так как по умолчанию для ATmega8 она равна 1 000 000 Гц, то это значение мы и объявим. Это делается следующей строкой:

#define F_CPU 1000000UL

В дальнейшем, когда мы будем подключать к МК кварцевый резонатор, без данной строки уже не обойтись. Структура ее останется прежней, только вместо 1 000 000 нужно будет записать частоту кварцевого резонатора.

Давайте улучшим нашу программу, так, чтобы сначала загорался один светодиод, затем через полсекунды он гаснул и еще через полсекунды загорался второй и снова через 0,5 с гаснул.

#define

Давайте посмотрим на код, приведенной выше, еще раз. Если нам необходимо изменить значение задержки времени в функции _delay из 500, например на 300, то мы должны отыскать все строки с ее именем и выполнить соответствующую замену. Теперь представим, что таких строк сотня, а то и тысяча. Изменять значение каждого числа по отдельности крайне неудобно и долго. К тому же можно случайно пропустить строку. Поэтому необходимо применять другой, более удобный и практичный подход.

Таких подходов существует несколько. Самый простой – это объявить переменную и присвоить ей нужное значение. Далее эта переменная подставляется в соответствующие функции. Это хороший способ. В дальнейшем мы его рассмотрим детальнее. Сейчас же мы рассмотрим еще более лучший!

С помощью оператора #define мы присвоим числовому значению какое-либо имя. Это имя называется константа. В отличие от переменной, константа не может изменяться в программе. Выглядит это так:

Имя константы можно задавать практически любым, используя латинские символы и цифры. В данном случае имя MIG говорит о том, что мы применяем задержку для мигания светодиодами.

После строки с директивой препроцессора #define точка с запятой не ставится. Между именем константы и числовым значением ставится пробел.

Данная строка работает следующим образом. Перед началом компиляции выполняется замена числом 300 всех констант с именем MIG.

#define и регистры

Также оператор #define хорош тем, что с помощью него можно задавать имена регистрам. Например, если мы подключаем к порту D светодиоды, то вместо PORTD мы можем записать, например VD:

#define VD PORTD

Давайте перепишем программу, применяю директиву #define :

#define F_CPU 1000000UL

#define VD PORTD

VD = 0b000000001; // Включаем 1-й светодиод

_delay_ms ( MIG ); // Ждем 0,5 секунды

VD = 0b000000000; // Выключаем 1-й

_delay_ms ( MIG ); // Ждем 0,5 секунды

VD = 0b000000010; // Включаем 2-й

_delay_ms ( MIG ); // Ждем 0,5 секунды

VD = 0b000000000; // Выключаем 2-й

_delay_ms ( MIG ); // Ждем 0,5 секунды

Таким способом можно сделать простейшую гирлянду. Однако применение функции _delay не всегда будет оправдано, поскольку во время задержки MK не выполняет никаких полезных действий. Более эффективный способ формирования временных интервалов является применение встроенных таймеров-счетчиков. О них будет подробно рассказано в последующих статьях.