Считывание величины переменного напряжения

favidu
Offline
Зарегистрирован: 12.10.2017
Ардуино считывает значение напряжения на аналоговом входе от 0 до 5 В и преобразовывает в код от 0 до 1023.
Время на преобразование 100 микросекунд.
Если это верно, то вопросы:
 
1. Можно ли подавать на аналоговый вход переменное напряжение?
 
2. Что будет, если я подам на аналоговый вход переменное напряжение?
Форма сигнала близкая к синусу.
Частота около 500Гц.
Амплитуда 10 вольт (условно положительный полупериод в пике 5 вольт и условно отрицательный полупериод в пике -5 вольт).
Я правильно понимаю, что ардуино просто не различит положительного и отрицательного напряжения, а будет выдавать значения по каждому полупериоду от 0 до 1023.
 
3. Есть ли возможность считывать величину напряжения быстрее (100 микросекунд - многовато) ?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

favidu пишет:

1. Можно ли подавать на аналоговый вход переменное напряжение?
 

Нет.

favidu пишет:

2. Что будет, если я подам на аналоговый вход переменное напряжение?
Форма сигнала близкая к синусу. Частота около 500Гц. Амплитуда 10 вольт
 

Выйдет дым (если поставите рядом правильно подключённый MQ2, то может светодиод загорится :)

favidu пишет:

Я правильно понимаю, что ардуино просто не различит положительного и отрицательного напряжения, а будет выдавать значения по каждому полупериоду от 0 до 1023.

Неправильно. См. выше.

favidu пишет:

3. Есть ли возможность считывать величину напряжения быстрее (100 микросекунд - многовато) ?

Есть. За счёт уменьшения разрядности.

favidu
Offline
Зарегистрирован: 12.10.2017

Спасибо за ответ.

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

favidu, если хотите работать с таким сигналом, перед подачей на Ардуино его следует:

1. Уменьшить в 2 раза (было: от -5В до +5В, стало: от -2.5В до +2.5В).

2. Добавить положительное смещение 2.5В (стало: от 0В до 5В).

Если Вы подадите на Ардуино сигнал без смещения, то в отрицательном полупериоде в зависимости от выходного сопротивления источника будет один из следующих вариантов:

- пойдет дым,

- Ардуино покажет 0.

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

Вот, примерно так, как Вам написал andriano я обрабатываю вот такой сигнал. Как видите, он в амплитуде ещё больше Вашего.

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

- Ардуино покажет 0.

Чего вполне достаточно. Если верны предположение что напряжение действительно синус и без постоянной составляющей (или симметричный относительно 0 сигнал), то потеря отрицательной полуволны - невелика потеря, т.к. положительная точно такая, только знак иной. Оцифрофывайте и измеряйте только положительную. Это сильнол проще по схемотехнике. Делителем ослабте чтоб не превышало опорное напряжение АЦП (тут варианты в зависимости от контролера есть разные от 1 до 5В), заодно и ток ограничится чтоб ардуино не задымилось. Все очень просто, но сейчас Вам насоветуют и ОУ и оптронов и схем смещения уровня )))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Любят у нас навешивать одну рухлядь на другую. Можно просто взять скоростной tru-diff АЦП, и подавать переменку без всяких хлопот прямо на вход (через делитель конечно). Например ads8887 -  18 бит, тру диф, 100 тыщ семплов в секунду.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

8887 - недешёвая штуковина, однако...
Как ещё один вариант - RMS to DC converter, к примеру AD736, AD737.

AlexZZZ
Offline
Зарегистрирован: 22.07.2016

favidu пишет:

Время на преобразование 100 микросекунд.
3. Есть ли возможность считывать величину напряжения быстрее (100 микросекунд - многовато) ?

Наверное стоит уточнить, что ТС пишет все же не о времени преобразования, а о времени выполнения analogRead() ?

Курим даташит, к примеру Атмега 328, время преобразования 13 тактов (иногда 25 :) ), такт 62,5 нС итого 812,5 нС.

При включении конвеера вполне можно оперировать и микросекундными таймингами.

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

AlexZZZ пишет:

Курим даташит, к примеру Атмега 328, время преобразования 13 тактов (иногда 25 :) ), такт 62,5 нС итого 812,5 нС.

Наверное, не в затяжку курили. Покурите ещё.

AlexZZZ
Offline
Зарегистрирован: 22.07.2016

ЕвгенийП пишет:

AlexZZZ пишет:

Курим даташит, к примеру Атмега 328, время преобразования 13 тактов (иногда 25 :) ), такт 62,5 нС итого 812,5 нС.

Наверное, не в затяжку курили. Покурите ещё.

Может быть снизойдете и просто конкретно укажете где вкралась ошибка? а то потерялси хрустальный шар куда-то... 

