Измерение интенсивности света с помощью фоторезистора и микроконтроллера AVR ATmega8

В этой статье мы подключим фоторезистор к микроконтроллеру ATmega8 (семейство AVR) и с его помощью будем измерять интенсивность света. Для этой цели мы будем использовать 10 битный аналого-цифровой преобразователь микроконтроллера (АЦП).

Измерение интенсивности света с помощью фоторезистора и микроконтроллера AVR: внешний вид

Общие сведения о фоторезисторах

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

Внешний вид фоторезисторов

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

Как показано на представленном рисунке фоторезисторы выпускаются различных типов и каждый из них имеет свою спецификацию. Обычно в полной темноте сопротивление фоторезисторов составляет величину порядка 1-2 Мом, 10-20 кОм при освещенности 10 люксов, 2-5 кОм при освещенности 100 люксов. Типичный график зависимости сопротивления фоторезистора от освещенности приведен на следующем рисунке.

Зависимость сопротивления фоторезистора от интенсивности падающего света

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

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

Делитель напряжения

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

При проектировании схем с делителем напряжения следует принимать во внимание то, что входной ток на АЦП микроконтроллера AVR должен быть не менее 50 мкА. Поэтому следует правильно выбирать резисторы делителя напряжения чтобы минимизировать влияние нагрузки (loading effect) резистора на проходящий через делитель ток.

Теперь мы должны подобрать номиналы резисторов в делителе напряжения таким образом, чтобы при входном напряжении 25В мы получали в точке измерений выходное напряжение 5В. Затем в программе чтобы получить истинное значения напряжения мы будем умножать измеренное значение выходного напряжения на 5.

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

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

  1. Микроконтроллер ATmega8 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. JHD_162ALCD (ЖК дисплей 16x2) (купить на AliExpress).
  4. Конденсатор 1000 мкФ (купить на AliExpress).
  5. Конденсатор 100 нФ (5 шт.) (купить на AliExpress).
  6. Резистор 10 кОм (купить на AliExpress).
  7. Фоторезистор (купить на AliExpress).
  8. Источник питания с напряжением 5 Вольт.

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

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

Работа схемы

Схема устройства приведена на следующем рисунке.

Схема измерения интенсивности света с помощью фоторезистора и микроконтроллера AVR ATmega8

В этой схеме PORTD микроконтроллера ATmega8 соединен с портом данных ЖК дисплея. Контакты, отвечающие за черный цвет, можно запитать или оставить без питания. В этой схеме мы их не использовали, поэтому мы будем использовать только 14 контактов ЖК дисплея: 8 контактов данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для контроля контрастности (какой толщины символы будут на экране) и 3 контакта управления (RS&RW&E).

В представленной схеме мы использовали только 2 контакта управления ЖК дисплея. Бит контраста и READ/WRITE используются нечасто, поэтому они могут быть замкнуты на землю. Это обеспечивает ЖК дисплею максимальную контрастность и переводит его в режим чтения. Теперь нам всего лишь нужно контролировать контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные. Также на нашем сайте вы можете прочитать более подробную статью о подключении ЖК дисплея к микроконтроллеру AVR.

В схеме необходимо сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS - земля
PIN2 или VDD или VCC - +5v питание
PIN3 или VEE - земля (обеспечивает максимальный контраст ЖК дисплею)
PIN4 или RS (Register Selection) – контакт PB0 микроконтроллера
PIN5 или RW (Read/Write) - земля (переводит ЖК дисплей в режим чтения что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) - контакт PB1 микроконтроллера
PIN7 или D0 - контакт PD0 микроконтроллера
PIN8 или D1 - контакт PD1 микроконтроллера
PIN9 или D2 - контакт PD2 микроконтроллера
PIN10 или D3 - контакт PD3 микроконтроллера
PIN11 или D4 - контакт PD4 микроконтроллера
PIN12 или D5 - контакт PD5 микроконтроллера
PIN13 или D6 - контакт PD6 микроконтроллера
PIN14 или D7 - контакт PD7 микроконтроллера

В схеме мы использовали 8-битную связь (D0-D7) ЖК дисплея с микроконтроллером, хотя можно было ограничиться и 4-битной – но в этом случае код программы стал бы немного сложнее. Таким образом, мы использовали 10 контактов ЖК дисплея, 8 из которых будут использоваться для передачи данных и 2 для управления.

