Официальный сайт компании Arduino по адресу arduino.cc
Тестирование АЦП ардуино, ENOB, разгон и усреднение.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 04/07/2017 - 21:29
Ставилась задача проверки эффективности и целесообразности разгона АЦП. Для прецезионного измерения битового разрешения АЦП в разных режимах использовался метод БПФ.
Аппаратные ресурсы;
1. ардуино МЕГА2560. АЦП на всех атмегах один и тот-же, мега выбрана из за размера памяти для БПФ.
2. генератор сигналов внутренний DSO Hantek (12-bit ). За неименеем лучшего, возможно результаты завалены при >12 битах.
3. буфферный усилитель - фильтр ФНЧ на MCP6022. Необязательно, два резистора и конденсатор может быть достаточно.
Результаты БЕЗ усреднения - аверейжинга.
/* averaging "u1"
Single Ended A-0:
9.6 ksps, default
125 k clock: a7a w11101111 Input 299 Hz
Peak number: 32 magnitude: 240171.70 Total: 194.1609802246 SINAD: 61.847 ENOB: 9.981
Peak number: 32 magnitude: 240183.71 Total: 199.3041534423 SINAD: 61.621 ENOB: 9.944
Peak number: 32 magnitude: 240184.25 Total: 194.2451019287 SINAD: 61.844 ENOB: 9.981
Peak number: 32 magnitude: 240144.79 Total: 196.1327209472 SINAD: 61.758 ENOB: 9.967
250 k clock: a7a w11101110 Input 599 Hz
Peak number: 32 magnitude: 239964.40 Total: 199.7442169189 SINAD: 61.593 ENOB: 9.939
Peak number: 32 magnitude: 239939.14 Total: 195.4058380126 SINAD: 61.783 ENOB: 9.971
Peak number: 32 magnitude: 239921.18 Total: 201.1040802001 SINAD: 61.533 ENOB: 9.929
Peak number: 32 magnitude: 239960.48 Total: 198.1329498291 SINAD: 61.664 ENOB: 9.951
500 k clock: a7a w11101101 Input 1198 Hz
Peak number: 32 magnitude: 239571.87 Total: 219.0831146240 SINAD: 60.777 ENOB: 9.803
Peak number: 32 magnitude: 239586.81 Total: 223.4446868896 SINAD: 60.606 ENOB: 9.775
Peak number: 32 magnitude: 239582.04 Total: 210.8227691650 SINAD: 61.111 ENOB: 9.859
Peak number: 32 magnitude: 239564.92 Total: 205.2021331787 SINAD: 61.345 ENOB: 9.898
1 M clock: a7a w11101100 Input 2396 Hz
Peak number: 32 magnitude: 232223.76 Total: 280.3315429687 SINAD: 58.365 ENOB: 9.403
Peak number: 32 magnitude: 232196.04 Total: 274.4304199218 SINAD: 58.548 ENOB: 9.433
Peak number: 32 magnitude: 232206.81 Total: 272.7705383300 SINAD: 58.602 ENOB: 9.442
Peak number: 32 magnitude: 232200.46 Total: 277.9204711914 SINAD: 58.439 ENOB: 9.415
Как видим, исходные почти 10 падают до 9.4 на 1МГц оверклока (х8). Совсем немного, часто приходиться читать что зависимость чуть ли не бит на каждое х2, т.е. на х8 где-то -4 бита. НЕ правда. АЦП хороший.
Усреднение на 8, вытягиваем 11-й бит
*********************************************************************************************
Averaging : u8
125 k clock: a7a w11101111 Input 38 Hz
Peak number: 32 magnitude: 1990554.87 Total: 894.6037597656 SINAD: 66.947 ENOB: 10.828
Peak number: 32 magnitude: 1990505.50 Total: 848.9946899414 SINAD: 67.401 ENOB: 10.904
Peak number: 32 magnitude: 1990401.37 Total: 873.2562866210 SINAD: 67.156 ENOB: 10.863
Peak number: 32 magnitude: 1990372.00 Total: 861.5628662109 SINAD: 67.273 ENOB: 10.883
250 k clock: a7a w11101110 Input 74 Hz
Peak number: 32 magnitude: 1995603.12 Total: 813.4340209960 SINAD: 67.795 ENOB: 10.969
Peak number: 32 magnitude: 1995438.75 Total: 813.6396484375 SINAD: 67.792 ENOB: 10.969
Peak number: 32 magnitude: 1995528.50 Total: 829.5065917968 SINAD: 67.625 ENOB: 10.941
Peak number: 32 magnitude: 1995513.25 Total: 805.1755371093 SINAD: 67.883 ENOB: 10.984
500 k clock: a7a w11101101 Input 149 Hz
Peak number: 32 magnitude: 1997099.12 Total: 818.8202514648 SINAD: 67.744 ENOB: 10.961
Peak number: 32 magnitude: 1997197.87 Total: 847.3858642578 SINAD: 67.447 ENOB: 10.911
Peak number: 32 magnitude: 1997172.75 Total: 850.2013549804 SINAD: 67.418 ENOB: 10.907
Peak number: 32 magnitude: 1997167.62 Total: 855.7623291015 SINAD: 67.361 ENOB: 10.897
1 M clock: a7a w11101100 Input 299 Hz
Peak number: 32 magnitude: 1997380.50 Total: 1038.3681640625 SINAD: 65.682 ENOB: 10.618
Peak number: 32 magnitude: 1997360.00 Total: 1056.1708984375 SINAD: 65.534 ENOB: 10.594
Peak number: 32 magnitude: 1997487.00 Total: 1018.9625244140 SINAD: 65.847 ENOB: 10.646
Peak number: 32 magnitude: 1997276.50 Total: 1013.6557006835 SINAD: 65.891 ENOB: 10.653
11 бит легко, но понятно что результаты до 1 МГц за счёт снижения сэмплинг рейта. Но 10.6 бит полученые на 1 МГц это лучше чем исходные 9.9.
Разгон АЦП увеличивает разрядность, но затраты процессора тоже немного растут.
И напоследок, 12-бит (и более) при снижении рейта. Проверка статистических методов.
*********************************************************************************************
Averaging : u64
125 k clock: a7a w11101111 Input 37 Hz
Peak number: 252 magnitude: 14582499.00 Total: 2508.2463378906 SINAD: 75.289 ENOB: 12.214
Peak number: 252 magnitude: 14582683.00 Total: 2400.3217773437 SINAD: 75.671 ENOB: 12.278
Peak number: 252 magnitude: 14582477.00 Total: 2438.2145996093 SINAD: 75.535 ENOB: 12.255
Peak number: 252 magnitude: 14582293.00 Total: 2494.9956054687 SINAD: 75.335 ENOB: 12.222
250 k clock: a7a w11101110 Input 37 Hz
Peak number: 126 magnitude: 15749849.00 Total: 3190.2336425781 SINAD: 73.869 ENOB: 11.978
Peak number: 126 magnitude: 15749567.00 Total: 3170.6799316406 SINAD: 73.922 ENOB: 11.987
Peak number: 126 magnitude: 15749587.00 Total: 3187.1323242187 SINAD: 73.877 ENOB: 11.980
Peak number: 126 magnitude: 15749524.00 Total: 3273.5866699218 SINAD: 73.645 ENOB: 11.941
500 k clock: a7a w11101101 Input 149 Hz
Peak number: 254 magnitude: 14624333.00 Total: 2407.5144042968 SINAD: 75.670 ENOB: 12.277
Peak number: 254 magnitude: 14624361.00 Total: 2361.1406250000 SINAD: 75.839 ENOB: 12.305
Peak number: 254 magnitude: 14624002.00 Total: 2536.6623535156 SINAD: 75.216 ENOB: 12.202
Peak number: 254 magnitude: 14623783.00 Total: 2483.3261718750 SINAD: 75.401 ENOB: 12.233
1 M clock: a7a w11101100 Input 149 Hz
Peak number: 127 magnitude: 15809414.00 Total: 3351.8518066406 SINAD: 73.473 ENOB: 11.912
Peak number: 127 magnitude: 15809325.00 Total: 3369.1030273437 SINAD: 73.428 ENOB: 11.905
Peak number: 127 magnitude: 15809365.00 Total: 3308.0595703125 SINAD: 73.587 ENOB: 11.931
Peak number: 127 magnitude: 15809180.00 Total: 3314.6928710937 SINAD: 73.569 ENOB: 11.928
64 должна теоретически дать 3-бита, т.е. 12.9 ожидаемый результат. Не хватает, варианты разные, низкое качество генератора сигналов как основной подозреваемый. Надо будет разобраться. Частоты использовались не те, надо бы 4.7 Гц - генератор завалил, поэтому только 2 частоты вместо сетки из 4-х, и более высокие чем /8 если для сравнительного анализа.
Код для всех желающих перепроверить результаты на след. посте. Там скорость АЦП через регистры выставлять надо, знание архитектуры и битов обязательно. Читайте дата шит.
Вкладка основная
Вторая таб - называется АЦП
Третья - ДСП
4-я флоат ФФТ
5-я - справка, создайте если надо для основных регистров, проще чем по дата шиту туда-сюда шариться
Инструкция по применению;
подать переменку 5В пик-пик центрованую на 2.5 постоянки на пин А0. Проверить коммандой х, чем ближе к +-512 тем лучше, но не клиппить.
комманды f e u сами разберётесь зачем. a w r тоже, а7а - установить указатель на ADCSRA, w11101100 записать ну и так далее.
Падение на 1бит точности при росте скорости х2 идет ПОСЛЕ частоты АЦП в 1Мгц. Попробуйте свой тест на делителях 1:2 (Если ваша мега его вообще потянет) - скорость АЦП = 8Мгц, 1:4, 1:8 .. и убедитесь, что потеря нехилая даже для последовательных замеров с одной единственной ноги и даже не в режиме "диф х200".
Да, и на таких скоростях чтение АЦП в обработчике прерывания - безнадежно. Только в основном коде, только "free running mode" .. в общем поиграйтесь.
Частота оцифровки 592кГц при тактовой камня 16Мгц (1:2) вполне достижима. Проверено. :)
Тесторовал АЦП AtMega328 (arduino nano) две штуки.
Вход ADC0, резисторный делитель 1/3 (от А0 на минус 5кОм, на вход 10кОм)(что было под рукой), на AREF конденсатор 470нФ, опорное AVCC.
Программа визуализации http://out.arduino.ru/?redirect=https%3A%2F%2Fyadi.sk%2Fd%2Fp-BCHLQFs2kdB&baseU=http%3A%2F%2Farduino.ru%2Fforum%2Fproekty%2Fvyzhimaem-maksimum-usb-ostsillograf-na-arduino
Взято отсюда http://arduino.ru/forum/proekty/vyzhimaem-maksimum-usb-ostsillograf-na-arduino
Ардуиновский код переписан на Си, компилировался в Proteus 8.5 (плагин arduino 1.0.5), оптимизация -О0 (иначе глюки), там же дебажился и от туда же заливался.
В результате в одной Mega328 делитель 1/2 работает и получается 615384 семпла/секунду, эффективных 7 бит. Во второй меге работает только начиная с делителя 1/4, на 1/2 выдает код FF с редким мусором, почему непонятно.
После ~30Кгц входного сигнала (генерировался функцией tone(); arduino Mega2560), видно что полоса пропускания входа АЦП начинает хромать, график становится похожим на кривую пилу.
код:
Может кому понадобится, код для Mega2560 (другой не было под рукой), в принципе пойдет любая Ардуина.
Отправка частоты (точнее F/255) использовалась терминалка программы FlProg (отправка в DEC).
В ответ придет "I recived" и отправленное число, и частота генерации.
Компилировалась в ARDUINO 1.8.1