Нумерация аналоговых входов
Настройте блок на получение значения только! одного канала, другие выключите - предполагаю(судя по даташиту и библиотеке), что получите правильные данные. Иначе какая-то дичь...
мне нужно получать данные с 16 каналов (4 ADS)
есть данные https://datasheet.lcsc.com/lcsc/2302211 ... 359372.pdfivansidor012 писал(а): ↑02.09.2023{, 19:19}
если почитать отзывы, то там фуфло перемаркированное:
Модуль получен упакованным в запаянном электростатическом пакете. Но на плате вместо ADS1115 (официальная маркировка BOGI) установлен какой-то китайский чип с маркировкой ADX111A. В сети о нем данных нет! Подключил этот модуль к тестовой Ардуине - вроде показывает правильно при работе с библиотекой Adafruit_ADS1X15 - задействованы все 16 бит. Отмечен в 2 раза больший шум по сравнению с оригиналом. Походу китайцы и ADS1115 научились как-то импортозамещать
Речь шла об эксперименте.
Как я и предполагал, проблема в библиотеке.
Еще одной полезной функцией компаратора является оповещение по окончании преобразования, для включения которого необходимо установить старший бит регистра Hi_thresh в 1, а старший бит регистра Lo_thresh в 0. В этом случае бит активного уровня COMP_POL, а также бит управления компаратором COMP_QUE продолжают действовать, биты COMP_MODE и COMP_LAT не влияют на выход компаратора.
Если функция оповещения включена, то в режиме непрерывного преобразования, после окончания каждого измерения на выходе компаратора появляется импульс длительностью 8 мкс. В режиме одиночного преобразования на выходе компаратора устанавливается низкий логический уровень по окончании преобразования, если бит COMP_POL установлен в 0. Тем самым эту функцию удобно использовать в качестве прерывания для управляющего устройства, чтобы не опрашивать постоянно бит OS, а сразу считывать результат преобразования.
С одним каналом будет ок.
Для одного канала я бы использовал АЦП ЕСП32Александр писал(а): ↑02.09.2023{, 21:58}Вариантов несколько, но под Ваши требования подходит несколько - работа на 400 и опрос регистра готовности или использование выхода 1115:Еще одной полезной функцией компаратора является оповещение по окончании преобразования, для включения которого необходимо установить старший бит регистра Hi_thresh в 1, а старший бит регистра Lo_thresh в 0. В этом случае бит активного уровня COMP_POL, а также бит управления компаратором COMP_QUE продолжают действовать, биты COMP_MODE и COMP_LAT не влияют на выход компаратора.
Если функция оповещения включена, то в режиме непрерывного преобразования, после окончания каждого измерения на выходе компаратора появляется импульс длительностью 8 мкс. В режиме одиночного преобразования на выходе компаратора устанавливается низкий логический уровень по окончании преобразования, если бит COMP_POL установлен в 0. Тем самым эту функцию удобно использовать в качестве прерывания для управляющего устройства, чтобы не опрашивать постоянно бит OS, а сразу считывать результат преобразования.С одним каналом будет ок.
Блок с использованием вывода ADS ALERT/RDY должен быть примерно таким:
Примем алгоритм следующего формата для четырёх мс -
Немного было времени на даче, код никак не тестировался, вообще, возможны недочёты!
Код: Выделить всё
#include <Wire.h>
uint16_t config_1115 = 0xC3E3; // первичная конфигурация, AI-0, 4,096 В
void setup(){
Wire.begin();
for(int16_t a=0; a<4; a++){ // Первичная инициализация, не обязательна.
Wire.beginTransmission(0x48 | a);
Wire.write(0x01);
Wire.write((uint8_t)(config_1115 >> 8));
Wire.write((uint8_t)(config_1115 & 0xFF));
Wire.endTransmission();
}
}
void loop(){
int16_t data_array[16]; // данные без конверсии, чистые данные АЦП, 1 = 0,000125v,
// конвертировать во float (real) перед непосредственным использованием
int16_t adr1115;
int16_t chanel1115;
// цикл для 100k
for (int16_t i=0; i<16; i++){
adr1115 = 0x48 | (i & 0x03); // готовим адрес
// читаем данные из предыдущего запроса
Wire.beginTransmission(adr1115);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(adr1115, 2);
data_array[i] = (Wire.read() << 8) | Wire.read(); // данные без конверсии!!!
// даём команду на следующее преобразование, изменив номер канала в конф. регистре
chanel1115 = (i>>2 + 1) & 0x03;
config_1115 = 0xC3E3 | chanel1115 << 12;
Wire.beginTransmission(adr1115);
Wire.write(0x01);
Wire.write((uint8_t)(config_1115 >> 8));
Wire.write((uint8_t)(config_1115 & 0xFF));
Wire.endTransmission();
}
}
Для одной ADS(4 канала-А0, А1,А2,А3), адрес 48. Что бы проверить код визуально
Код: Выделить всё
#include <Wire.h>
uint16_t config_1115 = 0xC3E3; // первичная конфигурация, AI-0, 4,096 В
void setup(){
Wire.begin();
for(int16_t a=0; a<4; a++){ // Первичная инициализация, не обязательна.
Wire.beginTransmission(0x48 | a);
Wire.write(0x01);
Wire.write((uint8_t)(config_1115 >> 8));
Wire.write((uint8_t)(config_1115 & 0xFF));
Wire.endTransmission();
}
Serial.begin(38400);
}
void loop(){
int16_t data_array[16]; // данные без конверсии, чистые данные АЦП
int16_t adr1115;
int16_t chanel1115;
// цикл для 100k
for (int16_t i=0; i<16; i++){
adr1115 = 0x48 | (i & 0x03); // готовим адрес
// читаем данные из предыдущего запроса
Wire.beginTransmission(adr1115);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(adr1115, 2);
data_array[i] = (Wire.read() << 8) | Wire.read(); // данные без конверсии!!!
// даём команду на следующее преобразование, изменив номер канала в конф. регистре
chanel1115 = (i>>2 + 1) & 0x03;
config_1115 = 0xC3E3 | chanel1115 << 12;
Wire.beginTransmission(adr1115);
Wire.write(0x01);
Wire.write((uint8_t)(config_1115 >> 8));
Wire.write((uint8_t)(config_1115 & 0xFF));
Wire.endTransmission();
}
for( int16_t s=0; s<4; s++){
Serial.println("Chanel " + String(s*4) + " = " + String(float(data_array[s*4] * 0,000125),6)); // *4 для данных из 1 мс
}
// delay(500);
}