Arduino с 12-битным ЦАП (MCP4725) не работает
У меня есть Arduino Mega AT2560, и мне нужен настоящий ЦАП. Я купил 12-битный ЦАП Sparkfun, однако не думаю, что он работает должным образом.
Я использую библиотеку проводов Arduino для связи с ЦАП. Когда я пишу 0, я ожидаю увидеть 0 В на выводе OUT ЦАП. Однако я вижу какое-то, казалось бы, случайное постоянное напряжение. И наоборот, когда я записываю 4095 в ЦАП, я вижу то же напряжение, что и при записи 0. Я ожидал увидеть 5 В.
- Может ли кто-нибудь проверить, правильно ли я подключил?
- Может ли кто-нибудь проверить код, который я использую?
#include <stdint.h>
#include <stdio.h>
#include <Wire.h>
#define MCP4725_ADDR 0x60 // [0000 0110]
/*
* 12 Bit DAC MCP4725 gives a range of 4096 possible values.
*
*/
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(MCP4725_ADDR);
Wire.write(64); // cmd для обновления ЦАП [0100 0000]
Wire.write(4095 >> 4); // 8 старших бит...
Wire.write((4095 & 15) << 4); // 4 младших бита...
Wire.endTransmission();
}
@, 👍1
Обсуждение2 ответа
Извините, что опоздал — я понимаю, что этот вопрос был задан 8 месяцев назад, но, похоже, вы его не исправили, и я думаю, что другие всегда могут извлечь пользу (или даже вы, если все еще хотите попробовать).
Ваш код выглядит правильным (я сравнил его с примером Sparkfun, а также с техническим описанием MPC4725).
Однако, похоже, вы используете неправильный адрес для детали. (Фактическое значение адреса не указано в примере Sparkfun — по крайней мере, мне не удалось его найти).
Ваша строка:
#define MCP4725_ADDR 0x60 // [0000 0110]
неправильно в двух местах:
1) 0x60 — это 0110 0000, а не 0000 0110
2) Согласно техническому описанию (раздел 7.2), адрес должен начинаться с кода устройства %1100, а затем добавляется адрес. Таким образом, если предположить, что адрес A2 = 0, A1 = 0 и A0 = 0 (по умолчанию), значение для MCP4725_ADDR выглядит так, как будто оно должно быть 0xC0 или %1100 000x. Если вы припаяли адресную линию к Vcc вместо земли, адрес должен быть 0xC2 или %1100 001x.
X в адресной строке представляет бит чтения/записи. Если вы пытаетесь управлять ЦАП, он не должен быть утвержден, поэтому адреса выше верны. Если вы пытаетесь прочитать текущее значение, он должен быть утвержден, что делает ваш адрес 0xC1 или 0xC3.
Если вы указали неправильный адрес, то даже если все остальное правильно, деталь его проигнорирует, поэтому, вероятно, это и есть проблема, с которой вы столкнулись.
Надеюсь, это кому-то поможет!
Пример SparkFun по адресу https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog-converter-hookup-guide гласит: #define MCP4725_ADDR 0x60 //Для устройств с A0, подтянутым к ВЫСОКОМУ уровню, используйте 0x61
и на той же странице говорится: «Мы вывели вывод выбора адреса (A0) на площадку для перемычки. По умолчанию этот вывод подтянут к НИЗКОМУ уровню на GND», что указывает на правильность 0x60., @per1234
Помните, что (обычный) адрес I2C состоит из 7-битного идентификатора и одного бита, который указывает, запрашивает ли мастер операцию записи или чтения. 7-битный адрес — 0x60; байт, отправленный по шине, будет 0xC0 или 0xC1, в зависимости от операции. Функция Arduino ожидает 7-битный адрес, а в техническом описании указан байт для передачи., @frarugi87
- вы хотите убедиться, что на линиях SCL/SDA есть подтяжки;
- Вы хотите убедиться, что адрес правильный. Некоторые процедуры используют для этого 7-битную нотацию, а другие — 8-битную. В конце концов, вы хотите, чтобы передача была 0xc0 | (A2:A1:A0:R/W). Поэтому проверьте write.write() и посмотрите, чего она ожидает. Я подозреваю, что она ожидает 0xCx, а не 0x6x.
Сказав это, вот ваш код, работающий на uno, с ЦАП, настроенным в соответствии со спецификацией sparkfun.
поэтому я думаю, будет справедливо сказать, что код в порядке, но что-то произошло на вашей стороне, что помешало ему работать.
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
- Как отправлять данные через I2C без проводной библиотеки?
- Странное явление с avrdude: stk500v2_ReceiveMessage(): таймаут только с ATmega250 на windows 7x64
- Проанализировать большой ответ json с помощью ESP8266
- Сбой Arduino во время последовательной печати без очевидной причины
- Будет ли адаптер питания 12В постоянного тока, 1А подавать слишком большую мощность и повредит Arduino Mega 2560?
- Как запрограммировать Robotdyn Mega 2560 PRO MINI?
- Отключите автоматический сброс Mega 2560 на последовательном мониторе, открытом с помощью резистора 60 Ом.
Полная шкала должна быть 4095, а не 4096. В шестнадцатеричном формате 4095 имеет идентификатор 0x0FFF, а 4096 — 0x1000. У вас есть диапазон из 4096 возможных значений от 0 до 4095., @Peter Bennett