среда, 31 августа 2022 г.

АЦП (ADC) на stm32f103, Си и cmsis

 Аналого цифровой преобразователь (далее АЦП) является важным периферийным устройством в микроконтроллере т.к. аналоговые сигналы, наряду с цифровыми, часто используются. Примеров ситуаций при которых используются аналоговые сигналы можно привести много. Это например может быть какой нибудь датчик температуры, напряжения, токовый шунт, джойстик, резистивная кнопка и т.д. АЦП микроконтроллеров плохи тем что напряжения подаваемые на пин микроконтроллера часто небольшие (особенно для STM32 это 3.3В) а также тем что они могут уступать по быстродействию и/или разрядности специализированным микросхемам. Первый недостаток устраняется использованием резистивного делителя напряжения а второй тем что это не всегда имеет большое значение а также большим количеством настроек аппаратного АЦП данного микроконтроллера для управления точностью, скоростью и количеством каналов. Начать изучение АЦП микроконтроллеров STM32 желательно с чего нибудь простого. Например можно подключить к нему какой нибудь простой потенциометр и попытаться определить напряжение на среднем его выводе а результат выводить например по uart на пк и смотреть его в мониторе последовательного порта среды разработки Arduino IDE. Для начала нужно выбрать пин микроконтроллера к которому можно подключить средний вывод потенциометра. Для этого можно глянуть таблицу в даташите:

Если выбрать пин PA0 то дальше настройка потенциометра будет немного проще чем если выбрать другой пин. Т.к, при таком варианте, не нужно будет настраивать регистры SQR. Схема может быть например такой:
Сопротивление резистора может быть другим но главное чтобы оно не было слишком низким чтобы не сделать слишком большую нагрузку на цепи питания. Конденсатор нужен для уменьшения погрешности измерения путем ослабления помех. Как обычно для периферийных устройств для АЦП нужно включить тактирование, но только теперь помимо этого нужно установить делитель частоты т.к. АЦП не может работать на частоте более 14МГц. Чтобы например сделать деление на 8 нужно записать единицы в 14й и 15й биты регистра конфигурации тактирования.
Далее, как обычно (см. предыдущие уроки), настраивается тактирование периферийных устройств (GPIO, АЦП и UART) а также режимы работы GPIO (в данном случае пин PA0 настраивается на альтернативный вход) и UART1 настраивается на передачу.
Далее если бы использовался бы пин не PA0 а другой то тогда бы пришлось настраивать регистры SQR. В данном микроконтроллере этих регистров 3 штуки ADC_SQR1, ADC_SQR2 и ADC_SQR3. В биты 20-23 регистра ADC_SQR1 записывается количество измерений за один проход. АЦП в данном микроконтроллере не один и каналов АЦП больше одного а также АЦП дает погрешность для уменьшения которой может понадобиться усреднение значения с некоторого количества измерений. В остальные биты данных регистров, за исключением битов 24-31 регистра ADC_SQR1, записываются номера каналов на которых будут производиться измерения. Первый из них записывается в биты 0...4 регистра ADC_SQR3 далее записываются остальные каналы. Если регистр ADC_SQR3 заканчивается то далее аналогично продолжается запись в регистр ADC_SQR2. Если и ADC_SQR2 тоже заканчивается то далее заполняется регистр ADC_SQR1 до бита 20 т.к. с этого бита начинается запись количества каналов. Т.к. по умолчанию в этих регистрах нули то это означает что измерение будет проводиться один раз на нулевом канале поэтому в данном случае данные регистры можно не трогать.
Есть ещё регистр настройки времени выборки ADC_SMPR2
Можно пробовать изменять значение в этом регистре чтобы повлиять на точность измерений. Работа АЦП может быть запущена разными способами. Для установки запуска программным способом нужно в регистр в биты 17...19 регистра ADC_CR2 записать единицы. 
Также нужно установить бит 20 данного регистра в единицу для разрешения внешнего запуска.
Для включения АЦП, в единицу устанавливается бит 0 данного регистра.
Для запуска калибровки АЦП нужно установить бит 2 данного регистра. 
По окончании калибровки данный бит сам сброситься. Чтобы преждевременно не начать работу с АЦП можно организовать проверку данного бита в цикле.
Для запуска АЦП, устанавливается бит 22 данного регистра



