Монитор окружающего света: измерение и интерпретация уровней окружающего света
Часть 3 в серии «Как сделать монитор окружающего света».
Рекомендуемый уровень
Новичок / Intermediate
Предыдущие статьи в этой серии
- Монитор окружающего освещения: отображение измерений на ЖК-дисплее
- Монитор окружающего света: понимание и реализация АЦП
Требуемое оборудование / программное обеспечение
- Плата оценки SLFK2000A EFM8
- Интегрированная среда разработки Simplicity Studio
- Компоненты, перечисленные в спецификации
Описание | Количество | Digi-Key p / n |
макетировать | 1 | 377-2094-ND |
Провода перемычки между розетками | 3 | 1471-1231-ND |
Детектор окружающего света | 1 | 425-2778-ND |
Резистор 4, 7 кОм | 1 | 4.7KQBK-ND |
Операционный усилитель общего назначения | 1 | LT1638CN8 # PBF-ND |
Конденсаторы 0, 1 мкФ | 2 | 399-4266-ND |
Обзор проекта
В предыдущих статьях обсуждалось, как отображать измерения тока и напряжения на ЖК-дисплее и как выполнять надежные аналого-цифровые преобразования. Теперь мы продолжим этот проект, построив схему датчика окружающего света на макете, оцифровывая выходные сигналы схемы и интерпретируя оцифрованные измерения.
Светочувствительным компонентом, который мы будем использовать, является линейный датчик атмосферного света линейного выхода GA1A2S100 производства SHARP. Это трехточечное устройство не является простым фотодиодом или фототранзистором. Скорее, он включает в себя три фотодиода и схемы кондиционирования, а именно:

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

Нам нужно передать этот ток через нагрузочный резистор, чтобы генерировать напряжение, которое может быть измерено с помощью АЦП EFM8, поэтому первая задача проектирования заключается в определении размера нагрузочного резистора. В техническом описании датчика указано, что напряжение на выходном выводе не должно превышать V CC - 1 В; мы используем V CC = 3, 3 В, поэтому нам нужно выбрать резистор, который произведет около 2, 3 В, когда датчик будет подвергаться максимальному ожидаемому уровню освещенности. Как указано в графике выходного тока против освещенности, датчик можно использовать до 10 000 люкс. Тем не менее, 10 000 люкс эквивалентно тому, чтобы быть вне в очень пасмурный день, что (интересно) намного ярче, чем любая нормальная освещенность в помещении. Поскольку этот проект предназначен для контроля уровня освещенности в помещении, мы будем предполагать максимальную освещенность 1000 люкс (хорошо освещенный офис может составлять 500 люкс). Рассматривая приведенный выше график, мы видим, что 1000 люкс соответствует 500 мкА, а 2, 3 В, деленная на 500 мкА, равна 4600 Ом. Поэтому мы выберем стандартный резистор 4, 7 кОм для преобразования выходного тока датчика в напряжение.
Как мы видели в предыдущей статье, входной импеданс АЦП может взаимодействовать со схемой таким образом, что приводит к ошибочным измерениям. Этот проект не страдает от двух проблемных факторов, которые присутствовали в предыдущем проекте: внешняя схема не включает большое количество последовательного сопротивления, и нет необходимости изменять настройку мультиплексора, потому что мы используем только один аналоговый вход. Таким образом, расчетное время не является серьезной проблемой в этом проекте. Тем не менее, мы по-прежнему будем включать операционный усилитель для буферизации вывода датчика, потому что это простой способ убедиться, что у нас есть драйвер с низким импедансом, который может быстро заряжать конденсатор сэмплирования АЦП. В качестве другого преимущества, с op-усилителем в схеме, мы могли бы легко включить дополнительный коэффициент усиления или фильтр нижних частот для подавления нежелательных высокочастотных колебаний. Однако в этом проекте нам не нужно больше выигрыша, и мы будем фильтровать измерения с помощью прошивки, поэтому операционный усилитель настраивается как буфер с единичным усилением. Кроме того, нам не нужно много беспокоиться о том, что op-amp делает больше вреда, чем пользы, потому что его напряжение смещения и шум не будут иметь значительного эффекта. Общая схема следующая:


