Чтение данных с MCP3002

spi

Я использую MCP3002 для преобразования аналогового сигнала в цифровые данные. На самом деле работает нормально, отправляет хорошие данные. Однако; Через некоторое время, когда питание отключается и снова включается несколько раз, он возвращает только нули. Если я включаю его на следующий день, он снова работает какое-то время.

Я только начинаю работать с SPI, поэтому не знаю "всех" основ. Есть ли что-то, что я должен сбросить при включении питания или что-то в этом роде? (Часы, время и т. д.)

Это код, который я использую (довольно простой):

#include <SPI.h>
SPISettings spiSettings(7280000, MSBFIRST, SPI_MODE0);
const int SPI_CS = 2;

void setup() {
    pinMode (SPI_CS, OUTPUT);
    SPI.begin();
    SPI.setBitOrder(MSBFIRST);
    SPI.setFrequency(7280000);
}


void loop() {
    SPI.beginTransaction(spiSettings);
    digitalWrite (SPI_CS, LOW);

    uint8_t cmd = 0b11000000;
    byte msb, lsb;
    word assembled;

    msb = SPI.transfer(cmd);
    lsb = SPI.transfer(0);

    assembled = word(msb, lsb);
    Serial.println(assembled);

    digitalWrite (SPI_CS, HIGH);
    SPI.endTransaction();
}

Что-то не так или нужно что-то добавить к этому?

, 👍0

Обсуждение

Попробуйте использовать небольшую задержку между транзакциями. АЦП нужно немного времени, чтобы преобразовать другое значение. В техническом описании указано, что при продолжении чтения будут бесконечно отсчитываться нули (прочитайте главу 5.1 в техническом описании. Последнее предложение в левом столбце). Так что я думаю, что контакт CS недостаточно долго неактивен, @chrisl

О, я попробую это и прочитаю таблицы данных! Но как это объясняет, что это работает изначально?, @Revils

Может быть, какое-то странное гоночное состояние, может быть, что-то связанное с тем, как датчик определяет контакт CS., @chrisl

Спасибо, я попробую как можно скорее и вернусь сюда, чтобы добавить результаты. Таким образом, другие могли бы использовать это, а также., @Revils

Используете ли вы правильно изготовленную разделительную плату или просто голый чип на макетной плате?, @Majenko

@Majenko Правильно изготовлено, почему?, @Revils

Просто интересно, не пропустили ли вы развязывающие конденсаторы, но, вероятно, нет, если это BoB., @Majenko

@Majenko, ну, это правильно изготовлено. Но я сам разработал платы (с конденсаторами), но, возможно, мне не хватает одного. Сначала я проверю решение Крисла. :-), @Revils

Хорошей практикой является установка для Arduino собственного вывода выбора ведомого устройства (для UNO это PIN 10) в качестве выхода. Потому что сигнал на этом контакте может переключить Arduino в режим SPI Slave. Я не верю, что это может исправить вашу настройку - но, возможно... И вы спросили, не пропустили ли вы что-то: pinMode (10, OUTPUT);, @Peter Paul Kiefer

@chrisl Это сработало как шарм, спасибо! Можете ли вы опубликовать это как ответ, чтобы я мог принять его, и людям не нужно было только читать комментарии? В техническом описании сказано: 'После завершения передачи данных, если дальнейшие часы применяются с низким уровнем CS, аналого-цифровой преобразователь будет бесконечно выводить нули. Видеть Рисунок 5-2 для деталей получения первых данных LSB.', @Revils


1 ответ


Лучший ответ:

1

Я думаю, что происходит следующее:

MCP передает 1 измерение за транзакцию SPI, состоящую из активации выбора чипа, чтения данных и деактивации выбора чипа. Чтобы различать разные транзакции, время между деактивацией и повторной активацией выбора чипа должно иметь небольшую задержку между ними. В настоящее время ваш код работает очень быстро, максимум несколько микросекунд между транзакциями.

Это также может быть связано с тем, что MCP требуется время для измерения аналогового сигнала.

Я думаю, что существует какое-то состояние гонки, так что MCP не имеет нового значения для передачи, либо потому, что MCP еще не закончил измерение, либо потому, что задержка между транзакциями была слишком короткой. , возможно, сочетание того и другого.

Когда MCP один раз оказывается в такой ситуации, в этот момент он будет отправлять только нули (см. главу 5.1 в таблице данных. Последнее предложение в левом столбце).

Вам нужно дать MCP больше времени между транзакциями. Я предлагаю использовать небольшую задержку в конце функции loop(). Вы можете поэкспериментировать с фактическим значением, я полагаю, что вы можете уменьшить его до диапазона микросекунд.

,