Об окончании аналого цифрового преобразования свидетельствует бит 1 регистра ADC_SR


Теперь можно забрать результат преобразования из регистра данных ADC1_DR
Чтобы увидеть результат можно его преобразовать в символы и отослать по UART на компьютер. Полный код программы можно скачать из текстового поля:

Данный урок в видеоформате можно посмотреть на видео:
КАРТА БЛОГА (содержание)

суббота, 6 августа 2022 г.

Система двухканального радиоуправления без микросхем

 Современные микросхемы и электронные модули значительно упрощают процесс изготовления разнообразных электронных устройств на их основе. Особенно это актуально для устройств работающих с радиоволнами т.к. для высокочастотных устройств имеются определнные требования к качеству разводки и изготовления плат и некоторым другим вещам которые бывает трудно реализовать в неподходящих, для этого, условиях. Однако же электронные системы, работающие с радиоволнами, существовали до появления микросхем а следовательно могут быть реализованы на дискретных элементах. Делать это может быть необходимо по разным причинам. Давайте представим например что сделать такое устройство необходимо например в гипотетической стране которая по каким то причинам не ведет торговлю с другими странами а производить может только дискретные элементы. Удивительная ситуация но допустим например чисто теоретически что она возникла. В одной из предыдущих статей рассматривалась многоканальная система радиоуправления с микросхемой-счетчиком для распределения одного канала импульсов на их большее количество. Одним из возможных вариантов построения многоканальной системы радиоуправления будет - замена двоичного интегрального счетчика на двоичный транзисторный счетчик. Двоичный счетчик может быть построен на Т-триггерах. Т-триггер - это такой триггер который меняет свое состояние на выходе при подаче сигнала на его вход т.о. получается что один такой триггер является одноразрядным двоичным счетчиком. Если соединить выход одного Т триггера со входом другого то получиться двухразрядный двоичный счетчик который можно применить для увеличения количества каналов системы радиоуправления. Однако построение такого счетчика на дискретных элементах - не простая задача т.к. для его реализации требуется большое количество деталей. Если пытаться его уменьшать всевозможными ухищрениями то можно ухудшить его качество. Под "качеством", в данном случае, можно подразумевать такие характеристики как стабильность, скорость работы (что важно для двухканальной системы "реального времени") и возможно некоторые другие. За основу для построения Т триггера, на дискретных элементах, можно взять обычный RS триггер на транзисторах:

Рисунок 1 - RS триггер на транзисторах

Для построения Т триггера на основе данного RS триггера, его нужно дополнить элементами задержки:
Рисунок 2 - RS триггер на транзисторах с элементами задержки

Это нужно для того чтобы триггер мог поменять свое состояние относительно того которое, как бы временно сохранено в таком импровизированном ОЗУ. Иначе триггер бы переключившись, сразу же бы увидел новое состояние и начал бы снова переключаться и т.д. т.е. без элементов задержки сделать Т триггер нельзя. Далее понадобятся два логических элемента "И-НЕ" чтобы просадить на землю одну из половин триггера в зависимости от того какая из них просажена в данный момент и чтобы это происходило только в том случае если на вход подан короткий запускающий импульс. Запускающий импульс должен быть коротким для того чтобы напряжения на конденсаторах элементов задержки не успели сильно измениться и повлиять на правильную работу триггера. Данное поведение не сильно соответствует обычному Т триггеру который может работать с обычными сигналами но это плата за простоту схемы, иначе пришлось бы использовать большое количество транзисторов. Схема с добавленными элементами "И-НЕ" :


Рисунок 3 - RS триггер на транзисторах с элементами задержки и "И-НЕ"

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


Рисунок 4 - Двухразрядный двоичный счетчик на дискретных элементах

Данную схему можно совместить с приемником (рассмотренным в статье http://electe.blogspot.com/2020/04/blog-post.html):
Рисунок 5 - Схема двухканального радиоприемника на дискретных элементах

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

КАРТА БЛОГА (содержание)