Аналоговые входы ардуино мега 2560
- Войдите на сайт для отправки комментариев
Сб, 25/02/2017 - 10:31
Всем привет. Кто нибудь ,подскажите пожалуйста, почему аналоговый вход частоту более 500Гц не читает?(не корректно). С цифровыми вроде все нормально. Краснай график генератор 1500Гц (вход), черный его аналог (выход с ардуино).
цифра
Аналог
Не успевает?
Почему? В описании 10.000раз в сек.
1. Всегда выкладывайте скетч как положено, а не картинками. И глаза не казённые и номеров строк нет для обсуждения.
2. Не знаю какое описание Вы имеете в виду и что в нём написано, а только сделайте следующее.
а) в Вашем скетче поставьте инвертирование пина 14 по любому условию (просто одинаковый код в обоих случаях). Всё остальное оставьте как есть.
б) посмотрите осциллографом получившийся сигнал. Частота этого сигнала равна 1/2 частоты с которой Вы читаете аналоговый порт.
в) сделайте выводы
Объясните, пожалуйста, причём 14 пин
Для Ардуино Уно/Мини/Нано "14" и "A0" это одно и то же.
Но в 2560 это не так, поэтому пишите не 14, а А0.
Но, вероятноо всего, имелся в виду пин 7.
andriano прав, я имел в виду 7-пин с которым Вы и так работает, просто что-то переклинило.
Замерили частоту, что получилось?
НЕ МОГУ понять, что Вы предлогаете сделать. Исправте в коде.
Наблюдаемая картина совершенно нормальная. Ардуино тратит 120 микросекунд на аналогРеад, поскольку сигналы внешнего генератора и старт аналогРеад не синхронны, есть вероятность что ардуино начинает мерить как раз перед тем как вход сменится с 0 на 1, и пока 120 мкс не пройдёт ардуино не видит вход, потом она дрыгнет дигиталВрайт и начнёт новый цикл. И опять есть вероятность, что сигнал на входе Уже сменился с 1 на 0, как раз перед этим, и ардуино опять померяет 0. Это эффект не синхронных сетей
Это будет работать?
У цифрового входа какая частота считывания?
По Осциллографу 10мкс.
10мкс, 10 бит, получиться 100мкс.
Осциллограф на аналоговом входе не получается, печально.
ДигиталРид намного быстрее, где-то 4.7 мкс.
Насчёт осцилографа, погуглите. Есть способы поднять быстродействие АЦП под 100кГц, что для нормального прибора всё равно мало, но под 10кГц (10 отсчётов на период) для аудио может и сойдёт. ацп-мега-ардуино-регистры в поиск
В проектах есть нормально разжеванные темы за осцилографы. В данном конкретном вопросе ситуевина больше смахивает на вклинивания обработчика прерываний от 0-го таймера..
А если подойти с другого конца? Для чего вам нужно читать сигнал с аналогового входа? Вы читаете прямоугольные инпульсы. Так может нужно просто переключить аналоговый вход в цифровой режим и не заморачиваться?
А как же форма сигнала?
При подключении serial вообще перестаёт работать, даже цифровые входы.
Так вы же прямоугольные импульсы читаете?
Прямоугольные, это так потестить.
Странная у вас математика получается. Вы в смысле думаете что если 10мкс умножить на 10bit, то получите 100мкс?
Максимальная частота, с которой можно считывать цифровой сигнал для Mega 2560 равна тактовой частоте микроконтроллера, т. е. 16 000 000. Но только если использовать ассемблер или оптимизированный компилятор C с ассемблерными вставками. digitalRead() даст скорость в несколько раз меньше, так как содержит несколько лишних команд на ассемблере.
С аналоговым 120 мкс. Но для качественного чтения нужно отключить все прерывания.
А вообще сколько раз уже говорил: не делаются такие вещи на Ардуино. На микроконтроллерах PIC хватило бы оптимизированного компилятора С, на Atmel это как минимум С с ассемблерными вставками. Проверял, поэтому знаю о тем говорю.
С аналоговым 120 мкс. Но для качественного чтения нужно отключить все прерывания.
Я поправлю, макс. скорость считывания для 16МГц тактовой, равна 8МГц - там логика синхронизации портов действует.
Скорость аналогРеад не зависит от прерываний, АЦП - отдельное устройство.
С аналоговым 120 мкс. Но для качественного чтения нужно отключить все прерывания.
Я поправлю, макс. скорость считывания для 16МГц тактовой, равна 8МГц - там логика синхронизации портов действует.
Скорость аналогРеад не зависит от прерываний, АЦП - отдельное устройство.
По логике синхронизации портов - посмотрю, возможно и так. Хотя такого в даташите не встречал. Задержка от 0,5 до 1,5 такта есть. Задержка в один такт при переключении режимов порта - также присутствует. Но про снижение скорости в 2 раза - такого нигде не встречал. Так что если не сложно, прошу подсказать откуда эта информация.
Скорость analogRead от прерываний может и не зависит, а вот результат чтения как показала практика может быть некорректен, если во время выполнения analogRead обрабатываются прерывания.
В 2 раза это экспериментально установленная величина, в действительности даже медленнее. Измерить просто - считать пульсы на ICP входе первого таймера, где-то выше 7 МГц он перестаёт считать правильно. Но это всё ещё зависит от скважности, проще за ориентир взять 2. Здесь так и поступили
<The maximum input frequency is about 8 MHz when signal duty cycle is 50%.>
http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-freque...
В 2 раза это экспериментально установленная величина, в действительности даже медленнее. Измерить просто - считать пульсы на ICP входе первого таймера, где-то выше 7 МГц он перестаёт считать правильно. Но это всё ещё зависит от скважности, проще за ориентир взять 2. Здесь так и поступили
<The maximum input frequency is about 8 MHz when signal duty cycle is 50%.>
http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-freque...
Ну так и должно быть, если считать импульсы. Чтобы посчитать импульсы нужно измерить два состояния: 0 и 1. Соответсвенно при подсчете импульсов более 8 МГц измерить невозможно. Но мы то говорим о числе измерений. А число измерений в 2 раза больше, чем частота импульсов. Т. е. те самые 16 МГц.
АЦП можно вовсе читать В ПРЕРЫВАНИИ, оно есть. Да, и скорость чтения может быть значительно выше заявленной в 15k, особенно при переходе на 8-и битный режим, если он устраивает. Вплоть до мегагерцев. АЦП - отдельное устройство и никак не зависит от программы МК или других устройств Мег.