A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched on (ADEN in
ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuitry.
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AlexZZZ, Вас не насторожтли "ADC clock cycles"? Как бы сам термин намекает, что clock cycles бывают не только ADC, и что "CPU clock cycles" могут не совпадать с "ADC clock cycles".

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

AlexZZZ пишет:

Может быть снизойдете и просто конкретно укажете где вкралась ошибка? а то потерялси хрустальный шар куда-то... 

A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched on (ADEN in
ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuitry.

Вы цитируете 4-ый абзац раздела 24.4 даташита.

"Может быть снизойдете и просто" прочитаете заодно и первый абзац этого раздела? "By default, the successive approximation circuitry requires an input clock frequency between 50kHz and 200kHz" и объясните откуда взялись 62,5 нс?

Курить надо полностью, до фильтра, а не бросать недокуренные окурки после первой же фразы.

favidu
Offline
Зарегистрирован: 12.10.2017

Как дилетант в программировании и электротехнике, читая заведенную мною же тему, испытываю смешанные чувства. Средневековый человек высказался бы примерно так: "Полубоги говорят о вечном..." ))) .

Еще раз спасибо всем, лучше начну с зажигания поочереди диодиков.

AlexZZZ
Offline
Зарегистрирован: 22.07.2016

Посыпая голову пеплом :)

Таки признаю, при просчете пропустил про такты самого АЦП.

Позволю от себя  только заметить, что не всегда что-то не дописано именно из-за недокуренности, можно ведь просто упустить?

Совсем недавно использовал:

  ADCSRA = (1<<ADEN) | (1<<ADATE) | (1<<ADPS2)| (1<<ADPS1);                             //  разрешаем работу АЦП в режиме конвеера на частоте 250kHz

длительность выходит 52 мкС, все же равно можно говорить о микросекундах против сотен милисекунд?

Logik
Offline
Зарегистрирован: 05.08.2014

favidu пишет:

Еще раз спасибо всем, лучше начну с зажигания поочереди диодиков.

Без шуток, очень верное решение! Но и оцифровка аналогового, если дальше analogRead не лезть - вполне по силам начинающего. Просто подайте ваш сигнал на цепочку из двух резисторов, см. рис2 тут - http://www.sxemotehnika.ru/delitel-napryazheniya.html. Делитель в три раза для начала подойдет. В лупе в сириал выводите значение analogRead и время micros. Возможно данных будет слишком много, сириал будет несправлятся, добавте делеи. Посмотрите что выходит, идеи должны будут появится.

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

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

AlexZZZ пишет:

  ADCSRA = (1<<ADEN) | (1<<ADATE) | (1<<ADPS2)| (1<<ADPS1);                             //  разрешаем работу АЦП в режиме конвеера на частоте 250kHz

длительность выходит 52 мкС, все же равно можно говорить о микросекундах против сотен милисекунд?

Не, ну говорить можно, но с оговоркой. Вы же настроили делитель на 250кГц (сам не проверял, у Вас так в комментарии написано), а даташит рекоммендует не вылезать за 200. При этом там же написано, что настраивать больше можно (я и 500 кГц настраивал), но за счёт потери точности, что у Вас и сделано.  Когда не нужно 10 разрядов, а скорость нужна повыше - ради Бога никто не мешает. А вот если нужны все 10 разрядов, то при 16МГц контроллера допустимый делитель только 128, частота получается 125кГц, значит один такт = 1/125000 = 8 микросекнд, а 13 тактов - 8*13 = 104 микросекунды. Вот откуда сотни и взялись.

Я, кстати, писал об этом (повышенной частоте) ТС в первом же посте #1 (последняя строка) 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AlexZZZ пишет:

Совсем недавно использовал:

  ADCSRA = (1<<ADEN) | (1<<ADATE) | (1<<ADPS2)| (1<<ADPS1);                             //  разрешаем работу АЦП в режиме конвеера на частоте 250kHz

длительность выходит 52 мкС, все же равно можно говорить о микросекундах против сотен милисекунд?

Вам нужно развивать внимательность, она у вас около ноля. Вот смотрите, про тактовую вы с подсказкой всё таки поняли, и в первой же фразе говорите о "сотнях миллисекунд", но речь шла про скорость отработки analogRead, которая 100 микросекунд. 

AlexZZZ
Offline
Зарегистрирован: 22.07.2016

Да, походу я тут лишку хватанул, и с собственной не внимательностью влетел... :(

Pyotr
Offline
Зарегистрирован: 12.03.2014

Если даташит тяжело "курится", у Nick Gammon есть хорошая тема про АЦП (Ардуино).

Гриша
Offline
Зарегистрирован: 27.04.2014

favidu пишет:

Ардуино считывает значение напряжения на аналоговом входе от 0 до 5 В и преобразовывает в код от 0 до 1023.
Время на преобразование 100 микросекунд.
Если это верно, то вопросы:
 
1. Можно ли ...
 
2. Что будет, ..
 
3. Есть ли возможность ...

А зачем Вам это - не написали, может решение сведется к детекторному приемнику типа RC (сопрот+кондер) ну и диод само собой разумеется.