Аналоговые входы ардуино мега 2560

TGavtom
Offline
Зарегистрирован: 25.02.2017

Всем привет. Кто нибудь ,подскажите пожалуйста, почему аналоговый вход частоту более 500Гц не читает?(не корректно). С цифровыми вроде все нормально. Краснай график генератор 1500Гц (вход), черный его аналог (выход с ардуино).

цифра

Аналог

 

Lictor
Offline
Зарегистрирован: 01.10.2015

Не успевает?

TGavtom
Offline
Зарегистрирован: 25.02.2017

Почему? В описании 10.000раз в сек.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Всегда выкладывайте скетч как положено, а не картинками. И глаза не казённые и номеров строк нет для обсуждения.

2. Не знаю какое описание Вы имеете в виду и что в нём написано, а только сделайте следующее.

а) в Вашем скетче поставьте инвертирование пина 14 по любому условию (просто одинаковый код в обоих случаях). Всё остальное оставьте как есть.
б) посмотрите осциллографом получившийся сигнал. Частота этого сигнала равна 1/2 частоты с которой Вы читаете аналоговый порт.
в) сделайте выводы

TGavtom
Offline
Зарегистрирован: 25.02.2017

Объясните, пожалуйста, причём 14 пин

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для Ардуино Уно/Мини/Нано "14" и "A0" это одно и то же.

Но в 2560 это не так, поэтому пишите не 14, а А0.

Но, вероятноо всего, имелся в виду пин 7.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano прав, я имел в виду 7-пин с которым Вы и так работает, просто что-то переклинило.

Замерили частоту, что получилось?

TGavtom
Offline
Зарегистрирован: 25.02.2017
int PIN=7;
int pin=A0;
int q;
void setup() {
pinMode(PIN, OUTPUT);
pinMode(pin, INPUT);
}

void loop() {
 q=analogRead(pin);
if (q<500) digitalWrite(PIN,0);
else digitalWrite(PIN,1);
}

НЕ МОГУ понять, что Вы предлогаете сделать. Исправте в коде.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
int PIN=7;
int pin=A0;
int q;
int LED = HIGH;

void setup() {
pinMode(PIN, OUTPUT);
pinMode(pin, INPUT);
}

void loop() {
 q=analogRead(pin);
LED=!LED;
digitalWrite(PIN,LED);

}

 

Волшебник
Offline
Зарегистрирован: 22.12.2016

Наблюдаемая картина совершенно нормальная. Ардуино тратит 120 микросекунд на аналогРеад, поскольку сигналы внешнего генератора и старт аналогРеад не синхронны, есть вероятность что ардуино начинает мерить как раз перед тем как вход сменится с 0 на 1, и пока 120 мкс не пройдёт ардуино не видит вход, потом она дрыгнет дигиталВрайт и начнёт новый цикл. И опять есть вероятность, что сигнал на входе Уже сменился с 1 на 0, как раз перед этим, и ардуино опять померяет 0. Это эффект не синхронных сетей

TGavtom
Offline
Зарегистрирован: 25.02.2017

Это будет работать?

TGavtom
Offline
Зарегистрирован: 25.02.2017

У цифрового входа какая частота считывания?
По Осциллографу 10мкс.
10мкс, 10 бит, получиться 100мкс.
Осциллограф на аналоговом входе не получается, печально.

Волшебник
Offline
Зарегистрирован: 22.12.2016

ДигиталРид намного быстрее, где-то 4.7 мкс. 

Насчёт осцилографа, погуглите. Есть способы поднять быстродействие АЦП под 100кГц, что для нормального прибора всё равно мало, но под 10кГц (10 отсчётов на период) для аудио может и сойдёт. ацп-мега-ардуино-регистры в поиск

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

AlexeySh
Offline
Зарегистрирован: 16.01.2017

А если подойти с другого конца? Для чего вам нужно читать сигнал с аналогового входа? Вы читаете прямоугольные инпульсы. Так может нужно просто переключить аналоговый вход в цифровой режим и не заморачиваться?

TGavtom
Offline
Зарегистрирован: 25.02.2017

А как же форма сигнала?

TGavtom
Offline
Зарегистрирован: 25.02.2017

При подключении serial вообще перестаёт работать, даже цифровые входы.

AlexeySh
Offline
Зарегистрирован: 16.01.2017

TGavtom пишет:
А как же форма сигнала?

Так вы же прямоугольные импульсы читаете?

TGavtom
Offline
Зарегистрирован: 25.02.2017

Прямоугольные, это так потестить.

AlexeySh
Offline
Зарегистрирован: 16.01.2017

TGavtom пишет:
У цифрового входа какая частота считывания? По Осциллографу 10мкс. 10мкс, 10 бит, получиться 100мкс. Осциллограф на аналоговом входе не получается, печально.

Странная у вас математика получается. Вы в смысле думаете что если 10мкс умножить на 10bit, то получите 100мкс?

Максимальная частота, с которой можно считывать цифровой сигнал для Mega 2560 равна тактовой частоте микроконтроллера, т. е. 16 000 000. Но только если использовать ассемблер или оптимизированный компилятор C с ассемблерными вставками. digitalRead() даст скорость в несколько раз меньше, так как содержит несколько лишних команд на ассемблере.

С аналоговым 120 мкс. Но для качественного чтения нужно отключить все прерывания.

А вообще сколько раз уже говорил: не делаются такие вещи на Ардуино. На микроконтроллерах PIC хватило бы оптимизированного компилятора С, на Atmel это как минимум С с ассемблерными вставками. Проверял, поэтому знаю о тем говорю.

Волшебник
Offline
Зарегистрирован: 22.12.2016

AlexeySh пишет:
Максимальная частота, с которой можно считывать цифровой сигнал для Mega 2560 равна тактовой частоте микроконтроллера, т. е. 16 000 000. 

С аналоговым 120 мкс. Но для качественного чтения нужно отключить все прерывания.

Я поправлю, макс. скорость считывания для 16МГц тактовой, равна 8МГц - там логика синхронизации портов действует.

Скорость аналогРеад не зависит от прерываний, АЦП - отдельное устройство. 

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Волшебник пишет:

AlexeySh пишет:
Максимальная частота, с которой можно считывать цифровой сигнал для Mega 2560 равна тактовой частоте микроконтроллера, т. е. 16 000 000. 

С аналоговым 120 мкс. Но для качественного чтения нужно отключить все прерывания.

Я поправлю, макс. скорость считывания для 16МГц тактовой, равна 8МГц - там логика синхронизации портов действует.

Скорость аналогРеад не зависит от прерываний, АЦП - отдельное устройство. 

По логике синхронизации портов - посмотрю, возможно и так. Хотя такого в даташите не встречал. Задержка от 0,5 до 1,5 такта есть. Задержка в один такт при переключении режимов порта - также присутствует. Но про снижение скорости в 2 раза - такого нигде не встречал. Так что если не сложно, прошу подсказать откуда эта информация.

Скорость analogRead от прерываний может и не зависит, а вот результат чтения как показала практика может быть некорректен, если во время выполнения analogRead обрабатываются прерывания.

Волшебник
Offline
Зарегистрирован: 22.12.2016

В 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...

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Волшебник пишет:

В 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 МГц.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

АЦП можно вовсе читать В ПРЕРЫВАНИИ, оно есть. Да, и скорость чтения может быть значительно выше заявленной в 15k, особенно при переходе на 8-и битный режим, если он устраивает. Вплоть до мегагерцев. АЦП - отдельное устройство и никак не зависит от программы МК или других устройств Мег.