скорость АЦП MCP3008

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем ostrov, 2 окт 2016.

  1. Igor68

    Igor68 Гуру

    Так Вам же сказали раньше уже:
    - дешифраторы;
    - мультиплекторы;
    - и т.д.
    И не одним сигналом(ногой) уж точно.
    Собственно я задавал вопрос (а не бытрее ? по задержке) про выбор канала 0...7 у одной и той же микросхемы... ведь всё в одной посылке... картинка же есть! Делаете запрос с выбором канала для неё и получаете данные от того канала. А запрос так и так делать надо, что с выбором канала, что с выбором микросхемы.
     
  2. parovoZZ

    parovoZZ Гуру

    Мне-то что рассказывать? Я 30 лет в электронике. SS для чего сюда приплёл?
    Изначально вопрос стоял так - как прицепить 4 корпуса ацп к одному SPI. Ответ был дан. SS использовать здесь не получится.
     
  3. Igor68

    Igor68 Гуру

    тема: "скорость АЦП MCP3008". Собственно я и задавался вопросом варианта обращения к этой микросхеме с аппаратным управлением CS, что в контроллере Atmega 328 по даташит обзывается сигналом SS, который используется как вывод PB2 этого самого контроллера. Для SPI0 этого контроллера. Вот и интеросовался. И зря Вы так... и сами знаете про дешифраторы и т.п. Можете собрать и с применением логики... и потребуется 3 (потому как 2 сигнала 0..3 можно выбрать, но нужно ещё и пассивное состояние - когда нет обращения) сигнала. Либо без логики и тогда 4 сигнала контроллера. Либо ещё как... ну Вы понимаете. Меня же заитересовал вопрос как перебирать каналами от 0 до 7 применяя пресловутый SS (PB2), который для АЦП CS(Чип Селект - выбор кристала)
     
  4. VOL_IN

    VOL_IN Нерд

    пинов навалом Arduino Due.
    Тут другая мысля появилась, не у меня, умные люди подсказали. Что если всем четырем АЦПышкам одновременно режим задавать, т.е. запараллелить CLK, Din. А считывать потом в разные пины Dout. Ну, то-есть, получится всем одновременно давать команду чтоб померили канал № 1 , к примеру, а считывать Dout на разных пинах, тоже как бы одновременно.
    А еще беда небольшая появилась, я начал сравнивать количественные показания бортового АЦП Due и внешнего (MCP3008). Разница в показаниях не линейна(на всем диапазоне измеряемых значений) и значительна. От 2 до 60 единиц. Увеличивая параметр "setClockDivider", меняя скорость SPI, удалось добиться более менее приемлемых результатов замера сигнала (+- 5 единиц), но время выросло на 50 %. Проще говоря не хватало времени на преобразования. По сему, я еще попробую идею с параллельным CLK и Din, чисто для себя. Тут либо АЦП искать покруче или взять еще одну Due, и делать замеры аналоговых сигналов двумя процессорами, а потом собирать все в кучу. Может попробовать притарить отдельные чипы, от AVR запрограммировать их и впаять в плату (по цене наверное даже дешевле будет хороших АЦП), от ARM сложновато еще. В общем опыт показал что его (опыта) не хватает! Надо сесть и прикинуть, что мне вообще надо (максимальная частота опроса) и уже прикидывать что у чему)))
    Про выбор канала МСР3008, это во втором байте задается, адрес из даташита, в табличке. Про SS я не понял, если честно, по моему это для ведомых устройств. Я делал так СS в LOW и передаем в АЦП байты, подключал к аппаратному SPI. Первый байт 0x01, второй 0x80 (1 000 0000, первый бит режим работы SingleShot, далее три - адрес канала АЦП, 000 - самый первый, нулевой или первый кто как считает, не помню как datasheet указано), третий пустой 0х00, все что приходит после адреса вообще не воспринимается. А по Dout тем временем, идет "ответ". Там есть временная диаграмма по ней все видно. Я в радиоэлектронике недавно, по сему не пинайте только, написал как сам понял.
     
    Последнее редактирование: 12 мар 2018
  5. Igor68

    Igor68 Гуру

    Ещё раз простите за вмешательство!
    Но у Вас должно быть столько же линий на приём, а точнее столько же устройств обмена на борту контроллера. Уж если они не сделали аппаратное управление в режиме Master... то уж более чем уверен не делали и 4 приёмных устройства. Сам перечитал для режима Master:
    Код (Text):
    23.3.2.
    Master Mode
    When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the direction of
    the SS pin.
    If SS is configured as an output, the pin is a general output pin which does not affect the SPI system.
    Typically, the pin will be driving the SS pin of the SPI Slave.
    If SS is configured as an input, it must be held high to ensure Master SPI operation. If the SS pin is driven
    low by peripheral circuitry when the SPI is configured as a Master with the SS pin defined as an input, the
    SPI system interprets this as another master selecting the SPI as a slave and starting to send data to it.
    To avoid bus contention, the SPI system takes the following actions:
    1.
    2.
    The MSTR bit in SPCR is cleared and the SPI system becomes a Slave. As a result of the SPI
    becoming a Slave, the MOSI and SCK pins become inputs.
    The SPIF Flag in SPSR is set, and if the SPI interrupt is enabled, and the I-bit in SREG is set, the
    interrupt routine will be executed.
    Thus, when interrupt-driven SPI transmission is used in Master mode, and there exists a possibility that
    SS is driven low, the interrupt should always check that the MSTR bit is still set. If the MSTR bit has been
    cleared by a slave select, it must be set by the user to re-enable SPI Master mode.
     
    Придется управлять "вручную", а нормально работает только Slave (простите если не так понял).
     
  6. VOL_IN

    VOL_IN Нерд

    Да ладно вам, я вообще мало что понимаю еще))))
    Понятно одно, чтобы общаться(или попробовать хотя бы) "одновременно", за счет параллельных CLK и Din с 4-мя мср3008 надо дергать ручками))) как-то похабно получилось выразиться. CS в LOW, перещелкиваем CLK, меняя состояние, пина на котором Din "передать" 5-ть бит данных, потом продолжаем менять состояние CLK и считываем биты с 4-х пинов для каждой АЦП Dout свой отдельный пин микроконтроллера. В завершении CS в HIGH. Как-то так вроде.
    Итого 10-ть пинов для 4-х внешних АЦП. CLK - 1, Din - 1, Dout - 4, CS - 4. Вот...
     
    Последнее редактирование: 12 мар 2018
  7. Igor68

    Igor68 Гуру

    Простите... но по этому методу не ко мне:). Тут в теме есть и авторы реализации... ну и те у кого громадный опыт в выборе оптимальных решений. Я в программной реализации SPI не силён... а зачем?
    Простите!
     
  8. parovoZZ

    parovoZZ Гуру

    Максимальная частота, которую микруха может взять на борт, 3,6 МГц (пришлось-таки влезть в даташит). Для кварца 16 Мгц и делителем SPI на 8 мы имеем 2 МГц. Если брать делитель на 4, то получим перелёт - 4 МГц. Ну тут уж либо менять кварц, либо платформу. Оцифровывает микра за 2 такта тактирующего сигнала - сперва идет мусор, затем бит=0, а затем старшие биты старшего байта, затем лезет младший байт. Для SPI задача вообще не сложная - пока SPI получает данные, проц обрабатывает предыдущую выборку.

    Мысль дельная. Если все микры повесить на один порт, то считывать их все можно за один раз. А дальше что? Дальше необходимо 8 переменных по байту. Считали регистр порта (Y=PORTx). Затем надо либо сдвигом, либо логической операцией выделить необходимый бит, записать его в соответствующую переменную, затем его же сдвинуть дальше в этой же переменной, чтобы освободить место для следующего бита. И так 4 раза. В конце цикла чтения соединить младший байт со старшим. Как-то обработать. Думается мне, что даже на Си 2 МГц не выжать, разве что на асме. А про ардуино овенкод вообще забыть.

    Очень хорошая статья про SPI
    http://microsin.net/programming/avr/avr151-setup-and-use-spi.html
     
  9. VOL_IN

    VOL_IN Нерд

    Согласен, тоже смотрю. Только я про Due говорил , там 84 МГц, получается делитель надо 24, если от 5В запитать. Но тогда логический уровень единицы 4.1 В, а у Due 3.3, т.е. надо мудрить что-то. А еще я не смотрел библиотеку "ethernet2", т.е. не проверял совместимость шилда и подключенных по той же SPI АЦП, времени нет. Я так понял проблемы будут если библиотека шилда обрабатывает прерывания. Может на выходных засяду.
     
  10. VOL_IN

    VOL_IN Нерд

    Друзья, привет! Нашел время вечерком и собрал схему из 4-х МСР3008, подключенных параллельно(без SPI конечно, только суровый ногодрыг). В качестве контроллера взял Arduino Uno, ибо логика 5 вольт. Ногодрыг, взял из исходника библиотеки для данного АЦП с ginthab-а и немного модернизировал для работы с 4-мя АЦП (используются стандартные digitalWrite и digitalRead). В итоге получил: 476 микросекунд - время затраченное для считывания четырех каналов АЦП (по одному каналу на каждый АЦП), ну и 112 микросекунд для считывания одного канала встроенного в UNO АЦП стандартной функцией analogRead с присвоением. Теперь дело за оптимизацией кода конечно, можно и ускорить имхо... Однако стоит отметить что и сейчас используя не самый правильный код выгода на лицо.
    P.S. Я там выше писал что в середине диапазона измеряемых напряжений МСР3008 начинает завирать, так вот в ходе сегодняшнего эксперимента установил: если подключить внешний АЦП ПРАВИЛЬНО, то он перестает врать! Вот такая зависимость господа...
     
    Последнее редактирование: 21 мар 2018