Соединение i2c для MCP4725 (Dac) с Esp8266 wemos d1 mini
------------ Этот вопрос был отредактирован ------------
примечание: ЦАП и АЦП — 12 бит
Моя проблема: я использую два ESP. Используя esp1, я считываю количество Adc переменного сигнала (ЭКГ) и отправляю его на esp2 с помощью UDP, и я его получаю. Теперь, используя такое же количество АЦП, я бы использовал MCP4725 для преобразования цифрового значения АЦП в аналоговое. Но я не знаю, как это сделать!
Вам снова нужна таблица поиска синуса, такая как пример библиотеки по умолчанию??!
Если да, то как это делается?!
Я написал следующий код прямо сейчас, что вы думаете? Объясните мне, если мой код ошибочен.
Я просто хочу, чтобы выход ЦАП был входом сигнала АЦП.
Код:
void loop () {
int noBytes = Udp.parsePacket();
String received_command = "";
if ( noBytes ) {
Udp.read(packetBuffer,noBytes);
for (int i=1;i<=noBytes;i++)
{
received_command += char(packetBuffer[i - 1]);
}
int dac_value ;
dac_value = received_command.toInt();
Serial.print("dac value: ");Serial.println(dac_value);
aPin = dac_value ;
if (!si.i2c_start((I2C_7BITADDR<<1)|I2C_WRITE)) {
Serial.println("I2C device busy");
return;
}
else{
Serial.println("i2c is worked");
}
for (byte i=1; i<noBytes; i++){
si.i2c_write(aPin);
si.i2c_rep_start((I2C_7BITADDR<<1)|I2C_READ);
si.i2c_stop();
delay(50);
}
}
}
Я использую #include <SlowSoftI2CMaster.h>
.
si: SlowSoftI2CMaster si = SlowSoftI2CMaster(4, 5, true);
Фото:
@navid, 👍-1
Обсуждение1 ответ
Хорошо, я объясню основные принципы и дам несколько советов. Это не будет касаться вашего кода, так как он не компилируется и не имеет для меня особого смысла.
Протокол I2C. Для соединения I2C всегда требуются 2 линии: SDA (по которой передаются данные) и SCL (где мастер выводит тактовый сигнал). Связь всегда запускается мастером с помощью СТАРТ УСЛОВИЯ. Затем он передает первый байт, состоящий из 7-битного адреса ведомого устройства и одного бита, показывающего, будет ли выполняться операция чтения или записи. Ведомое устройство, если оно есть с таким адресом, ответит Подтверждением. Мастер передаст свои данные и завершит передачу с условием остановки или начнет новую передачу с повторяющимся условием запуска.
Выберите библиотеку I2C. Вы используете библиотеку SlowSoftI2CMaster, поскольку она не зависит от архитектуры. Поскольку вы новичок, вам следует использовать библиотеку SlowSoftWire, которая похожа на
Wire
. библиотека обертки. Он дает вам тот же интерфейс, что и библиотекаWire
. Это хорошо для начинающих, так как скрывает часть сложности, а в большинстве примеров и руководств используется библиотекаWire
(поэтому часто можно скопировать структуру кода). Вам необходимо установить обе библиотеки (SlowSoftI2CMaster
иSlowSoftWire
) в папку с библиотеками, но вам нужно включить только библиотекуSlowSoftWire
. Пожалуйста, посмотрите на примеры, которые поставляются с этой библиотекой. Я буду ссылаться на эту библиотеку в следующих пунктах.Использование библиотеки
SlowSoftWire
: вы можете объявить и инициализировать библиотеку, как в ее примереsimpleSlowWire.ino
. Для передачи нового значения в DAC вы должны сначала использоватьbeginTransmission()
, чтобы настроить библиотеку для основной транзакции записи. Затем поместите байты данных в буфер библиотек с помощьюwrite()
. И, наконец, выполните передачу с помощьюendTransmission()
(это единственное место в этом процессе, где на шине происходит реальное действие I2C). Когда вы начинаете передачу с помощьюbeginTransmission()
, вы должны указать правильный адрес DAC. Это подразумевается без бита направления. Адрес MCP4725 состоит из кода устройства1100
, адресных контактов A1 и A2 и переменного адреса A0. Проводные контакты адреса, скорее всего, оба нулевые, если только производителю не было приказано запрограммировать его иначе (вы можете проверить адрес на примере сканера). Итак, если вы подключите A0 к земле, адрес будет0b1100000
. Если вы подключите A0 к 3,3 В, это будет0b1100001
. Бит направления будет обрабатываться библиотекой — вам не нужно об этом беспокоиться.
4.Протокол данных MCP: нельзя просто отправить значения из ADC в DAC. Кроме того, это специальный формат данных, который включает в себя командные биты для определения режима работы. Думаю, я уже описал, как в принципе строятся данные и довольно хорошо кодируется, в моем ответе на этот вопрос. Если есть что-то особенное, чего вы не понимаете, вы можете задать новый вопрос и сослаться на этот ответ в нем. Также я думаю, что вы должны использовать тип unsigned int
для dac_value
, так как значения из ADC и значения для DAC являются только положительными.
Пожалуйста, имейте в виду, что создание таких проектов требует некоторого времени, пока вы не поймете, что на самом деле там происходит. Если вы используете какой-либо чип, всегда необходимо читать техническое описание этого чипа. Я лично никогда не работал с MCP4725. Я только что прочитал даташит. Вся информация уже есть.
Отличное описание. Вы сказали, что преобразование «adc» в «аналоговый» не может быть легко выполнено, следует ли использовать «таблицу поиска» в качестве примера «adafruit»? Или нет? Так что «код», который я написал, неверен!, @navid
Я не знаю, какой пример adafruit вы имеете в виду. Пожалуйста, дайте ссылку. Я не вижу, где вам может понадобиться таблица поиска синусов, так как вы просто передаете сигнал от АЦП к ЦАП. ЦАП выдаст то, что прочитал АЦП. Таблица поиска синуса нужна только в том случае, если вы хотите сгенерировать синусоиду из esp., @chrisl
этот пример [ссылка](https://github.com/adafruit/Adafruit_MCP4725/blob/master/examples/sinewave/sinewave.ino), @navid
Я хочу **реконструировать** «выход ЦАП», используя «значение АЦП». . . . . . . ., @navid
Форма боковой волны Adc --> [ссылка](https://www.onlinebiologynotes.com/electrocardiogram-ecg-working-principle-normal-ecg-wave-application-of-ecg/), @navid
Чтобы просто воспроизвести аналоговый сигнал, вам не нужна таблица поиска., @chrisl
посмотрите этот пример: [ссылка](http://henrysbench.capnfatz.com/henrys-bench/arduino-output-devices/arduino-mcp4725-digital-to-analog-converter-tutorial/#Get_Your_MCP4725_I2C_Address), @navid
@navid И что я должен увидеть в этом примере? Также они используют Arduino (скорее всего, Uno), а не ESP, как вы. Так что, скорее всего, вы не можете просто использовать одну и ту же библиотеку, @chrisl
Ах, я не должен быть разочарован .., @navid
- Отправка и получение различных типов данных через I2C в Arduino
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- Варианты протокола для обмена данными между Arduino и ESP8266
- Отправка значений из arduino uno в wemos d1 r1
- Протокол I2C не работает должным образом
- ESP8266 не работает с MPU 6050 по проводной библиотеке и I2C
- Направление по компасу не изменяется линейно
- Как работают функции вне цикла void?
Если проблема в том, как подключить MCP4725, я недавно ответил на вопрос об этом, где объясняется, как правильно его подключить. Пожалуйста, прочитайте это. Также взгляните на библиотеку «Wire» и техническое описание MCP4725., @chrisl
жду ответа.., @navid