• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ADC-преобразователь аналоговых сигналов

nikolz

Well-known member
Добрый день,
Данный вопрос уже рассматривался на форуме, но я предлагаю вынести его отдельно и обсудить следующее.
------------------------
Вот что я понял из всего прочитанного по ADC ESP8266:
-----------------------------------
1) точность измерения напряжения.
Согласно документации для точного измерения мы должны использовать
команду system_get_vdd33 чтобы измерить напряжение на pin3 и pin4.
это значение должно быть установлено в 107 байт esp_init_data_default.bin
Так как напряжение может быть в диапазоне 1.8-3.6, то значение в 107 байте может быть в диапазоне 18-36.
Таким образом, дискретность измерения опорного напряжения 0.1 в.
Т е, если реальное напряжение не установлено с точностью до 0.1 в,
то неточность установки будет ошибкой измерения значения ADC на pin 6
----------------------------------------
2) Время преобразования (быстродействие)
Возьмем программу, предоставленную Г-ном pvvx:

A)--------------------------
//Correction adders z - 21:
void read_sar_dout(uint16 * buf)
{
volatile uint32 * sar_regs = &SAR_BASE[32]; // 8 regs 0x60000D80...
int i;
for(i = 0; i < 8; i++) {
int x = ~(*sar_regs++);
int z = (x & 0xFF) - 21;
x &= 0x700;
if(z > 0) x = ((z * 279) >> 8) + x;
buf = x;
}
}
что делается в этой программе я пока не понял
Вопросы:
1) что означают константы 279, 21
2) зачем двигать на байт результат ADC если z>0


B)----------------------
uint16 sar_dout, tout, sardata[8];
read_sar_dout(sardata);
for (i = 0; i < 8; i++) {
sar_dout += sardata;
ADC_DBG("%d, ", sardata);
}
--------------------------
Программа суммирует 8 значений полученных на выходе ADC.
Т е это не 8 значений одного измерения ADC , а сумма 8-ми измерений.
Согласно результатам, полученным Г-ном pvvx ,
время получение результата функции read_sar_dout
составляет примерно 20 мкс.
Но это не одно значение ADC, а восемь.
Таким образом, получаем, что время преобразования ADC составляет примерно 2.5 мкс.
Но в качестве результата мы получаем среднее от 8 значений ADC.
------------------------
Это лишь мое понимание и непонимание.
-------------------------------
"Хотелось бы услышать начальника транспортного цеха."
 
Последнее редактирование:

nikolz

Well-known member
Сегодня получил ответ от китайцев.
Они действительно просто складывают 8 отдельных отсчетов ADC
Таким образом, время преобразования ADC составляет примерно 2.5 мкс.
Получается, что предельная частота дискретизации ADC составляет 400 кгц.
 

pvvx

Активный участник сообщества
Согласно результатам, полученным Г-ном pvvx ,
время получение результата функции read_sar_dout
составляет примерно 20 мкс.
Я такого не говорил. Это ваш не верный вывод.
Время работы функции read_sar_dout() равно примерно 8/26 000 000 сек + мелочи на обработку входа и выхода из функции CPU.
Причина - низкая скорость шины CPU к регистрам периферии.
Функция считывает готовые результаты из регистров.
Запуск замера производится взводом бита 1 в регистре 0x60000D50.
Готовность данных отмечается по сбросу битов 24, 25, 26 этого-же регистра. Там вроде счетчик (не помню).
С времени взвода (запуска замера) до готовности и проходит примерно 1/22 000 сек.
Вам сложно переложить в математическую функцию коррекцию получаемых данных из регистров? Начните с того, что кто вам обещал правильный порядок бит и их отношений к измеряемому сигналу в тех 8-ми регистрах? Потом обратитесь к принципу работы SAR.
Из-за данной коррекции у нас ADC не может выдавать максимальное значение.
После суммы всех 8-ми получаем предел в 0x3FF8.
WDRV_ADC_RC.gif
Заряд и разряд конденсора с шунтом (47 и 33 кОм в параллель) включенного на вход ADC и коммутируемого через 7.5 кОм на +3.3V. Данные приняты из WDRV драйвера в "веб свалке" по UDP.
Это вывод спада заряда емкости 100 мкФ (с шунтом 47 кОм) при выводе точек уже суммами замеров ADC по 4 шт:
ADC_RC.gif
В web-свалке чтение ADC по НТТР выдает 16 битные значения.
Код:
           uint16 x[4];
             read_adcs(x, 4);
             tcp_puts("%u", x[0]+x[1]+x[2]+x[3]); // 16 бит ADC :)
Функция read_adcs() считывает указанное ей значение замеров в буфер на пределе работы ADC (~21 тысяча замеров по 14 бит)

The Data Conversion Handbook, edited by Walt Kester
 
Последнее редактирование:

nikolz

Well-known member
pvvx,
добрый день,
Спасибо за информацию.
-------------------------------------------
Я не с целью претензий,
а истины для,
пытаюсь разобраться в существующем решении.
-------------------------------
Про сумматоры
Вот здесь Ваша картинка
http://esp8266.ru/forum/threads/tochnost-adc.598/#post-10617
где
1) Вы пишите про 8 сумматоров
2) масштаб Вами указан 20 мкс/см
3) восемь импульсов укладываются на 1 см т е за 20 мкс
----------------------
Я же предполагаю,
что это не 8 сумматоров,
а 8 результатов SAR_ADC
и поэтому
на 1 преобразование ADC уходит 20/8=2.5 мкс.
-------------------------------
А вот еще Ваша цитата:
http://esp8266.ru/forum/threads/raz...o-webservera-na-esp8266.56/page-54#post-12456
20 кГц на отсчет и баста.
ADC полу-программный, набор сумм с коррекциями из 8 регистров сумматоров.

