Несколько термопар через мультирлексор

Тема в разделе "Arduino & Shields", создана пользователем Ibray, 14 фев 2017.

  1. Ibray

    Ibray Нуб

    Здравствуйте,

    Пытаюсь подключить несколько термопар с MAX6675 к одной плате ардуино уно.
    Когда подключаю два, без мультиплексора, все работает.
    Проблема в том, что нужно подключить минимум 9 штук, соответственно пинов не хватает.
    Пытаюсь подключать через цифровой мультиплексор 74HC151, при этом SCK и SO выходы MAX6675-ого подключаю к ардуине, с расчетом, что объединю все SCK и все SO вместе, а CS буду подключать ко входам мультиплексора. И с выхода мультиплексора буду снимать сигнал.
    Но даже с одним MAX6675 не получается получить ничего. Ардуино пишет ноль.
    Библиотеку для использую https://github.com/adafruit/MAX6675-library.
    Вопросы:
    1. Мультиплексор работает как некий хаб? Пускает сигнал от выхода ко входам, от входов к выходам?
    2. Судя по библиотеке для MAX6675, от мультиплексора лишь нужно, чтобы он пустил digitalWrite(cs, LOW); и digitalWrite(cs, HIGH); от выхода ко входу.
    3. Это вообще возможно?

    Спасибо что дочитали
     
  2. rkit

    rkit Гуру

    Какой смысл подключать вход ко входу? Вам нужен мультиплексор с выходами. Обычный 74hc595 пойдет.
     
    Ibray нравится это.
  3. Ibray

    Ibray Нуб

    А этот (74HC151) так не может?
     
  4. rkit

    rkit Гуру

    Он входной. Для SPI достаточно всего одного входа - MISO.
    Разберитесь как работает spi, как работают микрухи, а потом уже пытайтесь что-то собрать. Иначе будете обречены на ходьбу по граблям.
     
    Ibray нравится это.
  5. Unixon

    Unixon Оракул Модератор

    Это от того, что неправильно подключаете.
    Все SCK соединяете вместе, все MISO тоже (можно через резистор 1кОм), все CS отдельно. Итого 11 пинов. Для этого у Uno пинов хватает без всякого мультиплексора. Если хочется еще сэкономить и вместо 9 разных CS использовать 4 пина для указания номера - берете дешифратор 74HC42 или 74HC154.
     
  6. Ibray

    Ibray Нуб

    Получается по-простому, 74hc595 - для того, чтобы установить какой-то один выход в HIGH, а эти: 74HC42 или 74HC154 - один в LOW?
     
  7. Unixon

    Unixon Оракул Модератор

    Нет. 74HC595 - 8-битный регистр сдвига с последовательной загрузкой и параллельным выходом, 74HC42 - дешифратор 4-к-10, 74HC154 - дешифратор 4-к-16. На любом из этих чипов можно сэкономить пины на CS.
     
  8. serg_admin

    serg_admin Гик

    Можно расширители типа PCF8574T на I2C шину повесить для CS пинов, тогда можно будет с пол сотни датчиков зацепить.
     
  9. Unixon

    Unixon Оракул Модератор

    Да тут на самом деле дешифраторы то уже перебор, регистр сдвига самый экономичный, всего 3 сигнала на любое количество датчиков.
     
  10. Ibray

    Ibray Нуб

    Со сдвиговым регистром с двумя датчиками у меня получилось, что делая shiftOut(); я могу подавать HIGH на CS на какой-то из датчиков, но считываю я с того, у которого на CS LOW.
    В библиотеке так и происходит:
    1. Сначала digitalWrite(cs, LOW);
    2. Потом считывание с SCK.
     
  11. Unixon

    Unixon Оракул Модератор

    HIGH нужно подавать на все, кроме одного.
     
  12. Ibray

    Ibray Нуб

    Это нужно все перебрать по очереди или есть что-то специальное?
    Сейчас я делаю так с 74hc595:

    Код (C++):
    void registerWriteHigh(int whichPin) {
      // инициализируем и обнуляем байт
      byte bitsToSend = 0;

      //Отключаем вывод на регистре
      digitalWrite(latchPin, LOW);
     
      // устанавливаем HIGH в соответствующем бите
      bitWrite(bitsToSend, whichPin, HIGH);
      // проталкиваем байт в регистр
      shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);

        // "защелкиваем" регистр, чтобы байт появился       на его выходах
      digitalWrite(latchPin, HIGH);
    }
     
  13. Unixon

    Unixon Оракул Модератор

    Поскольку у вас SCK и MISO общие для всех датчиков, в один момент времени вы можете общаться только с одним их них. Этот датчик вы выбираете, устанавливая ему CS=0, все остальные должны быть в это время отключены т.е., для остальных CS=1. Нельзя одновременно нескольким датчикам выдавать CS=0, вы так у них можете просто выходы спалить, если они запараллелены напрямую, без сопротивлений.

    В каком порядке опрашивать датчики - это сами решайте.
     
  14. Unixon

    Unixon Оракул Модератор

    bitsToSend = 0xff ^ _BV(n); // n - номер датчика 0..7