Напряжение на резисторе R2 (наш фоторезистор) в схеме не является полностью линейным – оно зашумлено. Для фильтрации этого шума в схеме использованы конденсаторы, подключенные параллельно резисторам делителя напряжения.

Аналого-цифровой преобразователь (АЦП) микроконтроллера ATmega8 может быть использован на любом из четырех каналов PORTC – мы выберем канал 0 (PIN0) PORTC.

В микроконтроллере ATmega8 АЦП имеет разрешение (разрешающую способность) 10 бит, таким образом микроконтроллер способен реализовать чувствительность равную Vref/2^10, то есть если опорное напряжение (Vref) равно 5В мы получим цифровой инкремент на выходе 5/2^10 = 5мВ. Таким образом, на каждое приращение напряжения на 5 мВ мы будем получать один дополнительный инкремент цифрового выхода АЦП.

Для обеспечения работы схемы мы должны установить значения регистров АЦП следующим образом:

  1. Сначала мы должны активировать АЦП микроконтроллера.
  2. Затем необходимо установить максимальное входное напряжение для АЦП равное 5В. Это можно сделать путем установки значения опорного напряжения АЦП равного 5В.
  3. АЦП микроконтроллера в нашей схеме будет начинать действовать при внешнем воздействии (не от действий пользователя), поэтому нам следует установить его в режим непрерывного преобразования (free running mode): в этом режиме запуск преобразований выполняется непрерывно через определенные интервалы времени.
  4. В любом АЦП частота преобразования аналогового значения в цифровое и точность цифрового выхода обратно пропорциональны. То есть для лучшей точности цифрового выхода мы должны выбрать меньшую частоту. Для этого мы должны установить коэффициент деления предделителя АЦП в максимальное значение (2). Поскольку мы используем внутреннюю частоту микроконтроллера 1 МГц, то значение частоты преобразования АЦП будет равно 1000000/2.

Четыре основных принципа работы с АЦП микроконтроллера мы рассмотрели, теперь нам нужно установить правильные значения в двух регистрах АЦП.

Регистр ADMUX АЦП микроконтроллера AVR ATmega32

Регистр ADCSRA АЦП микроконтроллера AVR ATmega32

RED (красный, ADEN): этот бит устанавливается чтобы задействовать функции АЦП в ATmega8.

BLUE (синий, REFS1, REFS0): эти два бита используются для установки опорного напряжения (максимального входного напряжения, которое мы собираемся обрабатывать). Поскольку мы будем использовать опорное напряжение равное 5В, бит REFS0  необходимо выставить в соответствии с приведенной таблицей.

Установка битов REFS1, REFS0 в регистре ADMUX АЦП

LIGHT GREEN (светло зеленый, ADATE): этот бит должен быть установлен чтобы АЦП работал непрерывно (в режиме непрерывного преобразования).

PINK (розовый, MUX0-MUX4): эти 5 бит используются чтобы задать входной канал. Поскольку мы будем использовать ADC0 (PIN0) то, как следует из ниже приведенной таблицы, нам нет необходимости устанавливать все эти биты.

Установка битов MUX0-MUX4 в регистре ADMUX АЦП

BROWN (коричневый, ADPS0-ADPS2): эти три бита используются для установки коэффициент деления предделителя АЦП. Поскольку мы используем коэффициент деления предделителя 2, мы должны установить только один из этих битов.

Биты для установки коэффициента деления предделителя АЦП

DARK GREEN (темно-зеленый, ADSC): этот бит необходимо установить для того чтобы АЦП начал осуществлять преобразование. Далее в программе мы можем его сбросить (в 0) если нам нужно будет остановить процесс аналого-цифрового преобразования.

На ЖК дисплее будет показываться сопротивление фоторезистора. Сопоставляя его с приведенным выше графиком зависимости сопротивления фоторезистора от освещенности можно определить интенсивность падающего света.

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

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

Примечание: в тексте программы есть опечатки - в соответствии со схемой проекта необходимо в функциях send_a_command и send_a_character заменить PORTD на PORTB, а PORTA - на PORTD.

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
1 372 просмотров


Комментарии