====================
Теперь несколько доводов,
почему я не согласен с Вашим выводом,
что это 8 сумматоров одного преобразования.
------------------------
Если предположить, чтоэто верно, то тогда это не SAR-ADC.
Если же это SAR-ADC, то число тактов должно быть не меньше числа получаемых разрядов.
Т е если разрядов больше 8, то число тактов не может быть 8.
-----------------------------
Более того, в SAR нет никаких сумматоров.
Они там не нужны.
Там используется обычный регистр с установкой сбросом разрядов
и результат получается в этом регистре.
Раньше, как известно, ставили ЦАП R-2R,
теперь вместо R используют С,
но поразрядное уравновешивание осталось.
В загруженном файле статья для примера
----------------------
 

Вложения

nikolz

Well-known member
Теперь про программы.
приведу Ваши программы которые Вы разместили на сайте ESP8266.com
------------------
Code: Select allvoid read_sar_dout(uint16 * buf)
{
volatile uint32 * sar_regs = &SAR_BASE[32]; // 8 regs 0x60000D80...
int i;
for(i = 0; i < 8; i++) {
int x = ~(*sar_regs++);
int z = (x & 0xFF) - 21;
x &= 0x700;
if(z > 0) x = ((z * 279) >> 8) + x;
buf = x;
}
}
----------------------
В этой программе нет поразрядных сдвигов.
есть операции с константами и вычисление суммы для значения buf
т е есть преобразования, но они для формирования x вне зависимости от i.
Т е каждое значение buf формируется по одному и тому же алгоритму.
Полагаю это связано с различным весом емкостей.
Но формируются 8 независимых измерений.

----------------------------------
The sum of eight values:
Code: Select alluint16 sar_dout, tout, sardata[8];
read_sar_dout(sardata);
for (i = 0; i < 8; i++) {
sar_dout += sardata;
ADC_DBG("%d, ", sardata);
}
--------------------
Здесь просто сумма восьми значений без каких-либо сдвигов,
т е обычное усреднение для повышения точности измерения

--------------------------
tout = (sar_dout + 8) >> 4; // tout is 10 bits fraction
---------------------

Здесь деление на 16, хотя сложили 8 значений.
Полагаю, что один сдвиг лишний.
 

nikolz

Well-known member
вот картинки из документации AN2834


-------------------------------

Что-то напоминает?
 

nikolz

Well-known member
Вчера я спросил китайцев,
возможно ли реализовать скорость преобразования ADC 100 тыс в секунду на ESP8266.
-----------------------
вот их ответ:
We can support 100000 samples per second.
But we need some time to develop it.
 

nikolz

Well-known member
Вам дана ссылка на описание разных типов ADC - вкуривайте.
Это типа, признать ошибку не хочу, типа сам дурак?
Я Вам тоже привел ссылку на два документа и картинки как у Вас и объяснил суть приведенных программ.
Может поясните свою логику как у ВАС SAR за 8 тактов делает 16(14) бит. Патент еще не получили?
 

pvvx

Активный участник сообщества
Раньше, как известно, ставили ЦАП R-2R,
теперь вместо R используют С,
но поразрядное уравновешивание осталось.
В загруженном файле статья для примера
----------------------
Вместо С там стоят транзисторы и flash. В так названных сумматорах если смотрите код, то видите различие по 3 + 8 бит. Сцылка для вкуривания вам дана.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Это типа, признать ошибку не хочу, типа сам дурак?
Я Вам тоже привел ссылку на два документа и картинки как у Вас и объяснил суть приведенных программ.
Может поясните свою логику как у ВАС SAR за 8 тактов делает 16(14) бит. Патент еще не получили?
Уже запатентовано и указано в книжке, приложенной для вас.
Долго что-то вы выводите 8 регистров на распечатку :)
У меня ADC работает на 20кГц и передается по WiFi, а вот у вас и других - пока нет. И так уже пол года :)
Вчера я спросил китайцев,
возможно ли реализовать скорость преобразования ADC 100 тыс в секунду на ESP8266.
-----------------------
вот их ответ:
We can support 100000 samples per second.
But we need some time to develop it.
Это коммерсанты - у них всегда ответ "да". Но "воз и ныне там" по всем вопросам. Даже с flash не справились, а вы писали, что они вам сделают :)
 
Последнее редактирование:

nikolz

Well-known member
Уже запатентовано и указано в книжке, приложенной для вас.
Долго что-то вы выводите 8 регистров на распечатку :)
У меня ADC работает на 20кГц и передается по WiFi, а вот у вас и других - пока нет. И так уже пол года :)
Это коммерсанты - у них всегда ответ "да". Но "воз и ныне там" по всем вопросам. Даже с flash не справились, а вы писали, что они вам сделают :)
Сам себя не похвалишь, никто не похвалит. Верно?
Вам оно нужно?
Я вот за это время написал пару роботов .
А Вы все ESP ковыряете да китайцев ругаете.
Я Вам писал полгода назад, что так и будете ковырять, ругая всех, акромя себя.
Пока по-моему выходит.
----------------------------
Вы сами то читали на что сослались?
Тогда ткните страницу где речь идет про SAR
Вообще-то схем АЦП уйма. Но SAR - одна из них. и в приведенных мною документах разжеваны именно SAR-ADC которые делают STM и TI.
-------------------------
Но Вы так и не ответили где Вы нашли восемь сумматоров?
-------------------------
 
Сверху Снизу