Отдельной команды/регистра для скорости оцифровки нет. Поэтому или пишете каждый раз в конфигурационный регистр сразу все параметры работы чипа, либо читаете их оттуда, исправляете и пишете заново. Только вот не помню - чип дает конфиг читать или нет...
Уровня вашей подготовки я не знаю, поэтому точной рекомендации не могу дать.
// ADC ADS1115 settings
#define ADS1115_I2C_ADDRESS (0x48)
#define ADS1115_CONFIG_PGA_6_144V (0x0000) // +/-6.144V range = Gain 2/3
#define ADS1115_CONFIG_PGA_4_096V (0x0200) // +/-4.096V range = Gain 1
#define ADS1115_CONFIG_PGA_2_048V (0x0400) // +/-2.048V range = Gain 2 (default)
#define ADS1115_CONFIG_PGA_1_024V (0x0600) // +/-1.024V range = Gain 4
#define ADS1115_CONFIG_PGA_0_512V (0x0800) // +/-0.512V range = Gain 8
#define ADS1115_CONFIG_PGA_0_256V (0x0A00) // +/-0.256V range = Gain 16
#define ADS1115_CONFIG_DR_8SPS (0x0000) // 8 samples per second
#define ADS1115_CONFIG_DR_16SPS (0x0020) // 16 samples per second
#define ADS1115_CONFIG_DR_32SPS (0x0040) // 32 samples per second
#define ADS1115_CONFIG_DR_64SPS (0x0060) // 64 samples per second
#define ADS1115_CONFIG_DR_128SPS (0x0080) // 128 samples per second (default)
#define ADS1115_CONFIG_DR_250SPS (0x00A0) // 250 samples per second
#define ADS1115_CONFIG_DR_475SPS (0x00C0) // 475 samples per second
#define ADS1115_CONFIG_DR_860SPS (0x00E0) // 860 samples per second
#define ADS1115_CONFIG_MUX_DIFF_0_1 (0x0000) // Differential P[ositive] = AIN0, N[egative] = AIN1 (default)
#define ADS1115_REG_CONVERT (0x00)
#define ADS1115_REG_CONFIG (0x01)
#define ADS1115_CONFIG_CQUE_NONE (0x0003) // Disable the comparator and put ALERT/RDY in high state (default)
#define ADS1115_CONFIG_CLAT_NONLAT (0x0000) // Non-latching comparator (default)
#define ADS1115_CONFIG_CPOL_ACTVLOW (0x0000) // ALERT/RDY pin is low when active (default)
#define ADS1115_CONFIG_CMODE_TRAD (0x0000) // Traditional comparator with hysteresis (default)
#define ADS1115_CONFIG_MODE_CONTINUOUS (0x0000) // Continuous conversion mode
Здравствуйте, а можно пожалуйста простой скетч целиком: дифференциальное чтение 0_1, Continuous conversion mode, с возможностью смены усиления? Нашел такой же по сути вопрос на форуме адафрут, но на аглицком разобраться тяжеловато( https://forums.adafruit.com/viewtopic.php?f=22&t=76452
Скопировал ваш код, добавил библиотеку <Wire.h>, переменная sample типа int, читаю каждые 100мс, вывожу в сериал, вижу -1 при любом напряжении на входе ацп. Модуль и подключение проверенные.
#include <Wire.h>
// ADC ADS1115 settings
#define ADS1115_I2C_ADDRESS (0x48)
#define ADS1115_CONFIG_PGA_6_144V (0x0000) // +/-6.144V range = Gain 2/3
#define ADS1115_CONFIG_PGA_4_096V (0x0200) // +/-4.096V range = Gain 1
#define ADS1115_CONFIG_PGA_2_048V (0x0400) // +/-2.048V range = Gain 2 (default)
#define ADS1115_CONFIG_PGA_1_024V (0x0600) // +/-1.024V range = Gain 4
#define ADS1115_CONFIG_PGA_0_512V (0x0800) // +/-0.512V range = Gain 8
#define ADS1115_CONFIG_PGA_0_256V (0x0A00) // +/-0.256V range = Gain 16
#define ADS1115_CONFIG_DR_8SPS (0x0000) // 8 samples per second
#define ADS1115_CONFIG_DR_16SPS (0x0020) // 16 samples per second
#define ADS1115_CONFIG_DR_32SPS (0x0040) // 32 samples per second
#define ADS1115_CONFIG_DR_64SPS (0x0060) // 64 samples per second
#define ADS1115_CONFIG_DR_128SPS (0x0080) // 128 samples per second (default)
#define ADS1115_CONFIG_DR_250SPS (0x00A0) // 250 samples per second
#define ADS1115_CONFIG_DR_475SPS (0x00C0) // 475 samples per second
#define ADS1115_CONFIG_DR_860SPS (0x00E0) // 860 samples per second
#define ADS1115_CONFIG_MUX_DIFF_0_1 (0x0000) // Differential P[ositive] = AIN0, N[egative] = AIN1 (default)
#define ADS1115_REG_CONVERT (0x00)
#define ADS1115_REG_CONFIG (0x01)
#define ADS1115_CONFIG_CQUE_NONE (0x0003) // Disable the comparator and put ALERT/RDY in high state (default)
#define ADS1115_CONFIG_CLAT_NONLAT (0x0000) // Non-latching comparator (default)
#define ADS1115_CONFIG_CPOL_ACTVLOW (0x0000) // ALERT/RDY pin is low when active (default)
#define ADS1115_CONFIG_CMODE_TRAD (0x0000) // Traditional comparator with hysteresis (default)
#define ADS1115_CONFIG_MODE_CONTINUOUS (0x0000) // Continuous conversion mode
int sample = 0;
void setup() {
Serial.begin(115200);
delay(100);
}
void loop() {
Wire.beginTransmission(ADS1115_I2C_ADDRESS);
Wire.write(ADS1115_REG_CONVERT);
Wire.endTransmission();
Wire.requestFrom(ADS1115_I2C_ADDRESS, 2);
sample = (Wire.read() << 8) | Wire.read();
Serial.println(sample);
delay(100);
}
А Wire.begin кто будет делать? И чуть выше постом инициализация МС была приведена - без нее наврядли вам будет диффрежим, усиление и безостановочная конвертация.
Снова здравствуйте, код из постов выше работает отлично, еще раз спасибо sadman41. Теперь возник вопрос: как считывать показания поочередно с обоих диф входов? По возможности одномоментно или максимально к этому приближено.
Tolik4 - для тех, кто не хочет копаться в регистрах - у ads1115 сущестувует готовая ардуино библиотека, где уровень сложности пригоден для младших школьников...
С нее и начал, но там нет управления с помощью Conversion Ready Pin, настроек скорости и непрерывного преобразования. Я бы и не прочь разобраться с регистрами и не надоедать людям на форумах, но из даташита понять как происходит управление АЦП по I2C сложновато, а статьи с разбором подобного случая для чайников не нашел( Буду признателен ссылке на нечто подобное, если знаете где почитать о таком.
У меня такой необходимости не возникало, поэтому могу только предположить (по функциональной схеме), что надо постоянно переключаться на разные пары входов и пропускать по паре семплов (на установленной частоте замеров) перед считыванием показаний. Т.е. в конфиг, что выше, переменно совать вот это и делать небольшой дилей:
Добрался до железок, попробовал, в итоге заработало. Только не 0x0003, а 0x3000 - подсмотрено в библиотеке адафрут :) . Беда в том что между измерениями разных каналов приходится ставить делей пропорциональный частоте измерений. Для 860спс достаточно 2мс, а вот для 32спс задержка где-то между 50мс и 100мс(точно не подбирал, на 50 еще не работает, на 100 все ок), а это уже слишком много. Получается чтобы максимально приблизить во времени измерения двух разных датчиков самым верным решением будет поставить 2 АЦП, по одному для каждого датчика и опрашивать их подряд без изменения конфига. Или может есть еще какие-то варианты?
Варианты в каком разрезе? Для оцифровки двух каналов одновременно нужны два АЦП - чудес в мире Ардуины не происходит. Может и спаренные выпускают - я не интересовался.
И не 15битных к тому же( Делал на ней примерно то же, но для динамических процессов. Благо скорость АЦП позволяет и памяти под массив измерений не в пример больше ардуины.
#include <Wire.h>
#define ADS1015_I2C_ADDRESS (0x48) //адрес ads1015
#define ADS1015_REG_CONVERT (0x00)
#define ADS1015_REG_CONFIG (0x01)
byte b1,b2; //для конфигурирования АЦП и для чтения данных из АЦП
uint32_t i = 0; // Cчетчик
uint16_t val = 0;
//-------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
config_ads105(); // Конфигурирование и запуск преобразования ads1015
get_config(); // Прочитать конфиг биты и вывести на экран
Wire.begin(); // begin I2C
}
//--------------------------------------------------------------------------------
void loop() {
Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра преобразования
Wire.write(ADS1015_REG_CONVERT); // указал в записан 0 т.е. регистр преобразования
Wire.endTransmission();
Wire.requestFrom(ADS1015_I2C_ADDRESS, 2); // читаем из АЦП два байта
val = ((Wire.read()<< 8 )| Wire.read()) >> 4; // собираем два байта в кучу в переменную int val
delay(1);
//Shift 12-bit results right 4 bits for the ADS1015,
// making sure we keep the sign bit intact
if (val > 0x07FF)
{
// negative number - extend the sign to 16th bit
val |= 0xF000;
}
}
//-------------------------------------------------------------------------------
void config_ads105(){ // Конфигурирование и запуск преобразования ads1015
Wire.beginTransmission(ADS1015_I2C_ADDRESS); //конфигурируем АЦП записью трех байт
Wire.write(ADS1015_REG_CONFIG); // Указатель регистра
Wire.write(0b10001010); // биты с 15 по 8 конфигурации
Wire.write(0b11000011); // биты с 7 по 0 конфигурации
Wire.endTransmission();
delay(1);
}
//-------------------------------------------------------------------------------
void get_voltage(){ // Прочитать регистр преобразования, пересчитать в напряжение
Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра преобразования
Wire.write(ADS1015_REG_CONVERT); // указал в записан 0 т.е. регистр преобразования
Wire.endTransmission();
Wire.requestFrom(ADS1015_I2C_ADDRESS, 2); // читаем из АЦП два байта
val = ((Wire.read()<< 8 )| Wire.read())>> 4; // собираем два байта в кучу в переменную int val
delay(1);
//Shift 12-bit results right 4 bits for the ADS1015,
// making sure we keep the sign bit intact
if (val > 0x07FF)
{
// negative number - extend the sign to 16th bit
val |= 0xF000;
}
Serial.println((int16_t)val );
}
//--------------------------------------------------------------------------------
void get_config(){ // взять все биты конфига и вывести на экран
Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра конфига
Wire.write(ADS1015_REG_CONFIG ); // pointer записан 1 т.е. регистр config
Wire.endTransmission();
Wire.requestFrom(ADS1015_I2C_ADDRESS, 2); // читаем из АЦП два байта
b1 = Wire.read(); //
b2 = Wire.read(); //
delay(1);
// Wire.endTransmission();
Serial.print("Config = "); //выводим на экран все биты конфига
Serial.print(b1,BIN); Serial.print("_"); Serial.println(b2,BIN);
совсем сообралжку выключил? - вывод каждого символа в Сериал занимает 1 миллисекунду и именно вывод данных в сериал у тебя отнимает 99% времени.
И совершенно неудивительно, что это время растет - ведь в начале нужно вывести строчку что-то типа "1 12 22" (7 символов), а через тысячу измерений уже "1024 12565 46" - 13 символов. Если посмотреть твои логи - так и есть, в начале измерения идут через 5-6 мс. а потом - через 12-15.
И от скорости ADC это вовсе не зависит, догадайся сам почему :)
ты, похоже., в корне не понимаешь, как оно работает. ADC работает асинхронно. Число измерений в секунду - вот эти твои "128 samples per second" или 860... - показывает только, с какой скоростью ADC делает измерения и кладет их в свой внутренний буфер. А с какой скоростью ты будешь их оттуда забирать - зависит только от твоего кода. Причем процессы никак не связаны между собой. Ты можешь забирать данные как реже частоты ADC - в этом случае ты будешь брать, скажем, только каждое третье измерение, так и чаще - в таком случае ты будешь получать по несколько раз одно и то же число.
В обоих случаях скорость получения 1000 значений ВООБЩЕ НЕ СВЯЗАНА со скоростью работы ADC - и определяется только временем исполнения твоего кода в loop() Именно это ты и наблюдаешь - у тебя время одного цикла порядка 1.5мс, из которых 1мс - это delay(1), а остальное - время запроса и получения данных по I2C и прочие накладные расходы
Например, вот так:
Например, вот так:
а для среды разработки arduino ide как это будет выглядеть?
Это из скетча Arduino и вытащено.
Отдельной команды/регистра для скорости оцифровки нет. Поэтому или пишете каждый раз в конфигурационный регистр сразу все параметры работы чипа, либо читаете их оттуда, исправляете и пишете заново. Только вот не помню - чип дает конфиг читать или нет...
Уровня вашей подготовки я не знаю, поэтому точной рекомендации не могу дать.
sadman41 а где дефайны к этому лежат?
sadman41 а где дефайны к этому лежат?
Да там же, в моем скетче :))
А чтение так:
Здравствуйте, а можно пожалуйста простой скетч целиком: дифференциальное чтение 0_1, Continuous conversion mode, с возможностью смены усиления? Нашел такой же по сути вопрос на форуме адафрут, но на аглицком разобраться тяжеловато( https://forums.adafruit.com/viewtopic.php?f=22&t=76452
Скопировал ваш код, добавил библиотеку <Wire.h>, переменная sample типа int, читаю каждые 100мс, вывожу в сериал, вижу -1 при любом напряжении на входе ацп. Модуль и подключение проверенные.
А Wire.begin кто будет делать? И чуть выше постом инициализация МС была приведена - без нее наврядли вам будет диффрежим, усиление и безостановочная конвертация.
Если вы хотите получить готовый скетч, то это вам в "Ищу исполнителя" надо обращаться.
И вправду, тупняк имеет место быть) Циферки забегали, буду разбираться дальше, спасибо большое!
Снова здравствуйте, код из постов выше работает отлично, еще раз спасибо sadman41. Теперь возник вопрос: как считывать показания поочередно с обоих диф входов? По возможности одномоментно или максимально к этому приближено.
Tolik4 - для тех, кто не хочет копаться в регистрах - у ads1115 сущестувует готовая ардуино библиотека, где уровень сложности пригоден для младших школьников...
С нее и начал, но там нет управления с помощью Conversion Ready Pin, настроек скорости и непрерывного преобразования. Я бы и не прочь разобраться с регистрами и не надоедать людям на форумах, но из даташита понять как происходит управление АЦП по I2C сложновато, а статьи с разбором подобного случая для чайников не нашел( Буду признателен ссылке на нечто подобное, если знаете где почитать о таком.
У меня такой необходимости не возникало, поэтому могу только предположить (по функциональной схеме), что надо постоянно переключаться на разные пары входов и пропускать по паре семплов (на установленной частоте замеров) перед считыванием показаний. Т.е. в конфиг, что выше, переменно совать вот это и делать небольшой дилей:
Т.е. в цикле перед каждым измерением нужно передавать конфиг полностью? Или можно передатьтолько настройки мультиплексора?
Так, как три бита Вам наврядли удастся передать, то придётся полностью.
Ясно, спасибо, буду пробовать
Добрался до железок, попробовал, в итоге заработало. Только не 0x0003, а 0x3000 - подсмотрено в библиотеке адафрут :) . Беда в том что между измерениями разных каналов приходится ставить делей пропорциональный частоте измерений. Для 860спс достаточно 2мс, а вот для 32спс задержка где-то между 50мс и 100мс(точно не подбирал, на 50 еще не работает, на 100 все ок), а это уже слишком много. Получается чтобы максимально приблизить во времени измерения двух разных датчиков самым верным решением будет поставить 2 АЦП, по одному для каждого датчика и опрашивать их подряд без изменения конфига. Или может есть еще какие-то варианты?
Варианты в каком разрезе? Для оцифровки двух каналов одновременно нужны два АЦП - чудес в мире Ардуины не происходит. Может и спаренные выпускают - я не интересовался.
У блюпилл за 100руб как раз 2 АЦП, но нет дифф-входов.
И не 15битных к тому же( Делал на ней примерно то же, но для динамических процессов. Благо скорость АЦП позволяет и памяти под массив измерений не в пример больше ардуины.
Доброе вермя суток всем.
Странное поведение ads1015, устанавливаю конфигурационный регистр на разные частоты снятия сигнала,
сначвла снимает быстро, а затем к измерению с номером 3072 время в мс 4783 (т.е 5 секунд) и это для любого значения
23:41:25.143 -> 3072 4783 -9
Вот к примеру, сначала снимает данные нормально, а далее увеличивается интервал между измерениями.
КАК СНИМАТЬ ДАННЫЕ НА 860 samples per second ?
475 samples per second
Config = 1010_11000011
22:18:44.133 -> 0 5 15
22:18:44.166 -> 1 8 -105
22:18:44.166 -> 2 12 -32
22:18:44.166 -> 3 15 8
22:18:44.166 -> 4 18 180
22:18:44.199 -> 5 21 32
22:18:44.199 -> 6 24 15
22:18:44.199 -> 7 30 -45
22:18:44.233 -> 8 40 39
22:18:44.233 -> 9 50 -48
22:18:44.233 -> 10 61 42
22:18:44.266 -> 11 71 -40
22:18:44.266 -> 12 82 30
22:18:44.266 -> 13 93 -27
#include <Wire.h>
#define ADS1015_I2C_ADDRESS (0x48) //адрес ads1015
#define ADS1015_REG_CONVERT (0x00)
#define ADS1015_REG_CONFIG (0x01)
byte b1,b2; //для конфигурирования АЦП и для чтения данных из АЦП
uint32_t i = 0; // Cчетчик
uint16_t val = 0;
//-------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
config_ads105(); // Конфигурирование и запуск преобразования ads1015
get_config(); // Прочитать конфиг биты и вывести на экран
Wire.begin(); // begin I2C
}
//--------------------------------------------------------------------------------
void loop() {
Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра преобразования
Wire.write(ADS1015_REG_CONVERT); // указал в записан 0 т.е. регистр преобразования
Wire.endTransmission();
Wire.requestFrom(ADS1015_I2C_ADDRESS, 2); // читаем из АЦП два байта
val = ((Wire.read()<< 8 )| Wire.read()) >> 4; // собираем два байта в кучу в переменную int val
delay(1);
//Shift 12-bit results right 4 bits for the ADS1015,
// making sure we keep the sign bit intact
if (val > 0x07FF)
{
// negative number - extend the sign to 16th bit
val |= 0xF000;
}
// Wire.endTransmission();
Serial.print(i++); Serial.print(" "); Serial.print(millis()); Serial.print(" "); Serial.println((int16_t)val);
}
//-------------------------------------------------------------------------------
void config_ads105(){ // Конфигурирование и запуск преобразования ads1015
Wire.beginTransmission(ADS1015_I2C_ADDRESS); //конфигурируем АЦП записью трех байт
Wire.write(ADS1015_REG_CONFIG); // Указатель регистра
Wire.write(0b10001010); // биты с 15 по 8 конфигурации
Wire.write(0b11000011); // биты с 7 по 0 конфигурации
Wire.endTransmission();
delay(1);
}
//-------------------------------------------------------------------------------
void get_voltage(){ // Прочитать регистр преобразования, пересчитать в напряжение
Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра преобразования
Wire.write(ADS1015_REG_CONVERT); // указал в записан 0 т.е. регистр преобразования
Wire.endTransmission();
Wire.requestFrom(ADS1015_I2C_ADDRESS, 2); // читаем из АЦП два байта
val = ((Wire.read()<< 8 )| Wire.read())>> 4; // собираем два байта в кучу в переменную int val
delay(1);
//Shift 12-bit results right 4 bits for the ADS1015,
// making sure we keep the sign bit intact
if (val > 0x07FF)
{
// negative number - extend the sign to 16th bit
val |= 0xF000;
}
Serial.println((int16_t)val );
}
//--------------------------------------------------------------------------------
void get_config(){ // взять все биты конфига и вывести на экран
Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра конфига
Wire.write(ADS1015_REG_CONFIG ); // pointer записан 1 т.е. регистр config
Wire.endTransmission();
Wire.requestFrom(ADS1015_I2C_ADDRESS, 2); // читаем из АЦП два байта
b1 = Wire.read(); //
b2 = Wire.read(); //
delay(1);
// Wire.endTransmission();
Serial.print("Config = "); //выводим на экран все биты конфига
Serial.print(b1,BIN); Serial.print("_"); Serial.println(b2,BIN);
}
475 samples per second
Config = 1010_11000011
22:18:44.133 -> 0 5 15
22:18:44.166 -> 1 8 -105
22:18:44.166 -> 2 12 -32
22:18:44.166 -> 3 15 8
22:18:44.166 -> 4 18 180
22:18:44.199 -> 5 21 32
22:18:44.199 -> 6 24 15
22:18:44.199 -> 7 30 -45
22:18:44.233 -> 8 40 39
22:18:44.233 -> 9 50 -48
22:18:44.233 -> 10 61 42
22:18:44.266 -> 11 71 -40
22:18:44.266 -> 12 82 30
22:18:44.266 -> 13 93 -27
22:18:44.299 -> 14 104 22
22:18:44.299 -> 15 115 11
22:18:44.299 -> 16 128 -19
22:18:44.332 -> 17 140 59
22:18:44.332 -> 18 151 -40
22:18:44.332 -> 19 163 25
22:18:44.365 -> 20 175 0
22:18:44.365 -> 21 185 14
22:18:44.365 -> 22 197 73
22:18:44.398 -> 23 208 -108
22:18:44.398 -> 24 222 36
22:18:44.398 -> 25 233 -23
22:18:44.432 -> 26 245 14
22:18:44.432 -> 27 258 72
22:18:44.432 -> 28 269 -113
22:18:44.465 -> 29 282 32
22:18:44.465 -> 30 293 -19
22:18:44.498 -> 31 306 5
22:18:44.498 -> 32 316 47
22:18:44.498 -> 33 328 -28
22:18:44.531 -> 34 340 49
22:18:44.531 -> 35 352 -39
22:18:44.531 -> 36 364 20
22:18:44.564 -> 37 375 5
22:18:44.564 -> 38 386 3
22:18:44.564 -> 39 397 61
22:18:44.598 -> 40 408 -33
22:18:44.598 -> 41 420 46
22:18:44.598 -> 42 432 -36
22:18:44.631 -> 43 444 21
22:18:44.631 -> 44 456 2
22:18:44.631 -> 45 466 8
22:18:44.664 -> 46 477 66
22:18:44.664 -> 47 488 -23
22:18:44.664 -> 48 500 45
22:18:44.697 -> 49 512 -34
22:18:44.697 -> 50 525 23
22:18:44.730 -> 51 536 11
22:18:44.730 -> 52 547 -14
22:18:44.730 -> 53 560 63
22:18:44.763 -> 54 571 -44
22:18:44.763 -> 55 583 24
22:18:44.763 -> 56 595 0
22:18:44.797 -> 57 606 15
22:18:44.797 -> 58 617 71
22:18:44.797 -> 59 628 -99
22:18:44.830 -> 60 641 40
22:18:44.830 -> 61 652 -35
22:18:44.830 -> 62 665 16
22:18:44.863 -> 63 676 37
22:18:44.863 -> 64 688 -22
22:18:44.863 -> 65 700 51
22:18:44.896 -> 66 711 -39
22:18:44.896 -> 67 724 26
22:18:44.929 -> 68 736 0
22:18:44.929 -> 69 746 13
22:18:44.929 -> 70 757 82
22:18:44.962 -> 71 769 -109
22:18:44.962 -> 72 782 32
22:18:44.962 -> 73 794 -25
22:18:44.996 -> 74 806 0
22:18:44.996 -> 75 817 53
22:18:44.996 -> 76 828 -41
22:18:45.029 -> 77 840 45
22:18:45.029 -> 78 851 -35
22:18:45.029 -> 79 865 23
22:18:45.062 -> 80 876 9
22:18:45.062 -> 81 886 7
22:18:45.062 -> 82 897 63
22:18:45.095 -> 83 908 -20
22:18:45.095 -> 84 921 43
22:18:45.095 -> 85 932 -37
22:18:45.128 -> 86 945 25
22:18:45.128 -> 87 956 19
22:18:45.128 -> 88 967 -13
22:18:45.161 -> 89 979 62
22:18:45.161 -> 90 992 -47
22:18:45.195 -> 91 1004 28
22:18:45.195 -> 92 1016 31
22:18:45.195 -> 93 1029 -109
22:18:45.228 -> 94 1043 29
22:18:45.228 -> 95 1056 -3
22:18:45.261 -> 96 1069 -57
22:18:45.261 -> 97 1082 38
22:18:45.261 -> 98 1094 -25
22:18:45.294 -> 99 1107 -20
22:18:45.294 -> 100 1123 44
Ну заканчивается вот этим
23:39:30.391 -> 2000 29696 1
128 samples per second
23:43:37.023 -> Config = 1010_1000011
23:43:37.023 -> 0 4 -4
23:43:38.614 -> 1024 1596 0
23:43:40.206 -> 2048 3189 5
23:43:41.797 -> 3072 4782 -2
860 samples per second
23:41:20.378 -> Config = 1010_11100011
23:41:20.378 -> 0 4 -6
23:41:21.977 -> 1024 1596 0
23:41:23.543 -> 2048 3189 -33
23:41:25.143 -> 3072 4783 -9
совсем сообралжку выключил? - вывод каждого символа в Сериал занимает 1 миллисекунду и именно вывод данных в сериал у тебя отнимает 99% времени.
И совершенно неудивительно, что это время растет - ведь в начале нужно вывести строчку что-то типа "1 12 22" (7 символов), а через тысячу измерений уже "1024 12565 46" - 13 символов. Если посмотреть твои логи - так и есть, в начале измерения идут через 5-6 мс. а потом - через 12-15.
И от скорости ADC это вовсе не зависит, догадайся сам почему :)
Ну а вот вывожу через 1024 измерения?
if( i>>10)<<10==i){
Serial.print(i); Serial.print(" "); Serial.print(millis()); Serial.print(" "); Serial.println((int16_t)val);
}
i++;
860 samples per second
23:41:20.378 -> Config = 1010_11100011
23:41:20.378 -> 0 4 -6
23:41:21.977 -> 1024 1596 0
23:41:23.543 -> 2048 3189 -33
23:41:25.143 -> 3072 4783 -9
ты, похоже., в корне не понимаешь, как оно работает. ADC работает асинхронно. Число измерений в секунду - вот эти твои "128 samples per second" или 860... - показывает только, с какой скоростью ADC делает измерения и кладет их в свой внутренний буфер. А с какой скоростью ты будешь их оттуда забирать - зависит только от твоего кода. Причем процессы никак не связаны между собой. Ты можешь забирать данные как реже частоты ADC - в этом случае ты будешь брать, скажем, только каждое третье измерение, так и чаще - в таком случае ты будешь получать по несколько раз одно и то же число.
В обоих случаях скорость получения 1000 значений ВООБЩЕ НЕ СВЯЗАНА со скоростью работы ADC - и определяется только временем исполнения твоего кода в loop() Именно это ты и наблюдаешь - у тебя время одного цикла порядка 1.5мс, из которых 1мс - это delay(1), а остальное - время запроса и получения данных по I2C и прочие накладные расходы