Измерение интенсивности света с помощью фоторезистора и микроконтроллера AVR ATmega8 — 16 комментариев

  1. А каким образом здесь задействуется PB1, PB0 и почему цифры 5 и 6?
    #define E 5
    // задействуем контакт PB1 PORTB (“enable”), поскольку он соединен с контактом “enable” ЖК дисплея
    #define RS 6
    // задействуем PB0 PORTB (“enable”), поскольку он соединен с контактом RS ЖК дисплея

    • Это используется потом в командах на изменение состояния контактов PORTD, чтобы подать нужную команду управления на ЖК дисплей. Если вы расшифруете эти команды, то вам станет ясно почему используются цифры 5 и 6. Также на нашем сайте вы можете прочитать подробную статью про подключение ЖК дисплея к микроконтроллеру AVR.

      • Здравствуйте. Команда для перевода из двоичного кода в десятичное число существует, или нужно писать подпрограмму для перевода?

        • Нет, я такой команды не знаю. Можно вручную перевести или с помощью калькулятора в сети. Да и обычный калькулятор Windows в научном режиме тоже вроде умеет это делать.
          Со взаимодействием с ЖК дисплеем разобрались? В коде программы есть опечатки - перепутаны названия портов, к сожалению, я скоро напишу об этом в конце статьи и как эти опечатки исправить

          • Не разобрался пока, введённые вручную значения выводятся, а вот полученные от датчика нет. Потом ещё и 32 кирпича вместо символов появились, не знаю, как от них избавиться... Команду-то я имел в виду такую, чтобы двоичное число температуры или другой величины переводила внутри программы в десятичное, которое потом можно было бы отправить в виде символа на LCD.

            • Возможно, есть такая команда, но я не знаю ее. А каким образом вы вообще от какого то датчика получаете двоичное число? У датчика либо цифровой выход (то есть 0 или 1) или аналоговый - в этом случае его подключают к аналоговому входу микроконтроллера, а на выходе АЦП снимают уже десятичное число от 0 до 1023. Подобный же подход используется и в проекте, описанном в этой статье.

      • А, вообще, (не по теме вопрос) вместо прерываний можно использовать задержки?

        • Нет конечно. В обработчике прерывания ведь выполняются какие-нибудь действия, а задержка просто останавливает выполнение программы.

          • На выходе датчика влажности 5 байт данных, каждый бит следует через промежутки в 50 мс. Первый байт - влажность, второй - влажность после запятой, третий и четвёртый - то же самое, но для температуры, пятый - контрольная сумма. Если мне нужен только первый байт, это ведь будет какое-то двоичное число?

            • А каким образом вы принимаете этот байт? Просто сколько видел уже проектов на AVR и Arduino, в большинстве случаев если речь идет о приеме целого байта, а не нескольких бит, то он принимается в форме обычного десятичного, а не двоичного числа

            • Так вот он и получается не байтом, а отдельными битами через каждые 50 мс. Если длина сигнала "1" равна 24 мс, то это ноль, если 70 мс, то единица. Получается, если бит "1", то его нужно прибавлять, сдвигая число на "1" влево. Получается восьмибитовое число.

              От Админа: нет, такой датчик я еще не встречал. Ну тогда можно просто использовать стандартную формулу для перевода числа из двоичного вида в десятичный. Для 8 бит эта формула будет не очень длинной

  2. Хотя, бывает, что в Протеусе не показывает как надо. Попробую в железе.

  3. В Протеусе на экран не выводится число, только нули и символ, что задаётся в кавычках (0.0К). Записал не имеющую отношения к программе простую формулу со всеми переменными, пробовал и float, и int - результат тот же.

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

      • Да и я только начал осваивать всё, что связано с микроконтроллерами. Вот подключение светодиода по ШИМ в Протеусе дало неудовлетворительные результаты, а на отладочной плате, судя по видео на одном ресурсе, всё работало как должно.
        Кстати, хотел у вас поинтересоваться, бывает так, чтобы программаторы USBISP, копия USBASP, были непрошиты или ещё с каким-то браком? Я купил 2 штуки в одном магазине, и оба не определяются системой, только появляются как HID-устройства в Диспетчере устройств. Установка драйверов, отключение проверки их цифровой подписи, помощь системного администратора ни к чему не привели)

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *