Есть ли способ получить разрешение таймера 10 нс от процессора AVR?

У меня есть ATM32u4 с частотой 8 МГц, который может считывать внешние импульсные входы с тактами 125 нс, используя InputCapture3 (PC7) на своем 16-битном таймере. Есть ли волшебный способ (bitbanging?), чтобы получить разрешение тиков около 10 нс для чтения импульсов? Редактировать: например, преобразование АЦП, чтобы обеспечить 16-битным системам 24-битную точность за счет творческого кодирования и т. д.

Если нет никакой магии, мне следует использовать более быстрый процессор? Я ограничен в кодировании процессорами типа AVR в Arduino IDE. Итак, интересно, какой процессор AVR будет достаточно быстрым для тика 10 нс, который уже встроен в Nano, UNO и т. д.?

Если я не могу использовать прерывания по выводам, которые могут считываться с интервалом 10 нс, я мог бы использовать типы ЦП ARM с кодом Arduino IDE, который не требует от меня глубокого погружения в язык уровня регистров.

Или существует автономная аналоговая или цифровая ИС, способная считывать импульсы с интервалом 10 нс, которые может обрабатывать Arduino?

Спасибо.

Редактировать: мне нужно было бы измерить длину только одиночного импульса, а не непрерывного или изменяющегося сигнала. Длина до 70 мкс с точностью не менее 18 нс, но желательно 10 нс для учета аппаратных и т. д. неточностей. Этот однократный импульс мог повторяться не чаще, чем с интервалом в 1 секунду, но, скорее всего, с интервалом в несколько секунд. Сигнал представляет собой две положительные прямоугольные волны, формирующие импульс длительностью не менее 70 мкс от положительного нарастающего фронта до нарастающего фронта. Система измеряет длину импульса и отправляет ее пользователю (последовательный, BLE и т. д.).

Редактировать 2: кто-то предложил "однократный расширитель пульса". Интересная концепция... Чем больше я изучаю ее, тем больше я думаю, что это очень жизнеспособное аппаратное решение ограничения скорости обработки AVR. Можно сказать, что это аппаратный «битбэнг». растягивая короткий импульс до пропорционально более длинного, который процесс захвата MCU может надежно/точно измерить. Примером может служить эта старая микросхема от Linear Tech. См. рис. 12 и рис. 13. https://www.analog.com/media /en/technical-documentation/data-sheets/6752fc.pdf

http://www.anderswallin.net/2014/02/pulse-stretcher-v1/

Самый короткий ожидаемый импульс будет около 70 мкс, который необходимо измерить с разрешением (около) 18 нс для точности, которая мне нужна. Поэтому я выбрал 10 нс для проектирования, чтобы учесть некоторую точность «накладных расходов». Это составляет от 4000 до 7000 отсчетов/тактов (18–10 нс) для сигнала 70 мкс.

Если я растяну этот же сигнал 70 мкс для измерения с помощью расширителя импульсов до 700 мкс и использую доступный в настоящее время интервал тиков 125 нс ATM32u4, я должен получить примерно ту же точность, что и при использовании тика 18 нс для 70 мкс. измеряемый сигнал.

Вот аналогичная проблема, на которую был дан ответ: https://electronics.stackexchange. com/questions/46922/удлинение-а-5-нс-импульс

, 👍1

Обсуждение

У вас есть часы, и они тикают только один раз в час. Какие биты вы собираетесь использовать, чтобы измерять секунды с помощью этих часов? Та же проблема с микро. Наименьшая единица времени, которую он знает, составляет 125 нс для часов с частотой 8 МГц. Нет ничего меньшего, чем это., @Delta_G

Что именно, по-вашему, означает слово «bitbanging»? Или это просто термин, который вы слышали?, @Delta_G

вы говорите о событии на 100 МГц... как часто происходит событие?, @jsotola

jsotola Это однократный импульс, который может возникать с интервалом не менее 1 секунды, но может происходить с интервалом в несколько секунд., @TommyS

Delta_G да, я слышал термин "bitbanging" (в общем), когда аппаратное обеспечение не справляется с задачами и используются "творческие" программные методы для экстраполяции данных для достижения точности/разрешения, которые не могут быть достигнуты с данным аппаратным обеспечением. Не могли бы вы описать это так, чтобы исправить мое неправильное понимание?, @TommyS

