Подключение АЦП MCP3008 по SPI?

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Space, 19 май 2018.

  1. Space

    Space Нуб

    Добрый день.
    Пробую общаться с АЦП MCP3008 по протоколу SPI, собрал схему на Iskre JS, для снятия показаний с потенциометра и написал следующий код:

    [​IMG]

    Код (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. Как интерпретировать ответ АЦП(перевести полуенный результат в сопротивление потенциометра)?

    Заранее спасибо!
     

    Вложения:

    • 01.png
      01.png
      Размер файла:
      323,5 КБ
      Просмотров:
      917
    Последнее редактирование: 19 май 2018
  2. Daniil

    Daniil Гуру

    Я извиняюсь, не работал с 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 висит в воздухе, вы получаете шум
     
    Последнее редактирование: 19 май 2018
    Space и arkadyf нравится это.