Arduino: еще два аналоговых входа!

Я имею дело с аналоговыми датчиками. У меня есть простая плата Arduino Lilypad только с 4 аналоговыми входами. Теперь мне нужны еще два датчика, и я нашел в сети эту схему:введите описание изображения здесь

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

Затем по ссылке я прочитал это:

Можно рассчитать фактическое сопротивление по показаниям, но, к сожалению, различия в плате IDE и Arduino сделают его несовместимым. Имейте в виду, что если вы меняете версии ОС IDE, или используете Arduino 3,3 В вместо 5 В, или переходите с Arduino 16 МГц на 8 МГц (например, lilypad), могут быть различия из-за того, сколько времени требуется для чтения. стоимость булавки. Обычно это не имеет большого значения, но может затруднить отладку вашего проекта, если вы этого не ожидаете!

Я не большой специалист по ардуино и не понимаю, что мне нужно изменить для lilypad.

Любой совет может быть оценен!

Ответы (2)

Это, безусловно, добавит задержки, поскольку вы опрашиваете контакт в цикле блокировки.

while (digitalRead(RCpin) == LOW) { // count how long it takes to rise up to HIGH
reading++;      // increment to keep track of time 

if (reading == 30000) {
  // if we got this far, the resistance is so high
  // its likely that nothing is connected! 
  break;           // leave the loop
}

Предполагая, что ваш компилятор может чрезвычайно эффективно оптимизировать код, этот цикл займет около 4 строк кода для выполнения, так как вы должны прочитать вывод, затем сравнить его со значением, а затем перейти на основе результата (я был бы очень впечатлен, если бы вы можете получить несколько инструкций). Далее предположим, что выполнение каждой из этих инструкций занимает всего 1 такт (вероятно, это также займет больше времени, но это поможет решить проблему). Эта процедура может занять не более :

М а Икс р о ты т я н е Т я м е "=" л о о п я т е р а т я о н с × я н с т р ты с т я о н с л о о п я т е р а т я о н × С е с о н г с я н с т р ты с т я о н с

М а Икс р о ты т я н е Т я м е "=" 30 , 000   я т е р а т я о н с × 4   я н с т р ты с т я о н с л о о п я т е р а т я о н × С е с о н г с 8 , 000 , 000   я н с т р ты с т я о н с

М а Икс р о ты т я н е Т я м е "=" 15   м С

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

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

Редактировать

На первый взгляд по вашей картинке в сочетании с тем фактом, что вы упомянули звук, я подумал, что вы измеряете вход микрофона. Однако похоже, что вы просто используете чувствительный к силе резистор (FSR), который является просто датчиком давления. Если вам не нужно знать количество давления, а только то, что оно было нажато, вам не нужно преодолевать все трудности с поиском точного показания. Вы можете просто использовать любой цифровой вход, генерирующий прерывания, если вы выберете правильное значение резистора (вместо конденсатора). Вы просто установите цифровой вывод для генерации прерываний по переднему фронту и выберите резистор, который даст вам изменение состояния (низкое/высокое) с желаемой силой для вашего прикосновения. Тогда вы будете знать каждый раз, когда был отправлен FSR, и сможете обрабатывать его без блокировки, обеспечивая наименьшую возможную задержку.

"как минимум" или "максимум"? Максимум ( 30000 × n ) / 8 МГц, где n — количество циклов процессора, потраченных на цикл (я думаю, порядок n = 4 цикла. Снижение ограничения ускоряет преобразование, но снижает точность.
@jippie - Хороший улов! Тонкое, но важное отличие. Отредактировано соответственно.

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

  1. Утвердить контактный минимум
  2. Убедитесь, что штифт находится достаточно низко, чтобы разрядить конденсатор.
  3. Включить прерывание и сбросить таймер
  4. Сделайте контакт входным (конденсатор начнет заряжаться)
  5. Выполните свой код
  6. Когда происходит прерывание, считайте значение таймера (это ваше измеренное значение) и установите низкий уровень на выводе.
+1: это способ измерения времени RC с использованием цифрового входа. Особенно мне нравятся пинты.
@stevenvh Исправлено. Сделайте ошибку, скопируйте и вставьте, и вот как это делается :-)