Pull to refresh

Comments 38

Оценка линейности работы АЦП мной не производилась

Такое себе "Тестирование встроенного АЦП"

Чтобы выполнить более-менее нормальное измерение DNL и INL необходим хороший генератор с характеристиками на порядок лучше чем исследуемый девайс, к сожалению такого под рукой не оказалось. Я сделал несколько замеров вручную по всему диапазону. В начале и в конце сильные искажения. На мой взгляд пригодный линейный участок находится в диапазоне 0.1 до 1.1 В.

От встроенного АЦП вообще не нужно ждать выдающихся метрологических характеристик. Если хочется что-то точно измерить - нужна отдельная схема.

Нас вполне устраивает заявленная в спецификации точность, если она обеспечивается. Поэтому хотелось проверить что мы можем получить "из коробки". Городить внешний АЦП со своим фронтом сильно не хочется, так как это значительно удорожает изделие, учитывая что сам МК и без того не из дешевых.

Спасибо за статью!

Тулчейн какой использовали - riscv-gnu-toolchain ?

Проверяли ли измерение каналов АЦП с предварительным измерением канала GND (Чередование измерений Канал_1, GND, Канал_2, GND).

Попробую. Спасибо за идею.

В одном из наших изделий мы планируем применить этот МК

А почему именно его? Или изначально стоит задача использовать отечественные компоненты?

...на вход АЦП было подано постоянное напряжение в средней точке его динамического диапазона (0,6 В)...

А как это напряжение формировалось?

Сначала потенциометром. Потом фиксированным резисторным делителем.

а что являлось источником напряжения? питание?

Питание платы от USB. На отладочной плате стоит линейный стаб с двумя электролитами по входу и выходу. Со стаба получал делителем через бусину и отправлял на вход. Параллельно со входом АЦП запаивал конденсатор большой емкости - рояли не играет. Позже выяснил, что сильно шумит "клацание" аналоговым коммутатором.

А, ну тогда еще как вариант может шуметь стаб. Сдается мне он всяко менее стабилен чем внутренний ИОН.
upd: На фото обратил внимание на разложенные провода, вполне возможно на них так же наводится помеха.

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

Тогда не удивительно. SAR ADC весьма чувствительны к сопротивлению источника. В довесок ещё и коммутатор. Если сопротивление источника велико, то требуется весьма приличный буфер.

Внутри всякого АЦП уже присутствует буферный ОУ, иначе АЦП превратился бы в генератор случайных чисел. Но Ваша идея не далека от истины, скорее всего входное сопротивления буфера в АЦП не велико. В спецификации данных нет.

Нет у этого мк буферного ОУ. И у большинства мк тоже нет. Вход коммутируется через мультиплексор непосредственно с конденсатором УВХ. Поэтому обычно предъявляют требования к выходному сопротивлению источника сигнала.

Схема АЦП из описания

Хорошо, будем иметь в виду.

Можно mcu в спящий режим переводить - это немного снижает шумы.

По хорошему, надо на том же стенде с теми же параметрами проверить альтернативы - взять что-нибудь дешевое китайское, вроде ch32v203, потом средненькое stm32f103, и подороже - nxp/TI/microchip

До недавних времен мы в своих изделиях плотно использовали STM32F4. У этой STM-ки тоже 12 битный АЦП и на нём "из коробки" легко достижима точность измерения в 1 мВ при опорном 2,5 В. А за счет высокой скорости (2,4 MSPS) и оверсэмплинга можно получать неплохие результаты. К сожалению, у MIK32 всего 0,8 MSPS и производительность ядра не позволяет в оверсэмплинг. И еще, я не припомню, чтобы у STM-ки вносился шум при переключении каналов.

Это да, шустро там. У некоторых STM32F4 еще и 3 АЦП, и в режиме чередования до 7.2 MSPS, а в новых сериях G4 еще быстрее. Плюс аппаратный oversampling (впрочем и в не_новых 16-битных dsPIC33 встречается).

Но STMelectronic успели на все грабли наступить, пока до этих серий дошли. А МИК32 совсем новый. Например, Миландр на К1986ВЕ несколько (7?) ревизий выпустили пока всё исправили, может через пол года и МИКРОН в новых ревизиях шум АЦП уменьшит.

Ну какая точность измерения 1 мВ? 1 мВ вам будет во всяком проводе наводить, например, телевещание. Чтобы говорить о точности (не о цене дискрета) в 1 мВ, нужно очень серьёзно вложиться в схемотехнику и конструктив, и точно не во встроенном в МК АЦП.

Инициализация АЦП очень странная, завел только используя Hal (посмотрел внутри функцию инициализации, там прям какая то магия происходит,ну а на регистрах провозился два дня, так и не полетел он у меня, примерно все тоже самое делал. В руководстве на мк хотелось бы примеры запуска различной периферии , как у стма например, в конце референс мануала. Мое мнение сыроват ещё мк и документацию немного поподробнее бы сделать.

Мне на Ютубе в коментах кто-то написал, что уже на подходе 3-я версия MIK32 и в ней якобы будет возможность задавать опорное выше 1,3 В. Видно, что люди работаю, вполне может получиться годное изделие.

PS: Размер EEPROM увеличить бы до 16кБ и будет просто замечательно.

На базе чего сделан набортный отладчик в КИТе?

внутри uploader есть interface/ftdi/m-link.cfg думаю что нам ftdi FT2232HL, потом похоже переименовали в mikron-link.cfg но гипотеза подтверждается содержимым этого файла

Чтобы измерять сигналы различных каналов необходимо динамически переключать (перекоммутировать каналы)

Это не проблема. DMA по таймеру вполне способен достаточно точно переключать каналы.

Также и для снятия сигнала с АЦП на большой скорости (до 0,8 MSPS, вроде, у этого мк при тактовой частоте всего 32 MHz) без DMA не успеть. Но вот беда, может кто-то подскажет, я не нашёл ни в документации, ни в примерах, как у этого мк зациклить DMA.

UPD: Программная коммутация, как в вашем примере, тоже будет работать. Только сначала надо запустить преобразование, потом поменять канал, потом ждать.

Спасибо за интересный отчет. Не понял - почему нельзя в коде перенаправить вывод на UART1, вместо этого кидать провода.

В коде без проблем можно перенаправить вывод на UART1, но все примеры сделаны с захардкоженным UART0 - замаешься править код.

https://github.com/MikronMIK32/mik32v2-shared/blob/main/libs/uart_lib.c

void attribute((weak)) xputc(char c)
{
UART_WriteByte(UART_0, c);
UART_WaitTransmission(UART_0);
}

Не за что.

Правильное решение! Гнать Ардуину взашей из наших школ. :)

Sign up to leave a comment.

Articles