Delta_G, не могли бы вы ответить на другие части моего вопроса, не связанные с «битовым взрывом», которые определяют совершенно разные потенциальные решения? Спасибо за конструктивную помощь! Что делает этот форум замечательным, так это услышать предложения от таких людей, как вы, которые готовы потратить время на позитивное руководство, сосредоточенное на правильных частях вопросов, а также указывая на неправильные., @TommyS

Вам нужно «захватить» событие длительностью 10 нс, которое происходит не чаще одного раза в секунду? Непонятно, что нужно делать с этими событиями. Вам нужно измерить количество времени между событиями? Нужно ли реагировать на такое событие? С некоторыми внешними (TTL или выделенными I2C/SPI) компонентами таймера вы можете создать внешний таймер, способный это делать., @StarCat

Есть несколько Arduino-совместимых плат на основе ATtiny85. Он имеет быстрый асинхронный таймер, который может синхронизироваться с PLL на частоте 64 МГц. Это, вероятно, самый быстрый AVR, который вы можете получить, но у него нет блока захвата ввода., @Edgar Bonet

Вам нужно измерить длину или пульс, или просто его существование? Если вы последний, вам нужно растянуть этот импульс 10 нс до чего-то более длинного, чем 125 нс. Что-то вроде RC-фильтра., @Gerben

@ Эдгар Бонет, спасибо за отличное предложение. Это отличная возможность получить таймер 64 МГц от внутренних часов RC 8 МГц с помощью программного решения с 8-кратным масштабированием! Это дало бы мне 15,625 нс, что могло бы работать, если бы все теоретические расчеты были точными в реальном оборудовании. Я посмотрел на это. Это требует некоторого сопоставления контактов с Timer1 в качестве часов 64 МГц после включения PLL, но затем все равно потребуется настроить счетчик и т. д., и, к сожалению, из-за моих ограниченных знаний в кодировании на уровне реестра я предпочитаю не действовать таким образом. ., @TommyS

@ СтарКэт и Гербен. Мне нужно было бы измерить длину только одиночного импульса, а не непрерывного или изменяющегося сигнала. Длина до 70 мкс с точностью не менее 18 нс, но желательно 10 нс для учета аппаратных и т. д. неточностей. Этот однократный импульс мог повторяться не чаще, чем с интервалом в 1 секунду, но, скорее всего, с интервалом в несколько секунд. Сигнал представляет собой две положительные прямоугольные волны, формирующие импульс длительностью не менее 70 мкс от положительного нарастающего фронта до нарастающего фронта. Система измеряет длину импульса и отправляет его пользователю (последовательный, BLE и т. д.)., @TommyS

Пожалуйста, [отредактируйте] свой вопрос, чтобы добавить информацию. Я потратил несколько минут, чтобы найти здесь нужные вещи, и сделал это просто из любопытства. Большинство других этого делать не будут., @the busybee

кто-то предложил «растяжку пульса». Интересная концепция... http://www.anderswallin.net/2014/02/pulse-stretcher-v1/, @TommyS

@the busybee Сначала меня немного «раздражал» ваш комментарий, но я сразу же это исправил. Теперь, когда я вернулся и отредактировал, я хочу поблагодарить вас за то, что вы указали, что важные изменения/обновления должны быть опубликованы в основном посте. Это, безусловно, облегчило мой обзор / прогресс, и я уверен, что это также послужит другим читателям. В конце концов, это помогает мне, помогая другим лучше помогать мне. Спасибо еще раз!, @TommyS


2 ответа


Лучший ответ:

3

Вы ничего не можете сделать с процессорами AVR, о которых я знаю, которые могут работать на довольно медленных тактовых частотах, и я думаю, до 24 МГц. Так как ваши Uno/Leonardo/Micro работают на частоте 16 МГц, это будет лишь постепенным улучшением скорости (чтобы синхронизировать их на частоте 24 МГц).

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

При работе на частоте 16 МГц длительность каждого тактового импульса составляет 62,5 нс, что означает максимальное разрешение, которое он может рассчитывать. Я не понимаю, почему вы не можете считать со скоростью 62,5 нс (а не 125 нс), однако это не разрешение 10 нс.

Или существует автономная аналоговая или цифровая ИС, способная считывать импульсы с интервалом 10 нс, которые может обрабатывать Arduino?

