Определение физических констант с помощью STM32 и светодиода

в 18:08, , рубрики: diy или сделай сам, stm32, микроконтроллеры, Программинг микроконтроллеров, светодиод, физика, физический эксперимент, электроника, метки: , , , , ,

Введение

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

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

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

Так как такая идея пришла мне незадолго до экзамена, нужно было разобраться и реализовать готовую рабочую схему буквально за пару дней. Раньше абсолютно никакого опыта работы с микроконтроллерами у меня не было, поэтому выбирал я по информации из различных статей и форумов. В итоге остановился на семестве 32-битных ARM Cortex от ST — STM32. Есть достаточно большой ассортимент отладочных плат на таких контроллерах, содержащих самое необходимое в удобном виде: сам процессор, простую обвязку, USB-отладчик (STLink). Я взял базовую STM32VLDISCOVERY на основе контроллера STM32F100RB. Основные характеристики: 8 Кб RAM, 128 Кб Flash, 24 МГц по-умолчанию, всякие АЦП/ЦАП, таймеры, десятки пинов GPIO, а также другие интерфесы. Программы обычно пишутся на С, хотя конечно возможен и ассемблер, и С++.

Подключение и начало работы

С пол-пинка завести это устройство под Linux у меня тогда не получилось (потом правда всё заработало), поэтому воспользовался средой CooCox CoIDE под винду — она имеет готовые настройки и пример именно для такой отладочной платы, как у меня. Собственно, никаких проблем ни с подключением, ни с компиляцией в ней не возникло — всё работало сразу.

Для управления процессором и периферией существует достаточный выбор библиотек: CMSIS от ARM и ST, StdPeriph от ST, библиотека от CooCox и другие. Вообще, сейчас мне наиболее правильным и даже простым кажется использование CMSIS: она предоставляет определения используемых структур и констант, которые соответствуют даташиту. Однако, так как написание этого проекта происходило в спешке, я даже не заметил как использовал там все три перечисленные библиотеки :) Конечно, зная внутреннюю структуру можно достаточно легко перенести всё это на базовую CMSIS. Туториалов по началу разработки для STM32 и так хватает, поэтому больше останавливаться на этом я не буду.

Принципиальная схема

Раз уж на плате Discovery есть разведённое питание от USB (5 В, а также стабилизатор на 3.3 В), то и измерительная часть схемы питается от этого же источника. Из дополнительных деталей — 3 резистора, 1 конденсатор, 1 транзистор, ну и конечно светодиоды. Электрическая схема очень простая, и я её спаял навесным образом — всё держалось на выводах элементов:

image

Здесь выключателем образно обозначено подключение к пину контроллера, на который подаётся 0 или 1. Подтяжка к 5 В использована, т.к. несмотря на то, что большинство пинов поддерживают подачу на них 5 В, сами могут выдать только 3.3. Здесь же, соответственно, при нуле на пине напряжение будет 0, а при единице — почти 5 В. Конденсатор обеспечивает плавное нарастание и снижение напряжения в течение нескольких секунд. Выводы, обозначенные «АЦП» подключаются к любым двум входам АЦП микроконтроллера, и обеспечивают измерение как напряжения, так и тока светодиода: image

Индикация

Конечно, можно просто переслать все данные в компьютер, а уже там обработать, но хотелось отображения информации прямо на месте. Для этого я использовал обычный двустрочный текстовый дисплей типа такого: image
Для передачи данных на него достаточно 6 пинов GPIO, а с программной стороны самый быстрый способ — использовать какую-нибудь библиотеку. Я взял драйвер для HD44780 (это контроллер в дисплее), который в CooCox подключается прямо из меню. Самому написать такой драйвер тоже просто (что я потом, кстати, сделал), но дольше.

Измерения

Из теории полупроводников известно (можно прочитать в учебниках), что при малых значениях тока через p-n переход, пока до насыщения далеко, зависимость тока от напряжения экспоненциальная: image, где I — ток через переход, I0 — ток электронов или дырок при отсутствии напряжения, e — заряд электрона, V — напряжение на переходе, kb — константа Больцмана, T — температура. Последние приближённое равенство верно практически точно даже для достаточно малых напряжений (десятые доли вольта).

Для достаточно больших значений тока, когда наступает насыщение, диод можно представить в виде последовательно включенных постоянного падения напряжения (равного потенциальному барьеру перехода) и резистора, который соответствует сопротивлению полупроводника и контактов. Потенциальный барьер перехода в случае со светодиодом соответствует энергии испускаемых фотонов, т.е. image, где V0 — напряжение перехода, h — постоянная Планка, c — скорость света, image — длина волны излучения светодиода. Собственно, именно светодиод (а не обычный диод) нужен для определения длины волны. Я брал эти данные из даташитов к светодиодам, хотя вообще можно и измерить в домашних условиях — видел несколько статей по созданию спектрометра на основе CD/DVD диска.

Микроконтроллер же как раз и производит замер ВАХ светодиода, а именно двух её участков: малые токи, и относительно большие. Измерения производятся автоматически после нажатия кнопки, при возрастании тока до 25 миллиампер, а затем при его убывании обратно к нулю. Для интересующих участков ВАХ контроллер затем вычисляет коэффициенты методом наименьших квадратов, а из них простыми арифметическими действиями получаются искомые константы.

Типичный вид линейного участка ВАХ: image

И экспоненциального: image

В итоге значения определяемых констант получились очень близкими к реальным: e=1.54*10-19 Кл, h=5.72*10-34 Дж*с (среднее для всех имеющихся светодиодов, достаточно большой разброс).

Программирование

Не хотелось бы много останавливаться на написании кода в данном случае, так как значительная его часть, ответственная за взаимодействие с периферией, взята из различных статей и туториалов — именно поэтому используются различные библиотеки, а не одна :) Статья же и без этого получилась достаточно объёмной. Возможно, в ближайшее время напишу более ориентированную на программирование статью, уже по другому проекту на основе того же микроконтроллера.

Весь проект (исходники, служебные файлы CooCox, небольшой отчёт) можно просмотреть или скачать на hg.plav.in/stm32_ledcvc/file (отчёт — в папке report).

Заключение

Поставленные изначально цели этим проектом достигнуты: я начал разбираться в программировании микроконтроллеров, а также рассказал вопрос по выбору на экзамене :) Конечно, некоторые вещи можно было бы улучшить или сделать по-другому. Например, плавное изменение напряжения можно было сделать через ЦАП микроконтроллера, а не постепенную зарядку конденсатора — тогда можно было бы обойтись меньшим количеством дополнительных деталей. А использование резистора с номиналом больше, чем 27 Ом, дало бы более точные измерения в диапазоне малых токов — но сначала таких измерений я не планировал, а потом переделывать схему было уже поздно. Кстати, такие более точные измерения, возможно, позволят производить измерение температуры (а в приведённой схеме погрешность получилась бы около +-30 градусов, или даже больше).

Если есть какие-то вопросы по любой части, или есть вещи, которые хотелось бы увидеть в статье, связанной с программированием STM32 — пишите :)

Автор: chersanya

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js