Соединение 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);

Фото:

, 👍-1

Обсуждение

Если проблема в том, как подключить MCP4725, я недавно ответил на вопрос об этом, где объясняется, как правильно его подключить. Пожалуйста, прочитайте это. Также взгляните на библиотеку «Wire» и техническое описание MCP4725., @chrisl

жду ответа.., @navid


1 ответ


0

Хорошо, я объясню основные принципы и дам несколько советов. Это не будет касаться вашего кода, так как он не компилируется и не имеет для меня особого смысла.

  1. Протокол I2C. Для соединения I2C всегда требуются 2 линии: SDA (по которой передаются данные) и SCL (где мастер выводит тактовый сигнал). Связь всегда запускается мастером с помощью СТАРТ УСЛОВИЯ. Затем он передает первый байт, состоящий из 7-битного адреса ведомого устройства и одного бита, показывающего, будет ли выполняться операция чтения или записи. Ведомое устройство, если оно есть с таким адресом, ответит Подтверждением. Мастер передаст свои данные и завершит передачу с условием остановки или начнет новую передачу с повторяющимся условием запуска.

  2. Выберите библиотеку I2C. Вы используете библиотеку SlowSoftI2CMaster, поскольку она не зависит от архитектуры. Поскольку вы новичок, вам следует использовать библиотеку SlowSoftWire, которая похожа на Wire. библиотека обертки. Он дает вам тот же интерфейс, что и библиотека Wire. Это хорошо для начинающих, так как скрывает часть сложности, а в большинстве примеров и руководств используется библиотека Wire (поэтому часто можно скопировать структуру кода). Вам необходимо установить обе библиотеки (SlowSoftI2CMaster и SlowSoftWire) в папку с библиотеками, но вам нужно включить только библиотеку SlowSoftWire. Пожалуйста, посмотрите на примеры, которые поставляются с этой библиотекой. Я буду ссылаться на эту библиотеку в следующих пунктах.

  3. Использование библиотеки 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