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

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

  1. ostrov

    ostrov Гуру

    Баловался сегодня вот такой микросхемой. Использовал библиотеку из ссылки, не знаю уж насколько она оптимизированная, внутрь пока заглядывать некогда было. В итоге замер на практике показал 3000 измерений в секунду, что всего лишь вдвое лучше стандартного бортового АЦП. Или в 2 раза хуже его же разогнанного. Возможно дело в библиотеке (альтернативы которой я пока не нашел), или все упирается в скорость передачи данных, а возможно на системе с частотой 16МГц особо потенциал не раскроешь, но факт остается фактом. Преимущество дает всего одно: переделываем 4 цифровых пина в 8 аналоговых. Это, например, для тини 2313 пригодилось бы, жалко только в память ей не влезет.
     
    Последнее редактирование: 2 окт 2016
  2. ostrov

    ostrov Гуру

    Да твою жеж маму! Даже и предположить не мог такой наглости, что библиотеку для скоростного (200КГц) АЦП сделают на ардуиновских digitalWrite! Вот выдержка из библиотечного файла:
    Код (C++):
      for (int i=0; i<5; i++) {
        if (commandout & 0x80)
          digitalWrite(_mosipin, HIGH);
        else  
          digitalWrite(_mosipin, LOW);
         
        commandout <<= 1;
        digitalWrite(_clockpin, HIGH);
        digitalWrite(_clockpin, LOW);
      }
    А я еще удивился, что такая быстрая микросхема работает едва ли не медленней родных АЦП. Будет время сделаю иначе, хотя бы для того, чтобы почувствовать разницу.
     
  3. ostrov

    ostrov Гуру

    Таки не успокоился пока не переписал функцию обращением непосредственно в порты. Теперь результат стал такой: 64,5 тысячи измерений в 1 секунду против 3 тысячи "библиотечных"! Так то, на ровном месте ускорилось в 22 раза. Теперь использование этой микросхемы в проектах стало оправданным.

    Хоть всем пофиг, но если кому то когда нибудь понадобится 8 быстрых внешних АЦП - поделюсь кодом.
     
    9xA59kK и ИгорьК нравится это.
  4. ИгорьК

    ИгорьК Давно здесь

    Хорошая работа. Но там АЦП - восьмибитный? Как и в AVR? Мало где нужно столько ацп.
     
  5. ostrov

    ostrov Гуру

    10 битный, как в AVR. )
     
  6. ИгорьК

    ИгорьК Давно здесь

    А, ну да, точно. То есть - добавить еще ног типа А. Немного мест, когда это требуется, ИМХО.
    ... давно AVR не прграммировал :)
     
  7. ostrov

    ostrov Гуру

    Редко, но бывает, а у некоторых МК вообще нет АЦП. И опять же скорость выше намного, иногда это важно.
     
  8. Renner

    Renner Нуб

    Доброго времени суток. Вы можете поделиться кодом?
     
  9. VOL_IN

    VOL_IN Нерд

    Здравствуйте друзья! Рискну поднять тему. Мне нужно считывать 25 аналоговых сигнала с максимальной скоростью. Много всего перепробовал, предпоследний вариант имел переключатели, т.е. на один и тот-же вход АЦП Arduino Due в разное время подавались сигналы с разных источников. Но скорость переключения источников сигнала была около 1.5 мсек приходилось сильно замедлять частоту опросов. Ну и конечно логичным продолжением мысли стало использование внешних АЦП. Я купил 4 MCP3008 (прочитал о 200кГц). Ну и в итоге при использовании одноименной библиотеки получил 2098 мсек затраченных на 20000 измерений только одного канала. При этом встроенный АЦП на ту же операцию потратил 84 мсек. В итоге имеем: внешний АЦП с этой библиотекой работает всего навсего в 25 раз медленней встроенного.
    Не затруднит ли вас Уважаемый ostrov поделиться решением проблемы неоптимизированной библиотеки и тем самым сэкономить мое время. С прямым обращением к портам я еще не работал. Спасибо
     
    Последнее редактирование: 9 мар 2018
  10. parovoZZ

    parovoZZ Гуру

    У МК порт SPI присутствует? Если да, то и работай через него. К чему ногодрыг?
     
  11. VOL_IN

    VOL_IN Нерд

    На SPI подключен EthrnetShield, по этому я про SPI и не думал, хотя учитывая 4 шт MCP3008 без ногодрыга не обойтись. Да и примера работы по SPI с MCP3008 у меня нет, если есть поделитесь. По этому ногодрыг понятней есть библиотека в которую можно заглянуть и попытаться исправить код под прямое обращение к портам. Я так понимаю что нужно это делать через директивы препроцессора.
     
    Последнее редактирование: 10 мар 2018
  12. parovoZZ

    parovoZZ Гуру

    Чо? Директивы препроцессора?
    Всё проще.
    Первая же ссылка, где всё разжевано
    https://ph0en1x.net/81-howto-work-with-ports-register-bits-in-microcontroller.html

    Но гораздо удобнее работать через макросы типа таких

    Код (C++):
    #define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
    //пример: ClearBit(PORTD, 4); //сбросить 4-й бит PORTD

    #define SetBit(reg, bit)          reg |= (1<<(bit))  
    //пример: SetBit(PORTD, 5); //установить 5-й бит PORTD
     
  13. VOL_IN

    VOL_IN Нерд

    Ага ))) звучит однако!!! Но это в теории нахватался: -
    А предложенный вами макрос это вообще крутяк, а я планировал на каждый пин CS дергать отдельным макросом. Разобрался я с подключением MCP3008 по SPI, микруха АЦП подключена пока только одна, но я думаю проблем не будет. Подскажите, а с Ethernet shield конфликтовать не будет? Я еще в "Ethernet2.h" не смотрел. Я так понимаю что проблемы будут если "Ethernet2.h" использует прерывания?!
    Совсем забыл добавить, что время для проведения 20000 опросов одного канала МСЗ008 снизилось с 2098 мсек до 284, за счет использования SPI, спасибо parovoZZ. Прямое управление портами еще не пробовал, но положительная динамика на лицо.
     
    Последнее редактирование: 11 мар 2018
  14. parovoZZ

    parovoZZ Гуру

    У мс3008 есть вход выбора кристалла? Для 4-х микрух надо ещё 4 пина.
     
  15. Igor68

    Igor68 Гуру

    Доброго времени суток!
    По поводу ChipSelect... для данного устройтва действительно выгоднее переключать сами АЦП (выбор микросхемы)... или выбрав один из аналоговых каналов. Уточните что производительнее если не затруднит. Есть контроллеры (и от ATMEL тоже) которые CS сигнал формируют аппаратно самостоятельно при начале обмена. Я это к тому, что может и не надо "вручную" ногами дёргать вовсе... а если есть указанная реализация.
    Я это к тому, что у указанной микросхнмы АЦП есть это:
    m12s16.png
    А у Atmega 328 есть это:
    m12s17.png
     
  16. Igor68

    Igor68 Гуру

    ...ну соответственно и надо сигналы:
    m12s18.png
    PB2, PB3, PB4, PB5... тоесть полный набор сигналов.
    Вот на мини:
    m12s19.png
    Они выведены. В чём загвоздка?
    При обращении к регистрам SPI контроллера этот самый CS будет выроботан автоматически и на нужное время. Ногами дергать вообще не надо!
     
  17. Igor68

    Igor68 Гуру

    Ну и соответственно (для разных режимов SPI):
    m12s20.png
    Ножкой SS... тоесть PB2... для АЦП ChipSelect сам дёргать будет.
     
  18. parovoZZ

    parovoZZ Гуру

    Мда, постов много, слов много, а что сказал? Не надо путать выбор канала с выбором микросхемы. Как с помощью одного пина сделать выбор одной из четырёх микросхем? Да даже если и канал выбирать - необходимо 3 пина. Сам же картинками и подтвердил.
     
  19. Igor68

    Igor68 Гуру

    >>> Да даже если и канал выбирать - необходимо 3 пина. Сам же картинками и подтвердил

    - Вот только не припомню... да и не видел, что бы в даташит были ножки выбора канала... там вообщето про биты конфигурации говориться:
    m12s21.png
    Те самые, что в посылке SPI... но если для Вас все буквы чёрные и почему-то разные, то простите!
     
  20. parovoZZ

    parovoZZ Гуру

    Даташит я не смотрел. Впрочем, это не даёт ответа на вопрос, как ногой SS выбрать одну из четырёх микросхем.