Очень вероятно. Вероятно, есть специальные счетные чипы, которые сделают это за вас. Я не смотрел, но это из тех вещей, для которых был бы рынок. Такой чип, вероятно, будет использовать I2C или SPI для связи, что достаточно просто для интерфейса.

,

Мистер Гэммон. Очень ценю ваш вклад. Я изучал руководства / примеры микропроцессоров на вашем веб-сайте и включил их в различные проекты. Они очень ясны и исчерпывающе охватывают тему для таких людей, как я, которые не настолько опытны. Большое спасибо за это, искренне. Таким образом, основываясь на ваших и других комментариях выше, включая комментарии Эдгара Бонета, самым подходящим вариантом для AVR является Atiny85 с внутренним генератором, масштабируемым с 8x до 64 МГц через PLL, который теоретически может давать 15,625 нс тиков для таймера, который необходимо настроить. и т. д., но выше моих навыков. Буду искать более быстрые процессоры без AVR., @TommyS

Мистер Гаммон. Могу ли я иметь наглость задать вам два взаимосвязанных вопроса? #1: сослаться на 328p и 32u4, используя InputCaptureCounter/Timer (16-битный) и реализовав внешнее считывание импульсов (как в вашем примере ответа №12 в разделе "Таймеры"). Вы использовали таймер/счетчик ISR и ISR для переполнения. Сравнивая это с использованием импульсного считывания на основе attachInterrupt на выводах INT0/1 и учитывая время, необходимое для входа/выхода из ISR (@5us), будут ли оба решения иметь одинаковую присущую точность?, @TommyS

Г-н Гаммон. Это вопрос, связанный с номером 2: я объединил ваш пример InputCaptureCounter/Timer и пример вашего CPU Deep Sleep для 328p (используя 32u4). Это код, который я надеялся «усилить», чтобы считывать импульсы 70 мкс с разрешением 10 нс, и он находится здесь: https://arduinoprosto.ru/q/77978/input-capture-with-sleep-enabled-on . -atm32u4-плата-только-работает-каждую секунду-чтение/77981#77981, @TommyS

Возможно, если вы объясните более подробно свой проект? Зачем нужно измерять такие короткие импульсы?, @Nick Gammon

Мистер Гэммон Кто-то предложил "одноразовый расширитель пульса". Интересная концепция... Чем больше я изучаю ее, тем больше я думаю, что это очень жизнеспособное аппаратное решение ограничения скорости обработки AVR. Можно сказать, что это аппаратный «битовый взрыв» путем растягивания короткого импульса (через «таймер» RC) до пропорционально более длинного, который процесс захвата MCU может надежно/точно измерить. Требуется всего три дополнительных компонента. Примером может служить этот старый LTC6752 от Linear Tech. См. рис. 12 и рис. 13. https://www.analog.com/media/en/technical-documentation/data-sheets/6752fc.pdf, @TommyS

Если вы сделаете эту работу, я предлагаю вам опубликовать свой собственный ответ на свой вопрос, подробно описав, как вы это сделали, для будущих читателей., @Nick Gammon

Мистер Гэммон, я сделаю. Спасибо за помощь., @TommyS


3

1 нс – это миллиардная доля секунды. Часы с частотой 1 ГГц имеют время цикла 1 нс. Если у вас есть таймер, способный подсчитывать одиночные тактовые импульсы, вам понадобятся часы с частотой 1 ГГц, чтобы получить разрешение 1 нс. для 10 нс вам понадобится тактовая частота 100 МГц.

Вы не приблизитесь к разрешению 10 нс с устройством с тактовой частотой 8 МГц.

,

Дункан С, спасибо, что разложили на цифры. Да, явно потребуется микроконтроллер с более быстрым захватом ввода/таймером или выделенная внешняя микросхема, которая может делать то же самое. Хотите знать, подойдет ли быстрый АЦП? Я подозреваю, что преобразователь частоты в напряжение будет слишком неточным в эти периоды. А использование частотомера на 10 или 12, например, не будет работать с однократным импульсом длительностью/периодом всего 70 мкс., @TommyS

10 нс - очень короткая продолжительность. Ни в коем случае вы бы не использовали что-то вроде частоты к напряжению для измерения такой короткой продолжительности., @Duncan C