Чтение линейного ПЗС-датчика TCD1304

Я хочу прочитать данные с линейного ПЗС-датчика TCD1304 с помощью ESP32, но столкнулся с некоторыми проблемами. В качестве первого «разогрева» и для ознакомления с этим датчиком я попытался сгенерировать входные сигналы датчика, используя прерывание по таймеру и битбэнгинг, но вскоре обнаружил, что полученные сигналы слишком медленные, и я не получил никаких полезных показаний.

Используются следующие сигналы:

  • SH (сдвиговой вентиль): определяет время интегрирования
  • ICG (интегральный сброс): используется для передачи значений пикселей в сдвиговый регистр.
  • ΦM: (главные часы): не требуют пояснений
  • ОС: выходной сигнал

Временная диаграмма TCD1304

Время этих сигналов, по-видимому, весьма критично (см. диаграмму ниже) и должно быть достаточно быстрым — поддерживаемая частота главного тактового генератора составляет 0,8–4 МГц, а аналоговое измерение должно выполняться после каждого 4-го тактового импульса (0,2–1 МГц).

Сейчас я совершенно растерян и считаю, что эта задача требует некоторых приемов программирования, с которыми я пока не знаком.

В общем, мой вопрос такой:

Каков наилучший способ генерации этих сигналов и как считывать показания АЦП с такой высокой частотой дискретизации/точной синхронизацией?

У меня есть некоторые идеи, но, как я уже сказал, мне, вероятно, не хватает необходимых навыков, поэтому мне сложно решить, какой подход выбрать:

  1. Использование одного таймера и прямого управления портами: Это было бы легко реализовать, но я предполагаю, что прерывания будут срабатывать слишком часто, чтобы обрабатывать ISR (что было бы довольно сложно, даже если я рефакторизую свой текущий тестовый код). Особенно чтение АЦП, полагаю, займёт слишком много времени.

  2. использование I2S-ADC ESP: У меня нет опыта работы с I2S. Насколько я понимаю, он подходит для считывания данных АЦП с высокой частотой, но обычно используется для периодической выборки. В моём случае мне нужно было бы синхронизировать показания с управляющими сигналами, но я не знаю, возможно ли/удобно ли это с I2S-АЦП.

  3. использование АЦП-DMA: @esben Россель проделал отличную работу, предоставив фреймворк для STM32 и TCD1304, в котором он использует DMA для чтения. Я никогда не использовал прямой доступ к памяти, но считаю, что это многообещающий подход. К сожалению, в документации по АЦП рассматривается только режим АЦП-RTC, а информация об использовании режима АЦП-DMA отсутствует. Если DMA — это подходящий вариант, буду благодарен за любые советы о том, как начать программировать DMA на ESP32.

В последних случаях 2) и 3) мне все равно придется генерировать управляющие импульсы «дружественным к процессору» способом, вероятно, с помощью аппаратной ШИМ (?), в то время как аналоговое считывание должно запускаться на каждом четвертом тактовом импульсе.

Стоит ли использовать отдельный таймер для каждого сигнала, и если да, как обеспечить правильное смещение фаз сигналов? Кроме того, как запустить аналоговое измерение после каждого четвёртого тактового импульса?

, 👍0

Обсуждение

Я не знаком с внутренним устройством ESP32, но если бы я делал это на аналогичном PIC32, я бы, вероятно, использовал SPI для генерации тактового сигнала, который затем делил бы на 2. Затем SPI генерирует прерывание каждые 8 тактов (или 4 после деления на 2), которое запускает DMA для чтения данных из АЦП. Другой канал DMA отправляет фиктивные байты через SPI, чтобы поддерживать тактовый сигнал и выполнять достаточное количество транзакций. I2S использует внешний чип кодека для работы АЦП (и ЦАП)., @Majenko

