Чтение данных с MCP3002
Я использую 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();
}
Что-то не так или нужно что-то добавить к этому?
@Revils, 👍0
Обсуждение1 ответ
Лучший ответ:
Я думаю, что происходит следующее:
MCP передает 1 измерение за транзакцию SPI, состоящую из активации выбора чипа, чтения данных и деактивации выбора чипа. Чтобы различать разные транзакции, время между деактивацией и повторной активацией выбора чипа должно иметь небольшую задержку между ними. В настоящее время ваш код работает очень быстро, максимум несколько микросекунд между транзакциями.
Это также может быть связано с тем, что MCP требуется время для измерения аналогового сигнала.
Я думаю, что существует какое-то состояние гонки, так что MCP не имеет нового значения для передачи, либо потому, что MCP еще не закончил измерение, либо потому, что задержка между транзакциями была слишком короткой. , возможно, сочетание того и другого.
Когда MCP один раз оказывается в такой ситуации, в этот момент он будет отправлять только нули (см. главу 5.1 в таблице данных. Последнее предложение в левом столбце).
Вам нужно дать MCP больше времени между транзакциями. Я предлагаю использовать небольшую задержку в конце функции loop()
. Вы можете поэкспериментировать с фактическим значением, я полагаю, что вы можете уменьшить его до диапазона микросекунд.
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как передать более 1 байта сразу по шине SPI?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Путаница между SPI и I2C для SSD1306 OLED
Попробуйте использовать небольшую задержку между транзакциями. АЦП нужно немного времени, чтобы преобразовать другое значение. В техническом описании указано, что при продолжении чтения будут бесконечно отсчитываться нули (прочитайте главу 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