Добрый день. Пробую общаться с АЦП MCP3008 по протоколу SPI, собрал схему на Iskre JS, для снятия показаний с потенциометра и написал следующий код: Код (Javascript): var spi = new SPI(); spi.setup({ sck: P11, miso: P10, mosi: P9, }); function readMCP() { var d = spi.send([0, 1, 2, 3, 4, 5], P8); console.log('MCP:', d); } setInterval(readMCP, 1000); В результате получаю следующее, при вращении потенциометра: Код (Bash): MCP: new Uint8Array([0, 1, 1, 224, 15, 0]) MCP: new Uint8Array([0, 1, 1, 224, 15, 0]) MCP: new Uint8Array([0, 1, 1, 216, 55, 0]) MCP: new Uint8Array([0, 1, 1, 43, 169, 0]) MCP: new Uint8Array([0, 1, 0, 158, 242, 0]) MCP: new Uint8Array([0, 1, 0, 33, 8, 0]) MCP: new Uint8Array([0, 1, 0, 0, 0, 0]) И у меня возникли вопросы: 1. Что подразумевается под данными в data в методе spi.send? 2. Как интерпретировать ответ АЦП(перевести полуенный результат в сопротивление потенциометра)? Заранее спасибо!
Я извиняюсь, не работал с JS, но по даташиту АЦП нужно отправить 1 стартовый бит, 1 бит выбора пары выводов и 3 бита выбора используемых выводов АЦП после этого нужно щелкать CLK ещё 12 раз. Во время последних 10 щелчков АЦП выдаёт отцифрованное напряжение на выбранном выводе. Могу быть не прав, но вы отсылаете 6 байт подряд 0b00000000 - 0 0b00000001 - 1 0b00000010 - 2 0b00000011 - 3 0b00000100 - 4 0b00000101 - 5 Первыми нулями 0-ого байта вы задаете режим работы, остальными нулями и и битами 1-ого байта вы получаете значения с АЦП, потом 2-ым и 3-им байтом, а потом и 4ым и 5ым вы проделываете то же самое (причем, т.к. у 0-ого, 2-ого и 4-ого байтов первые биты нули вы все время отцифровываете один и тот же канал АЦП. А далее библиотеке JS плевать, что там подключено к spi, она интерпретирует всё по байтно, т.е. ещё нужно разбираться, что она выплюнула вам. Мы то помним, что АЦП выдаёт 10 бит, и понимаем, что библиотечка разбивает полученный код по байтам. И ещё важный момент, дергает ли эта библиотечка между байтами выводом CS? Если да, то всё написаное выше неправильно, т.к. для АЦП во время передачи данных нужно постоянное CS. В даташите code = 1024*Vin/Vref, поэтому Vin = code*Vref/1024 Почему у вас потенциометр в схеме включён необычно? По схеме у вас на вывод CH0 независимо от ручки потенциометра подается примерно 5 В (немного, но зависит) Я рекомендую открыть даташит и подергать выводами МК ручками, без сторонних библиотек spi и разобраться в передаче данных, а потом уже все автоматизировать. В даташите указано, что если все важные биты установлены в "0", то отцифровываться будет напряжение между выводами CH0 и CH1, у вас вывод CH1 висит в воздухе, вы получаете шум