Не так давно я уже писал заметку про новый микроконтроллер MIK32 AMUR от отечественного производителя АО "Микрон" и отладочную плату NUKE MIK32 на его базе. В одном из наших изделий мы планируем применить этот МК для измерения расхода жидкости и выдачи усредненного параметра в цифровом виде. В связи с чем появилась необходимость проверить как работает АЦП в составе этой микросхемы. Микроконтроллер MIK32 "AMUR" укомплектован одним многоканальным аналого-цифровым преобразователем разрядностью 12 бит к входу которого можно подключать до 8 сигналов через встроенный аналоговый коммутатор. В данной статье я приведу пример кода для работы этим АЦП и опишу выявленные проблемы и особенности.
Сборка примера
Ссылка на репозиторий с примером кода для опроса АЦП и выдачей усредненного результата на UART0.
Репозиторий содержит оригинальный пример от поизводителя доработанный для поддержки платы NUKE MIK32 V0.3 от этого же производителя. На этой плате требуется снять перемычки с разъема COM13 и соединить двумя патчами сигналы RX/TX от FTDI с противоположными сигналами порта UART0 на MIK32, то есть FT_TX соединить с P0.5, а FT_RX с P0.6 (см. картинку на КДПВ). После чего порт UART0 микроконтроллера будет доступен как /dev/ttyUSB0 при покдлючении отладочной платы к USB порту. Параметры порта: 9600, 8N1.
В исходном коде добавлено определение макро MIK32V2 которое участвует в инициализации АЦП внутри библиотеки HAL. Без него АЦП на данной плате работает неверно. Для сборки под другие платы будьте внимательны, проверяйте версию микроконтроллера и устанавливайте соответствующие макро в коде, в Makefile-е или в коммандной строке через флаг
-DMIK32V2
.Сборка примера осуществляется командой
make
. Перед сборкой необходимо подправить Makefile и указать в нем путь к компилятору GCC с поддержкой архитектуры RV32IMC. Так же необходимо указать пути к репозиториям содержащие библиотеки mik32-hal и mik32-shared от производителя.Прошивка осуществляется командой
make upload
. Перед прошивкой небходимо установить пакет поддержки openocd (имеется абсолютно во всех Linux и *BSD дистрибутивах), а так же скрипт для программирования mik32-uploader.
Проблемы и особенности АЦП на MIK32
Проблема с коммутацией каналов. Микроконтроллер MIK32 AMUR содержит один блок аналого-цифрового преобразователя к которому можно подключить до 8 источников сигнала через встроенный коммутатор аналоговых каналов. Это означает, что в каждый конкретный момент времени производится только одно измерение. Чтобы измерять сигналы различных каналов необходимо динамически переключать (перекоммутировать каналы). Переключение каналов осуществляется записью соответствующего битового значения в регистр коммутации. Проблема состоит в том, что коммутация производится не сразу, и не перед конверсией (единичным измерением), а только по его завершению. Это накладывает определенные сложности на алгоритм захвата данных: коммутацию каналов нужно выполнять либо во время конверсии, что не удобно если программа работает по прерываниям, либо проводить одну лишнюю конверсию для переключения канала перед запуском серии измерений с выбранного канала.
Проблема большой ошибки смещения нуля (offset error). На моём устройстве ошибка смещения составляет около 170 отсчетов АЦП, что составляет более 5% его динамического диапазона. Ошибка смещения примерно одинакова по всем каналам. В спецификации этот параметр не указан.
В руководстве на микросхему сказано, что входное напряжение на АЦП не должно быть менее 15 мВ, однако АЦП отзывается уже при 1 мВ на его входе. Оценка линейности работы АЦП мной не производилась, но есть основания полагать, что эти 15 мВ (то есть еще 51 осчет АЦП) так же можно вычесть из динамического диапазона. Таким образом, динамический диапазон сужается до 3875 отсчетов или 71,7 dB (в спецификации указан 71,9 dB).
Опорное (референсное) напряжение на АЦП у MIK32 установлено в 1,2 В и согласно спецификации не может превышать 1,3 В. Это может создать некоторое неудобство разработчикам привыкшим к тому, что блоки АЦП во многих импортных микроконтроллерах имеют опорное напряжение 2,5 В, либо опорное для них может быть произвольно задано в пределах напряжения питания микросхемы. Не смотря на то, что у ЦАП и АЦП в микроконтроллере MIK32 имеется отдельный вход для подачи опорного напряжения, попытка подать более 1,3 В (и установка соответствующих значений в регистрах) ни к чему хорошему не приводит, АЦП все так же достигает максимального значения при напряжении около 1,3 В.
Пульсации и дрейф АЦП. При длительном замере постоянного напряжения на входе АЦП было установлено, что показания АЦП дрейфуют вокруг одной точки с различным периодом, от 5 до 25 секунд. Размах ошибки составляет до 24 отсчетов АЦП, стадартное отклонение составляет 3,85 LSB. Установка фильтрующего конденсатора высокой емкости на входе АЦП не устраняет дрейф и не уменьшает ошибку. Это означает, что три младших бита АЦП можно считать незначащими и таким образом эффективная разрядность АЦП не превышает 9 бит.
Расчёт эффективного числа бит (ENOB)
Для расчета ENOB на вход АЦП было подано постоянное напряжение в средней точке его динамического диапазона (0,6 В) и снято 120 тыс измерений с частотой 1000 Гц. Далее по формулам было вычислено стандартное отклонение, соотношенеи SNR и ENOB. Расчетное ENOB составило 8,94 бит. В спецификации указан ENOB = 11.94 бит (10.5 min) и я склонен ей верить. Чем вызван такой разброс измерений в моё случае еще предстоит выяснить, надеюсь зоркий глаз пользователя Хабр подскаже где находится ошибка в моих расчетах. Таблица с расчётами в формате .ODS (LibreOffice Calc) находится в репозитории.
Тестирование проводилось на плате NUKE MIK32 v0.3, № партии: MK32-ПП 31052024-500, серийный номер не указан. Плата не содержит импульсных преобразователей напряжения.
Заключение
В целом встроенный АЦП в микроконтроллере MIK32 годен для применения в приборах невысокой точности, в частности для домашней автоматизации, и позволяет сэкономить на установке внешнешней микросхемы АЦП. Программирование АЦП, за исключением нюанса с переключением каналов, мало чем отличается от других одноклассников.
Update
Уже после написание этой статьи было установлено, что если не переключать каналы АЦП, а проводить замер сигнала с одного и того же канала непрерывно, то ошибка уменьшается в несколько раз, до 1-2 мВ. В случае с непрерывной коммутацией каналов ошибка составляет 3-5 мВ на этом же стенде, с этим же питанием и этими же проводами и потенциометром в качестве задатчика входного напряжения. Вероятно аналоговый коммутатор внутри МК осуществляет перенос заряда при переключении каналов, чтобы нивелировать этот эффект в код требуется вставлять холостые циклы опроса АЦП после каждого переключения. Измеренный ENOB при отсутствии переключения каналов дает 9,53 бита.
Комментарии (28)
vadimr
19.08.2024 07:44+2От встроенного АЦП вообще не нужно ждать выдающихся метрологических характеристик. Если хочется что-то точно измерить - нужна отдельная схема.
checkpoint Автор
19.08.2024 07:44Нас вполне устраивает заявленная в спецификации точность, если она обеспечивается. Поэтому хотелось проверить что мы можем получить "из коробки". Городить внешний АЦП со своим фронтом сильно не хочется, так как это значительно удорожает изделие, учитывая что сам МК и без того не из дешевых.
Nad73
19.08.2024 07:44+2Проверяли ли измерение каналов АЦП с предварительным измерением канала GND (Чередование измерений Канал_1, GND, Канал_2, GND).
ret77876
19.08.2024 07:44В одном из наших изделий мы планируем применить этот МК
А почему именно его? Или изначально стоит задача использовать отечественные компоненты?
FGV
19.08.2024 07:44+1...на вход АЦП было подано постоянное напряжение в средней точке его динамического диапазона (0,6 В)...
А как это напряжение формировалось?
checkpoint Автор
19.08.2024 07:44+1Сначала потенциометром. Потом фиксированным резисторным делителем.
FGV
19.08.2024 07:44+1а что являлось источником напряжения? питание?
checkpoint Автор
19.08.2024 07:44+1Питание платы от USB. На отладочной плате стоит линейный стаб с двумя электролитами по входу и выходу. Со стаба получал делителем через бусину и отправлял на вход. Параллельно со входом АЦП запаивал конденсатор большой емкости - рояли не играет. Позже выяснил, что сильно шумит "клацание" аналоговым коммутатором.
FGV
19.08.2024 07:44+2А, ну тогда еще как вариант может шуметь стаб. Сдается мне он всяко менее стабилен чем внутренний ИОН.
upd: На фото обратил внимание на разложенные провода, вполне возможно на них так же наводится помеха.checkpoint Автор
19.08.2024 07:44Более точные результаты будут получены уже на своей плата с внешним опорником и прецизионными резисторами. Но пока своя плата находится в разработке, мне хотелось понять чего можно ожидать от этого зверька. В целом, если использовать только один канал, то результат меня вполне устраивает.
timothyz
19.08.2024 07:44Тогда не удивительно. SAR ADC весьма чувствительны к сопротивлению источника. В довесок ещё и коммутатор. Если сопротивление источника велико, то требуется весьма приличный буфер.
checkpoint Автор
19.08.2024 07:44Внутри всякого АЦП уже присутствует буферный ОУ, иначе АЦП превратился бы в генератор случайных чисел. Но Ваша идея не далека от истины, скорее всего входное сопротивления буфера в АЦП не велико. В спецификации данных нет.
fivlabor
19.08.2024 07:44+2Можно mcu в спящий режим переводить - это немного снижает шумы.
По хорошему, надо на том же стенде с теми же параметрами проверить альтернативы - взять что-нибудь дешевое китайское, вроде ch32v203, потом средненькое stm32f103, и подороже - nxp/TI/microchip
checkpoint Автор
19.08.2024 07:44До недавних времен мы в своих изделиях плотно использовали STM32F4. У этой STM-ки тоже 12 битный АЦП и на нём "из коробки" легко достижима точность измерения в 1 мВ при опорном 2,5 В. А за счет высокой скорости (2,4 MSPS) и оверсэмплинга можно получать неплохие результаты. К сожалению, у MIK32 всего 0,8 MSPS и производительность ядра не позволяет в оверсэмплинг. И еще, я не припомню, чтобы у STM-ки вносился шум при переключении каналов.
fivlabor
19.08.2024 07:44Это да, шустро там. У некоторых STM32F4 еще и 3 АЦП, и в режиме чередования до 7.2 MSPS, а в новых сериях G4 еще быстрее. Плюс аппаратный oversampling (впрочем и в не_новых 16-битных dsPIC33 встречается).
Но STMelectronic успели на все грабли наступить, пока до этих серий дошли. А МИК32 совсем новый. Например, Миландр на К1986ВЕ несколько (7?) ревизий выпустили пока всё исправили, может через пол года и МИКРОН в новых ревизиях шум АЦП уменьшит.
fulky
19.08.2024 07:44Инициализация АЦП очень странная, завел только используя Hal (посмотрел внутри функцию инициализации, там прям какая то магия происходит,ну а на регистрах провозился два дня, так и не полетел он у меня, примерно все тоже самое делал. В руководстве на мк хотелось бы примеры запуска различной периферии , как у стма например, в конце референс мануала. Мое мнение сыроват ещё мк и документацию немного поподробнее бы сделать.
checkpoint Автор
19.08.2024 07:44Мне на Ютубе в коментах кто-то написал, что уже на подходе 3-я версия MIK32 и в ней якобы будет возможность задавать опорное выше 1,3 В. Видно, что люди работаю, вполне может получиться годное изделие.
PS: Размер EEPROM увеличить бы до 16кБ и будет просто замечательно.
Dark_Purple
19.08.2024 07:44+1На базе чего сделан набортный отладчик в КИТе?
NutsUnderline
19.08.2024 07:44внутри uploader есть interface/ftdi/m-link.cfg думаю что нам ftdi FT2232HL, потом похоже переименовали в mikron-link.cfg но гипотеза подтверждается содержимым этого файла
REPISOT
Такое себе "Тестирование встроенного АЦП"
checkpoint Автор
Используем сборку SiFive Freedom Bare Metal GCC.
checkpoint Автор
Чтобы выполнить более-менее нормальное измерение DNL и INL необходим хороший генератор с характеристиками на порядок лучше чем исследуемый девайс, к сожалению такого под рукой не оказалось. Я сделал несколько замеров вручную по всему диапазону. В начале и в конце сильные искажения. На мой взгляд пригодный линейный участок находится в диапазоне 0.1 до 1.1 В.