2014-08-27 5 views
2

Я хотел бы знать, есть ли способ подсчета цифровых импульсов на Arduino БЕЗ реализации прерывания.Arduino - подсчет импульсов без прерывания

Дополнительное описание: У меня есть датчик, который выводит цифровые импульсы пропорционально некоторому измерению, которое я хочу рассчитать.

+0

Да, вы можете сделать это путем опроса, тем не менее, ваш процессор занят, и вы должны знать, что любое состояние, которое может прослужить меньше времени, чем ваш интервал опроса, может быть пропущено. –

+0

Способ подсчета импульсов без ISR - использовать счетчики аппаратных средств, периодически обрабатывая их состояние и устанавливая ограничение на количество, чтобы избежать переполнения. – manatttta

ответ

3

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

Atmel AVR, что большинство Arduinos основаны на оборудовании счетчика/таймера, которое будет считать импульсным во входном штыре напрямую. Все, что вам нужно сделать, это настроить аппаратное обеспечение для работы счетчика и прочитать регистр счетчика. Существует небольшая сложность для 16-битных счетчиков на 8-битном устройстве, но это легко преодолеть. Arduino настраивает таймеры для операций PWM по умолчанию, но это можно переопределить, как описано here (подробнее см. Руководство пользователя AVR) - вам нужно использовать таймер/счетчик в режиме CTC.

ARM на базе Arduninos и почти любой другой микроконтроллер будут иметь аналогичные аппаратные средства; некоторые из них обладают большей гибкостью, благодаря чему штыри могут использоваться для подсчета оборудования.

На AVR у вас есть 8 и 16-битные счетчики, если вам нужны большие счета, вам, возможно, придется обработать прерывание переполнения. Если вы будете регулярно проверять счетчик, вы сможете обрабатывать даже это без прерываний, имея возможность опроса со значительно меньшей и, возможно, апериодической скоростью, чем скорость входных импульсов, просто опросив флаг переполнения перед следующим переполнением.

В вашем случае вам, вероятно, необходимо прочитать количество импульсов в регулярный период, который меньше времени, в течение которого счетчик будет переполняться с максимальной ожидаемой частотой пульса. Так, например, если вы использовали 8-битный счетчик, а максимальная частота пульса составляла 1 кГц, вам нужно было бы опросить каждые 256/1000 секунд или меньше, но наибольшую точность можно получить, сделав этот период как можно дольше. Так, например, вы могли бы иметь что-то вроде следующего (это не реальный код, и только фрагмент):

for(;;) 
{ 
    delayMS(250) ; 
    frequency = 4 * readCounter() ; 
} 

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

for(;;) 
{ 
    int start = getMillisec() ; 

    while(!counterOVF()) 
    { 
     // Do nothing (or something useful but quick) 
    } 

    int t = getMillisec() - start ; 
    frequency = 256 * t/1000 ; 
} 
+0

Большое спасибо за ваш вопрос. Если я правильно понял, ваша первая идея состоит в том, чтобы отключить импульсы с помощью аппаратного обеспечения, а второй - все время, когда процессор занят. Проблема в том, что мой микроконтроллер полностью загружен (поэтому простой ISR, увеличивающий счетную переменную, не будет работать) и не может быть опросом, поскольку он должен выполнять другие задачи.Кроме того, у меня больше нет аппаратных счетчиков. Есть ли другие альтернативы? Я слышал, что это возможно, используя аналоговые порты (полагаясь на сходство с PWM). Большое спасибо – manatttta

+0

В обоих случаях счетчик аппаратных средств выполняет подсчет, во втором примере мой опрос проверяет флаг переполнения, но это просто для демонстрации принципа, это не фундаментальное решение; он может в равной степени быть обработчиком прерываний - преимущество состоит в том, что вы получаете одно прерывание для каждых 256 импульсов (при условии 8 бит счетчика), а не каждый импульс, поэтому накладные расходы прерывания намного ниже. – Clifford

+0

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

1

Вы можете использовать аналоговый, с немного цифровым перед ним. , если ваша максимальная частота ввода составляет 1 кГц, используйте этот сигнал для запуска моностабильной (с кратковременным срабатыванием) с импульсным выходом 1 мс (1/fмакс). Затем фильтр нижних частот (R последовательно, C на землю и повторите для многополюсного), и, наконец, прочитайте аналоговое напряжение на этом последнем конденсаторе. Если R * C относительно мал, аналоговый сигнал будет реагировать быстро, но имеет рябь. Если он большой, время реакции будет страдать, но сигнал будет более стабильным.

Смежные вопросы