Введение Светодиод — это полупроводниковое устройство, излучающее электромагнитные волны видимого или ближнего видимого диапазона.
Его работа основана на эффекте рекомбинации носителей заряда в полупроводниковом переходе с испусканием фотонов (полное теоретическое объяснение можно найти в соответствующих книгах по физике, здесь оно не описано).
Основные электрические и оптические свойства (для данной конструкции) определяются фундаментальными физическими константами, косвенное измерение которых я опишу в этой статье.
А именно, в результате определяется значение элементарного заряда (заряда электрона) и постоянной Планка.
Я давно хотел изучить микроконтроллеры и разобраться в программировании для них, поэтому решил провести такой эксперимент. Его результаты были успешно представлены в качестве факультативного вопроса на экзамене по физике пару недель назад.
Выбор микроконтроллера
Поскольку эта идея пришла ко мне незадолго до экзамена, мне пришлось разобраться и реализовать готовую рабочую схему буквально за пару дней.Раньше у меня не было абсолютно никакого опыта работы с микроконтроллерами, поэтому выбирал по информации из различных статей и форумов.
В итоге я остановился на 32-битном семействе ARM Cortex от ST — STM32. Существует достаточно большой ассортимент отладочных плат для таких контроллеров, содержащих в удобной форме самое необходимое: сам процессор, простенькую обвязку, USB-отладчик (STLink).
я взял базовый STM32VLDИСКАВЕРИ на базе контроллера СТМ32Ф100РБ .
Основные характеристики: 8 КБ ОЗУ, 128 КБ Flash, 24 МГц по умолчанию, всевозможные АЦП/ЦАП, таймеры, десятки контактов GPIO, а также другие интерфейсы.
Программы обычно пишутся на C, хотя, конечно, возможны также ассемблер и C++.
Подключение и начало работы
Мне не удалось с полпинка запустить это устройство под Linux (тогда оно действительно работало), поэтому я воспользовался средой CooCox CoIDE для Windows - там есть готовые настройки и пример специально для такой отладочной платы, как у меня.Собственно, ни с подключением, ни с компиляцией проблем не было - все заработало сразу.
Имеется достаточный выбор библиотек для управления процессором и периферией: CMSIS от ARM и ST, StdPeriph от ST, библиотека от CooCox и другие.
В общем, сейчас мне кажется, что наиболее правильным и даже простым является использование CMSIS: там даны определения используемых структур и констант, соответствующие даташиту.
Однако, поскольку этот проект писался впопыхах, я даже не заметил, как использовал там все три перечисленные библиотеки :) Конечно, зная внутреннюю структуру, вы вполне легко сможете перенести все это в базовую CMSIS. Туториалов о том, как начать разработку под STM32, уже достаточно, поэтому я не буду на этом останавливаться дальше.
Принципиальная схема
Поскольку плата Discovery имеет питание от USB (5 В, а также стабилизатор на 3,3 В), то и измерительная часть схемы питается от того же источника.Дополнительные детали включают 3 резистора, 1 конденсатор, 1 транзистор и, конечно же, светодиоды.
Электрическая схема очень простая, паял я ее шарнирным способом – все подключалось к выводам элементов:
Здесь переключатель образно обозначает подключение к выводу контроллера, на который подается 0 или 1. Подтягивание до 5 В используется потому, что, несмотря на то, что большинство контактов поддерживают 5 В, сами они могут выводить только 3,3. Здесь, соответственно, при нуле на выводе напряжение будет 0, а при единице - почти 5 В.
Конденсатор обеспечивает плавное повышение и понижение напряжения в течение нескольких секунд. Выводы с надписью «ADC» подключаются к любым двум входам АЦП микроконтроллера и обеспечивают измерение как напряжения, так и тока светодиода:
Индикация
Конечно, можно просто отправить все данные на компьютер и там обработать, но мне хотелось отображать информацию прямо на месте.
Для этого я использовал обычное двухстрочное текстовое отображение вот так:
Для передачи на него данных достаточно 6 пинов GPIO, а со стороны ПО быстрее всего использовать какую-нибудь библиотеку.
Драйвер я взял для HD44780 (это контроллер в дисплее), который подключается к CooCox прямо из меню.
Такой драйвер тоже легко написать самому (что я, кстати, позже и сделал), но это занимает больше времени.
Измерения
Из теории полупроводников известно (можно прочитать в учебниках), что при малых значениях тока через pn переход, пока насыщение еще далеко от достижения, зависимость тока от напряжения имеет экспоненциальный характер:, где I – ток через переход, I 0 – ток электронов или дырок при отсутствии напряжения, e – заряд электрона, V – напряжение на переходе, к б — постоянная Больцмана, Т — температура.
Последнее приблизительное равенство почти точно справедливо даже для достаточно малых напряжений (десятые доли вольта).
При достаточно больших значениях тока, когда происходит насыщение, диод можно представить как последовательно соединенные постоянный перепад напряжения (равный потенциальному барьеру перехода) и резистор, соответствующий сопротивлению полупроводника и контактов.
Потенциальный барьер перехода в случае светодиода соответствует энергии излучаемых фотонов, т.е.
, где В 0 — переходное напряжение, h — постоянная Планка, c — скорость света,
длина волны излучения светодиода.
Собственно, именно светодиод (а не обычный диод) нужен для определения длины волны.
Эти данные я взял из даташитов на светодиоды, хотя в целом их можно измерить и дома - видел несколько статей по созданию спектрометра на базе CD/DVD диска.
Микроконтроллер точно измеряет вольт-амперную характеристику светодиода, а именно двух его участков: малых токов и относительно больших.
Измерения производятся автоматически после нажатия кнопки, когда ток увеличивается до 25 миллиампер, а затем когда он снижается до нуля.
Для интересующих участков вольт-амперной характеристики контроллер затем рассчитывает коэффициенты методом наименьших квадратов и из них путем простых арифметических действий получают искомые константы.
Типовой вид линейного участка вольт-амперной характеристики:
И экспоненциально:
В результате значения определенных констант оказались очень близкими к реальным: e=1,54*10. -19 Кл, ч=5,72*10 -34 Дж*с (среднее значение для всех имеющихся светодиодов, довольно широкий разброс).
Программирование
Мне не хотелось бы в данном случае слишком сильно останавливаться на написании кода, так как значительная его часть, отвечающая за взаимодействие с периферией, была взята из различных статей и туториалов — именно поэтому используются разные библиотеки, а не одна :) Статья и без этого получилась довольно объёмной.Возможно, в ближайшее время я напишу более ориентированную на программирование статью, о другом проекте на базе того же микроконтроллера.
Весь проект (исходники, служебные файлы CooCox, небольшой отчет) можно просмотреть или скачать на hg.plav.in/stm32_ledcvc/файл (отчет находится в папке отчет ).
Заключение
Изначально поставленные цели этого проекта были достигнуты: я начал разбираться в программировании микроконтроллеров, а также осветил необязательный вопрос на экзамене :) Конечно, некоторые вещи можно было улучшить или сделать по-другому.Например, плавное изменение напряжения можно было бы осуществлять через ЦАП микроконтроллера, а не постепенно заряжать конденсатор — тогда можно было бы обойтись меньшим количеством дополнительных деталей.
А использование резистора номиналом больше 27 Ом дало бы более точные измерения в диапазоне малых токов - но сначала я не планировал такие измерения, а потом переделывать схему было уже поздно.
Кстати, такие более точные измерения, возможно, позволят измерить температуру (а на приведенной выше диаграмме погрешность будет около +-30 градусов, а то и больше).
Если у вас есть вопросы по какой-либо части или есть вещи, которые вы хотели бы видеть в статье, связанной с программированием STM32, пишите :) Теги: #микроконтроллеры #stm32 #Сделай сам или Сделай сам #физика #электроника #физический эксперимент #LED
-
Доменная Зона .Yandex Делегирована
19 Oct, 24 -
Apple Выпустила Ios 8.1.1
19 Oct, 24