@Majenko, использование SPI для генерации тактовой частоты — отличная идея, мне нравится! SPI ESP32 поддерживает 4-битный режим передачи, что, похоже, идеально подходит для этой задачи. Но я всё ещё не понимаю, как синхронизировать фиктивный сигнал SPI с сигналами SH/ICG и как их генерировать. Как думаете, битбэнгинг с использованием таймера и последующим вызовом фиктивного сигнала SPI (который запускает АЦП-DMA) может сработать?, @Sim Son

Я думаю, прерывание SPI можно использовать для управления этими импульсами. Его также можно использовать для запуска/остановки канала DMA, считывающего данные с АЦП., @Majenko

@Majenko по поводу I2S: вы имеете в виду, что для I2S действительно требуется внешнее оборудование? Насколько я понимаю, интерфейс I2S в ESP32 способен считывать данные с **внутреннего** АЦП, достигая частоты дискретизации до ~300 кГц, или я ошибаюсь?, @Sim Son

Как я уже упоминал, я не знаком с их внутренним устройством. Возможно, они добавили какой-то обратный контур к внутреннему кодеку, но я понятия не имею. Я работал только с внешними чипами кодеков. Вам нужно будет обратиться к документации TRM., @Majenko


1 ответ


-1

В качестве предисловия: чип управлялся с нескольких разных плат класса Arduino. Это нетривиальная задача, но при должном подходе её можно выполнить и получить приемлемый результат, если у вас есть (а) достаточно быстрый аналоговый вход и (б) правильное управление электрическими компонентами и синхронизацией.

Я опубликовал репозиторий на GitHub по этой ссылке. В README подробное обсуждение с анализом схем и примерами, а в репозитории есть SPICE-модели, CAD-файлы и код.

https://github.com/drmcnelson/Linear-CCD-with-LTSpice-KiCAD-Firmware-and-Python-Library

Теперь вопрос: возможно ли использование MCU xyz для этого?

Я думаю, все сводится к следующим вопросам, ответы на которые вы можете найти в документации или сможете получить с помощью небольшого кода и осциллографа.

(a) Может ли микроконтроллер выдавать тактовый сигнал на цифровом выводе с частотой не менее 800 KSPS (минимальная частота тактового сигнала для TCD1304)?

(b) Может ли он считывать аналоговый входной сигнал со скоростью не менее 200 KSPS?

(c) Что необходимо для управления аналоговым входом с такой скоростью? (Проверьте последовательное сопротивление и емкость для аналогового входа).

(d) Каковы накладные расходы по времени на чтение и запись цифрового PIN-кода?

(e) Какой ток доступен на цифровых входах/выходах? И какой ток необходим для достижения требуемых напряжений на выходах SH и ICG гораздо быстрее, чем за 1 микросекунду?

(f) Достаточно ли быстр процессор, чтобы иметь возможность контролировать синхронизацию между утверждениями двух цифровых выводов и аналогового входа на основе главного тактового сигнала от (a)?

Если всё это сработает, то, возможно, у вас появится надежда, что это сработает. Теперь вам придётся попробовать.

Как вы, возможно, знаете, обычно используется следующий метод: генерация тактового сигнала на одном выводе, привязка его ко второму выводу, а затем циклическое считывание цифрового сигнала на этом втором выводе и запуск сигналов sh, icg и аналогового считывания по мере необходимости. Вы можете попробовать этот метод, вставлять необходимые циклы процессора для синхронизации и проверять результат с помощью осциллографа.

Если вы застряли, опубликуйте свой код и трассировки области действия, и мы постараемся вам помочь.

,

Вопрос касался именно управления/чтения данных с чипа с помощью данного оборудования (ESP32). Кроме того, *качество* сигнала с электронной точки зрения было хорошим, возникали проблемы только с синхронизацией генерируемых и захваченных сигналов, и с тех пор я их так и не решил. В любом случае спасибо за ответ, хотя он немного напоминает ответ от ChatGPT :D, @Sim Son

Почтовый индекс и следы области действия., @DrM