Прошивка
Вся конфигурация ввода-вывода портов, периферийных устройств и прерываний такая же, как и в предыдущей статье. Единственные изменения в коде в «AmbientLightMonitor_main.c»:
ADCFactor = (float)ADC_VREF_MILLIVOLTS/ADC_2POWER10; SFRPAGE = ADC0_PAGE; ADC0MX = ADCMUXIN_P1_1; NumberofMeasurements = 0; RawADCResult = 0; while(1) { ADC0CN0_ADBUSY = START_CONV; //wait until the conversion is complete while(ADC_CONV_COMPLETE == FALSE); ADC_CONV_COMPLETE = FALSE; //retrieve the 10-bit ADC value and add it to the accumulating sum in RawADCResult SFRPAGE = ADC0_PAGE; RawADCResult = RawADCResult + ADC0; NumberofMeasurements+; /*if we have enough measurements to compute an average, shift right to divide the sum by the number of measurements*/ if(NumberofMeasurements == TWO_POWER_5) { RawADCResult = RawADCResult >> 5; NumberofMeasurements = 0; //convert the averaged conversion result to a current measurement and display //the actual value of the resistor in the test circuit is 4.6 kOhms ADCMeasurement = (RawADCResult*ADCFactor)/4.6; ConvertMeasurementandDisplay(CURRENT, ADCMeasurement); } //delay for 1/32 second so that we get one averaged measurement per second SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3 < (10000/TWO_POWER_5)); }
Скачать код
Мультиплексор ADC установлен на P1.1 вне цикла while, потому что у нас есть только один входной сигнал ADC. Конверсии инициируются путем написания логики 1 (здесь представлено определение препроцессора START_CONV) для бита ADBUSY. Затем мы ожидаем флаг ADC_CONV_COMPLETE, который установлен в подпрограмме обслуживания прерываний АЦП.
В этом проекте значение АЦП не сразу интерпретируется как измерение и отображение. Вместо этого мы реализуем простой фильтр усреднения. Если вы измените этот код, чтобы отобразить каждый результат преобразования, вы можете заметить довольно небольшую вариацию с низкой амплитудой. Это вызвано шумом схемы и относительно низким разрешением 10-битного АЦП, хотя также кажется, что GA1A2S100 восприимчив к менее устойчивым измерениям, возможно, вызванным небольшими изменениями солнечного света, отражающегося в окнах. В любом случае наш монитор окружающего света предназначен для оценки долгосрочных тенденций в освещенности внутренней среды, поэтому мы уточним наши измерения, показывая среднее значение 32 последовательных выборок. Вот почему мы используем оператор «RawADCResult = RawADCResult + ADC0»; переменная RawADCResult начинается с нуля и накапливает результаты преобразования до тех пор, пока количество накопленных измерений не будет равно 32, представленное определением препроцессора TWO_POWER_5. Количество измерений, используемых для фильтра усреднения, должно быть целым числом, равным двум, поскольку это позволяет нам выполнять деление с использованием эффективной побитовой операции сдвига вправо. Кроме того, нам необходимо убедиться, что накопленные результаты АЦП не превысят максимальное значение RawADCResult, которое в качестве 16-разрядной переменной без знака будет переполняться за 65535. 10-разрядный результат АЦП теоретически может достигать 1023, поэтому 64 измерения будут близки, но приемлемы (64 × 1023 = 65 472), а 128 - слишком много (128 × 1023 = 130, 944).
Задержка между отображаемыми (т.е. усредненными) измерениями всегда одна секунда, независимо от того, сколько выборок мы выбираем в среднем. Это выполняется с помощью инструкции while (TMR3 <(10000 / TWO_POWER_5)): 10 000 часов Timer3 соответствуют одной секунде, поэтому деление 10 000 на количество усредненных выборок означает, что задержка между отдельными преобразованиями ADC будет производить образцы со скоростью что обеспечивает одно усредненное измерение в секунду. Имейте в виду, что эта скорость обновления остается довольно быстрой с практической точки зрения - если бы мы использовали эти измерения для управления ламповым диммером, мы не хотели бы тускнуть огни каждый раз, когда кто-то бросает временную тень на оптический датчик. Но на данный момент мы просто хотим наблюдать за измерениями, и с обновлениями один раз в секунду мы можем лучше оценить и оценить чувствительность датчика.
Кстати, вы можете задаться вопросом, почему мы рассчитывали использовать эффективную операцию побитового сдвига (вместо деления) при вычислении среднего значения, если мы так небрежно используем (10000 / TWO_POWER_5) для вычисления каждой отдельной задержки. Ответ заключается в том, что оптимизатор компилятора распознает (10000 / TWO_POWER_5) как постоянное выражение и создает код сборки, который использует соответствующий постоянный коэффициент. Программа, загруженная в EFM8, фактически не выполняет деление.
Результат АЦП представляет собой напряжение, но мы хотим знать ток, генерируемый GA1A2S100. Для этого необходимо разделить напряжение на нагрузочный резистор, о котором говорилось выше. Один простой способ сделать наше измерение немного точнее - использовать фактическое значение резистора, а не номинальное значение. В тестовой цепи резистор 4, 7 кОм был фактически 4, 6 кОм, поэтому это значение используется в коде, то есть «ADCMeasurement = (RawADCResult * ADCFactor) /4.6"; мы используем 4.6 вместо 4600, потому что функция ConvertMeasurementandDisplay () эффективно включает деление на 1000, когда он интерпретирует напряжения как милливольты, а токи в качестве микро- усилителей.
Анализ
Базовые функциональные возможности схемы можно легко подтвердить, наблюдая уменьшение измерений, когда вы закрываете датчик большим пальцем, а затем увеличиваете, когда вы освещаете его лампой с близкого расстояния. Для более глубокой оценки необходимо приравнивать измеряемый выходной ток к освещенности с использованием графика выходного тока против графика освещенности выше. Было повезло, что этот тракт был протестирован в приятный день, когда в комнате было шесть окон, которые допускают значительное количество косвенного солнечного света. Искусственное освещение не использовалось, и, следовательно, медленная, нерегулярная обработка темных облаков, смешанных с солнечным светом в начале августа, вызвала отличные колебания уровня внутреннего освещения.
Иногда измерения умеренно увеличивались, когда уровень света, казалось, умеренно уменьшался (или наоборот), возможно, из-за изменений в спектральном составе, неблагоприятно взаимодействующих с схемой «компенсации спектральной чувствительности» устройства. И нет сомнений в том, что для успешной реализации потребуется тщательная установка, поскольку изменения в местоположении или ориентации датчика, например, ближе к полу, дальше от пола, направленные к окну, направленному к потолку, значительно влияют на выход, Производительность, вероятно, была бы более предсказуемой в без окон, равномерно освещенном офисе. Тем не менее, GA1A2S100 ответил хорошо, его выходной ток варьировался таким образом, который, казалось, соответствовал общему чувству «легкости» или «темноты» помещения, или, в другое время, с уровнем освещенности, которого можно было бы ожидать в зависимости от времени суток, Последнее соотношение более важно, если основной задачей является сохранение энергии путем регулировки внутреннего освещения в соответствии с количеством освещения, обеспечиваемого солнцем. Уровни тока обычно находились в диапазоне от 50 до 160 мкА, что соответствует 100-300 лк. Этот диапазон соответствует ожиданиям, учитывая, что хорошо освещенная жилая комната может быть где-то от 200 до 700 люкс.
видео
Следующая статья в серии: Монитор окружающего света: обнаружение нуля
Попробуйте этот проект сами! Получить спецификацию.