Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Пн фев 13, 2023 13:43:56
Имеется ESP с прошивкой arduino, необходимо организовать опрос нескольких АЦП по I2c.
В сети полно примеров и все работает, пока на шине только один АЦП, стоит подключить еще, вместо данных мусор.
Возможно, кто то разобрался?
Типичный пример из сети :
#include "Wire.h"
int PCF8591=0x48; // I2C bus address
byte ana0, ana1, ana2, ana3;
void setup()
{
Wire.pins(0,2);// just to make sure
Wire.begin(0,2);// the SDA and SCL
}
void loop()
{
Wire.beginTransmission(PCF8591); // wake up PCF8591
Wire.write(0x04); // control byte: reads ADC0 then auto-increment
Wire.endTransmission(); // end tranmission
Wire.requestFrom(PCF8591, 5);
ana0=Wire.read();// throw this one away
ana0=Wire.read();
ana1=Wire.read();
ana2=Wire.read();
ana3=Wire.read();
}
Пн фев 13, 2023 14:02:41
необходимо организовать опрос нескольких АЦП по I2c.
Для подключения нескольких I2C устройств к одной шине существуют специальные хабы. Например PCA9516APW.
Пн фев 13, 2023 14:04:58
Беглый просмотр документации показал, что у них 3 ножки настройки адреса, то есть можно 8 АЦП подключить на шину (выставив, разумеется, на разных устройствах разные адреса).
Пн фев 13, 2023 14:08:36
Мне казалось что I2c сама по себе предназначена для подключения нескольких устройств. Или нет ?
Безусловно, адреса установлены разные.
У меня нет вопросов подцепить все это какому-нибудь PICу.
Но надо вот с ардуинкой на esp, так как конструктив уже собран.
Пн фев 13, 2023 14:24:01
А в коде где заданы разные адреса?
У вас в коде только одна строчка int PCF8591=0x48; // I2C bus address, а их должно быть по количеству АЦП (или массив), ну и потом, понятно, в главном цикле при вызове методов beginTransmission и requestFrom надо передавать по очереди адреса всех АЦП.
Проще, наверно, загнать их в массив и в loop инкрементировать номер текущего АЦП (по модулю их количества).
Пн фев 13, 2023 14:28:16
Нигде. Просто подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.
Ничего не замыкает. Проверено. Засада либо в коде, либо в библиотеке
У второго устройства другой адрес
Пн фев 13, 2023 14:36:55
А, теперь понял, извините за глупые вопросы тогда
Тогда вообще странно, второй вообще не должен мешать. Пробовали скорость уменьшить? Или (если АЦП в виде собранных модулей) у второго убрать резисторы подтяжки SCL/SDA
Пн фев 13, 2023 14:46:34
Скорость пробовал. Нет результата.
Чипы голые на плате, подтяжка верная.
Подозреваю что то там не корректно с адресацией в библиотеке или я не разобрался как ее правильно применять, не часто использую ардуинку.
Вт фев 14, 2023 05:48:38
подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.
Проверьте работоспособность каждого АЦП с контроллером по отдельности.
Вт фев 14, 2023 06:00:36
По отдельности все корректно, по любому из адресов
Чт фев 23, 2023 10:57:38
Так и не понял, что не так, но по одному байту читает корректно. Получилась вот такая конструкция.
- Код:
Wire.beginTransmission(DIVACE); // wake up PCF8591
// control byte: где то прочитал, что если авто инскримент, то обязательно включить выход аналоговый
Wire.write(0x44);
Wire.write(0x00);
Wire.endTransmission(); // end tranmission
Wire.requestFrom(DIVACE, 1); // тут предыдущее измеренное, оно нам не надо. Особенности микросхемы
AV[0]=Wire.read();
Wire.requestFrom(DIVACE, 1); // принять 1 байт из устройства
AV[0] = Wire.read();
Wire.requestFrom(DIVACE, 1); // принять 1 байт из устройства
AV[1] = Wire.read();
Wire.requestFrom(DIVACE, 1); // принять 1 байт из устройства
AV[2] = Wire.read();
Wire.requestFrom(DIVACE, 1); // принять 1 байт из устройства
AV[3] = Wire.read();
Возможно, комуто пригодится
Чт фев 23, 2023 11:26:12
Ваше устройство имеет напр. 4 шт. PCF8591 ( макс. 8 ). Аппаратно, на плате, с выводами A0, A1, A2 каждому чипу назначаете уникальный адрес.
Напр. будет:
- Код:
#define PCF8591_0 0x48
#define PCF8591_1 0x49
#define PCF8591_2 0x4A
#define PCF8591_3 0x4B
Управляйте ИС с кодом как одного чипа, по одному уникальному адресу на чип.
PS функция Wire.pins(0,2); нет. Вероятно автор использовал собственное программное решение для I2C.
Последний раз редактировалось
veso74 Чт фев 23, 2023 11:41:08, всего редактировалось 2 раз(а).
Чт фев 23, 2023 11:28:48
Я бы все же рекомендовал прочитать всю ветку, чтобы понять, в чем же все таки был вопрос:)
Пины I2c были заданы ранее.
Чт фев 23, 2023 11:36:17
Повторю вопрос коллеги:
- Код:
А в коде где заданы разные адреса?
---
Как вы это сделали? Код?
- Код:
Пины I2c были заданы ранее.
А можете подключить ВСЕ микросхемы к одной шине, если они имеют разные адреса.
Запускайте хотя бы сканер I2C, увидите конфликт или работу.
Последний раз редактировалось
veso74 Чт фев 23, 2023 11:40:20, всего редактировалось 4 раз(а).
Чт фев 23, 2023 11:37:06
Не совсем понятен итог.
Решение проблемы было найдено или нет?
Чт фев 23, 2023 11:41:35
Извините, не понял, в чем был совет
Резюмирую:
В исходном примере библиотеки после команды чтения с указанием количества считаных байт, они все корректно считываются.
При подключении дополнительных устройств(с другими адресами), корректно считывается только один байт.
Чт фев 23, 2023 11:45:25
А зачем вам 1 байт? Какая может быть польза от 1 байта инфы?
Чт фев 23, 2023 11:47:30
Если не устанавливали разные адреса, это нормально: задан первый байт, все устройства отвечают вместе (с разной информацией), и возникает конфликт шины.
Разделите действия каждого по отдельности. I2C может управлять, например. 128 устройств по 2 проводам, если они имеют уникальный адрес.
А как - в сообщениях, советы выше.
Дайте схему (какая микросхема по какому адресу и пину) и полный код для инициализации чипов.
Чт фев 23, 2023 11:53:48
Решение было найдено и проверено. Соберу все в кучку, выложу
Измеритель мощности, 16 каналов с передачей на сервер.
Задачи получить высокую точность не стояло, поэтому дешевые АЦП
Прототип, плата категории "на коленке"
Добавлено after 2 minutes 39 seconds:veso74 писал(а):Если не устанавливали разные адреса, это нормально: задан первый байт, все устройства отвечают вместе (с разной информацией), и возникает конфликт шины.
Эх, что же вы раньше то писать не стали
Чт фев 23, 2023 11:57:35
Фото не очень помогает, куда подключены пины 5, 6, 7 на каждой PCF8591? (GND/VDD)
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.