Максимальная частота входного сигнала, которую можно точно отслеживать на выводе GPIO?

frequency speed

Все началось с того, что я захотел использовать Arduino для создания тахометра. Теперь все это работает нормально, но мне стало интересно, какой самый высокочастотный цифровой сигнал я могу прочитать?

Поэтому я создал простой тестовый скетч и запустил его как на Nano, так и на ESP32. В результате получилось около 6300Гц на обоих. Все, что выше этого, дает хаотичные результаты. Это несколько ниже, чем я ожидал.

Кто-нибудь сделал лучше, чем это?

, 👍1

Обсуждение

Делать все это в программном обеспечении, да, это будет медленно. В большинство микроконтроллеров встроено оборудование, которое может измерять диапазоны МГц., @Majenko

можно использовать дешевую 8-битную микросхему счетчика в качестве делителя частоты; просто подайте последний бит в MCU, где сейчас находится ваш тахометр, и подайте тахометр в часы / tirgger микросхемы., @dandavis


2 ответа


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

5

Как писал Майенко, когда вы полагаетесь только на программное обеспечение для измерения частоты на выводе ввода-вывода, оно всегда будет довольно медленным. И это также зависит от кода, который вы используете. Такие функции, как digitalRead (), всегда работают медленнее, чем непосредственно работа с управляющими регистрами вывода (Ссылки). Поскольку вы не показали свой код, мы не можем сказать об этом больше.

Если вам нужно измерять более высокие частоты или вы хотите делать другие промежуточные вещи (например, выводить данные куда-то), лучше использовать микроконтроллеры, создающие аппаратное обеспечение. Существует несколько способов измерения частоты. 2 сразу приходят мне на ум:

  • Вы можете назначить ExternalInterrupt или PinChangeInterrupt сигнальному контакту (здесь выбор контактов ограничен), который срабатывает каждый раз, когда вы видите восходящий (или падающий) край сигнала. В ISR (Interrupt Service Routine) вы можете подсчитать переменную. Это значение - количество восходящих (или нисходящих) ребер, то есть периодов сигнала. Частота - это это значение, деленное на продолжительность измерения. Каждый раз, когда вы вычисляете частоту, вы сбрасываете счетчик; считывая его снова через определенное время. Это должно быть лучше, чем просто опрос, но это не самое лучшее. (Обратите внимание, что PinChangeInterrupt срабатывает на каждом ребре, поэтому вы должны разделить частоту на 2)

  • Вы можете настроить неиспользуемый аппаратный таймер/счетчик для использования вашего сигнала в качестве внешнего источника синхронизации. Пусть он будет считать до тех пор, пока не переполнится (или не достигнет определенного вами значения), и пусть он вызовет прерывание. Поскольку фреймворк Arduino уже использует Timer0 для хронометража, вы можете разделить максимальное значение таймера/счетчика на прошедшее время, и вы получите частоту. Я думаю, что это может привести вас в диапазон МГц.(Как и в случае с PinChangeInterrupt, счетчик будет увеличиваться на каждом ребре, так что здесь снова коэффициент 2)

Оба способа рассчитают частоту как среднее значение за определенное время. Если у вас есть изменяющаяся частота, вы можете манипулировать частотой измерений. В первом случае вы можете изменить интервал, в котором вы считываете переменную счетчика. Во втором случае вы можете изменить максимальное значение, до которого будет отсчитываться Таймер/Счетчик.

какой самый высокочастотный цифровой сигнал я мог бы прочитать?

(Я предполагаю, что вы просто хотите прочитать частоту сигнала) Это зависит от многих факторов. Если мы используем второй случай сверху (настройка аппаратного таймера в качестве счетчика, подключенного к сигналу), то имеем ограничение на максимальную частоту, которую мы можем обеспечить. Я нашел соответствующую часть в техническом описании Atmega328p (который является микроконтроллером на Nano):

Каждый полупериод применяемого внешнего тактового сигнала должен быть длиннее одного системного тактового цикла, чтобы обеспечить правильную выборку. Внешние часы должны гарантированно иметь менее половины тактовой частоты системы (f ExtClk < f clk_I/O /2) при рабочем цикле 50/50%. Поскольку детектор краев использует дискретизацию, максимальная частота внешних часов, которые он может обнаружить, равна половине частоты дискретизации (теорема выборки Найквиста). Однако из-за изменения тактовой частоты системы и рабочего цикла, вызванного допусками источника генератора (кристалл, резонатор и конденсаторы), рекомендуется, чтобы максимальная частота внешнего тактового источника была меньше f clk_I/O /2.5.

Таким образом, мы должны оставаться ниже тактовой частоты контроллеров, деленной на 2,5, что будет 16 МГц / 2,5 = 6,4 МГц для Nano. Но прежде чем вы достигнете этого, ваш код может привести к дальнейшим задержкам, которые сделают измерение менее точным. Это зависит от реализации.

,

Уважаемые Крис и Майенко, Спасибо за отличные ответы. Я попробовал использовать сигнал для запуска прерывания. Это немного помогло. Я не пытался подавать сигнал в аппаратный счетчик. В данный момент мне не нужно этого делать, но это полезно знать., @Rob W


1

Мой дакиноскоп https://www.daqarta.com/dw_rroo.htm может использовать серийную выборку для захвата 1024 образцов с высокой частотой дискретизации, а затем отправлять их на главный компьютер через USB для отображения и анализа. Для цифровых входов он может получать более 400 000 выборок в секунду на UNO, причем каждая выборка представляет собой считывание 8 контактов, чтобы сделать один байт в записи. Он делает это, считывая цифровой порт (PIND или PINB) в замкнутом цикле с дополнительной задержкой при каждом считывании для более медленной выборки. DaquinOscope является бесплатным и использует DaqPort с открытым исходным кодом https://www.daqarta.com/dw_rraa.htm, оба включены в Daqarta, в комплекте с кодом, который вы можете изменить по желанию.

,

Ух ты! - Я только что просмотрел ваш сайт - много интересного. Большое спасибо, но вы должны были предупредить меня - я легко могу потерять здесь недели своей жизни. У меня есть смутное стремление создать себе область действия на основе arduino, но я хочу иметь возможность использовать Android-устройство (телефон / планшет) для пользовательского интерфейса., @Rob W