Обработка прерывания по изменению сигнала на аналоговом пине.

Rivay

✩✩✩✩✩✩✩
15 Авг 2019
8
0
Друзья, подскажите, какие прерывания на программном уровне поддерживает ардуино(сравниваю с даташитом атмеловского микроконтроллера)например, изменение сигнала на аналоговом пине. Для одного проекта, мне необходимо следить за изменением аналогового сигнала параллельно с выполняемым кодом, может, необходимо сравнивать число (предыдущего значения) с новым (измененным)АЦП, но как вызвать эту функцию обработки? Каждый раз вставлять в код эту функцию , как-то не удобно. Ответы на возможные вопросы :Основные внешние прерывания мне известны. Работаю с Ардуино Нано. Да, я любитель в программировании.

В одном цикле выполняются действия (не с обработкой) , а с обработанными данными с аналогового пина. Будет ли допустимым решением вызывать функцию проверки, а та в свою очередь функцию "прерывания по изменению", каждый раз после выполнения одного цикла программы? (но ведь на это требуется время, пока мк будет проверять КАЖДЫЙ РАЗ). Поэтому мне бы хотелось найти решение, которое позволило бы вызывать функцию не каждый раз, а только по изменению данных с аналогового пина.
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,712
422
Москва
Много не подскажу, сам не пробовал пока, не было надобности. но тему вентилировал. Есть возможность повесить аппаратное прерывание на изменения ЦИФРОВОГО пина 2 или 3. событие CHANGE . И сравнивать ничего не надо, т.к. раз было изменение, то сработает. С ШИМ работает 3-ий пин. Надо брать и пробовать. Соответственно цикл loop пустой.

Но и реализация в цикле проверками тоже может подойти. На аналоговый пин прерывания не вешаются . Да и боюсь с сигналом ШИМ будут проблемы
 

Wan-Derer

★★★★✩✩✩
Команда форума
31 Июл 2018
1,458
295
Москва
wan-derer.ru
@Rivay, Я что-то не припомню чтобы у AVR было такое прерывание - по изменению аналогового сигнала. Могу ошибаться, конечно, но не суть. С любом случае, штатно Ардуино поддерживает прерывание только по изменению на цифровом входе. Какие-то другие возможности - только внешними библиотеками.
Что можно сделать:
- вставить проверку в loop, тогда при каждом проходе будет происходить измерение, здесь надо понимать что интервал между измерениями будет нестабилен;
- нарулить таймер и вызывать проверку периодически.
В любом случае надо помнить что аналого-цифровое преобразование занимает заметное время, поэтому чтобы программа не тормозила надо вызывать опрос аналогового входа не чаще чем это реально требуется. Ну и в прерывании, вероятно, этого делать не стоит. В прерывании можно поднимать флажок, а саму проверку делать где-то ещё где это не помешает другим процессам.
 
  • Лойс +1
Реакции: Arhat109

thematrix

✩✩✩✩✩✩✩
17 Янв 2019
15
4
А какие масштабы изменения аналогового сигнала? Как быстро происходит нарастание\спад изменения сигнала? Если изменения сигнала существенные, то может стоит собрать простейший временной триггер на каком-то компараторе и RC-цепочке (или даже на 555 таймере), и если сигнал изменяется - дергать пин 2 или 3 с цифровым прерыванием, вызывать процедуру точного измерения аналогового сигнала.
 

Sergy

✩✩✩✩✩✩✩
30 Июн 2019
16
3
Задача импоссибль. По двум причинам, как минимум:

1) Каждое чтение аналогового входа занимает ~60мкс по умолчанию. Это ооочень долго. Можно его укоротить, изменив делитель (см. Проект анализатора спектра, например). Но это приведет к снижению точности измерений.

2) У любого АЦП есть такое понятие, как «шум». Даже если кто нибудь, когда нибудь умудрится сделать прерывание «по изменению», то программа попросту зависнет, тк 99.9% своей работы она будет находиться в этом самом прерывании.

Чтобы убедиться в этом, замкните аналоговый вход на землю и в цикле выводите в Serial значения из него.
 

Arhat109

★★★✩✩✩✩
9 Июн 2019
382
125
Как вариант решения - повесить отслеживаемый сигнал на компаратор. Он собственно для этого и предназначен - генерировать прерывания при превышении/понижении заданного уровня. Читайте даташит по компаратору и в общем-то Wiring (ардуино-библиотека) Вам ни к чему, от слова "совсем".
Если надо ещё и измерять его уровень, то можно сдублировать сигнал на компаратор на соотв. ногу АЦП или смотреть даташит ещё пристальней, там есть промеж них интересная связь .. на компаратор вроде как можно настраивать ноги АЦП "внутри камня", вот не помню деталей.

Читать АЦП можно с предельной скоростью 79 килозамеров в секунду, с точностью до 8-10 бит, в зависимости от обрамления камня (для Ардуино плат - 8-9). Для этого частоту АЦП блока высталяйте в 1Мгц. Можно ставить и выше, вплоть до делителей 1:2 .. 1:4 (зависит от камня: НАНО можно выше, Мега2560 дальше 1:4 не работает). НАНО ещё терпит повышение тактовой до 27-32Мгц .. есть в Сети решения по осцилоскопам с частотой замеров до 500кГц., но оцифровка там страдает - 5-6 бит только. Для большинства внешних сигналов этого вполне достаточно тем не менее.

У нас машинка для линии бегала с оцифровкой в 500кГц "на ура"..

P.S. И ещё. Откройте для себя io.h и прочие стандартные инклуд-файлы типового avr-gcc. Найдете очень много полезных макросов, обозначений, которые помогут Вам писать в регистры, таймеры, и т.д. напрямую "одной командой" практически точно также просто, как и digitalWrite() от Wiring.

P.P.S. на компараторе собираются BLDC-контроллеры бесколлекторников, на Атмелах, ежели вчё, можно посмотреть как оно там реализовано. Тоже в Сети есть примеры..
 
Последнее редактирование:

Rivay

✩✩✩✩✩✩✩
15 Авг 2019
8
0
Много не подскажу, сам не пробовал пока, не было надобности. но тему вентилировал. Есть возможность повесить аппаратное прерывание на изменения ЦИФРОВОГО пина 2 или 3. событие CHANGE . И сравнивать ничего не надо, т.к. раз было изменение, то сработает. С ШИМ работает 3-ий пин. Надо брать и пробовать. Соответственно цикл loop пустой.

Но и реализация в цикле проверками тоже может подойти. На аналоговый пин прерывания не вешаются . Да и боюсь с сигналом ШИМ будут проблемы
Благодарю за ответ!
 

Sergy

✩✩✩✩✩✩✩
30 Июн 2019
16
3
Еще проще - взять вторую плату Ардуино. Одна в цикле читает аналоговый вход, сразу фильтрует сигнал (убирает шум) и как только значение изменилось настолько, что нужно предпринимать действие - дергает за цифровую ногу «главную» Ардуино. А она уже будет выполнять прерывание по такому случаю, не отвлекаясь на постоянные измерения.
 

Rivay

✩✩✩✩✩✩✩
15 Авг 2019
8
0
Задача импоссибль. По двум причинам, как минимум:

1) Каждое чтение аналогового входа занимает ~60мкс по умолчанию. Это ооочень долго. Можно его укоротить, изменив делитель (см. Проект анализатора спектра, например). Но это приведет к снижению точности измерений.

2) У любого АЦП есть такое понятие, как «шум». Даже если кто нибудь, когда нибудь умудрится сделать прерывание «по изменению», то программа попросту зависнет, тк 99.9% своей работы она будет находиться в этом самом прерывании.

Чтобы убедиться в этом, замкните аналоговый вход на землю и в цикле выводите в Serial значения из него.
Благодарю за ответ!
 

Rivay

✩✩✩✩✩✩✩
15 Авг 2019
8
0
Еще проще - взять вторую плату Ардуино. Одна в цикле читает аналоговый вход, сразу фильтрует сигнал (убирает шум) и как только значение изменилось настолько, что нужно предпринимать действие - дергает за цифровую ногу «главную» Ардуино. А она уже будет выполнять прерывание по такому случаю, не отвлекаясь на постоянные измерения.
Как вариант решения - повесить отслеживаемый сигнал на компаратор. Он собственно для этого и предназначен - генерировать прерывания при превышении/понижении заданного уровня. Читайте даташит по компаратору и в общем-то Wiring (ардуино-библиотека) Вам ни к чему, от слова "совсем".
Если надо ещё и измерять его уровень, то можно сдублировать сигнал на компаратор на соотв. ногу АЦП или смотреть даташит ещё пристальней, там есть промеж них интересная связь .. на компаратор вроде как можно настраивать ноги АЦП "внутри камня", вот не помню деталей.

Читать АЦП можно с предельной скоростью 79 килозамеров в секунду, с точностью до 8-10 бит, в зависимости от обрамления камня (для Ардуино плат - 8-9). Для этого частоту АЦП блока высталяйте в 1Мгц. Можно ставить и выше, вплоть до делителей 1:2 .. 1:4 (зависит от камня: НАНО можно выше, Мега2560 дальше 1:4 не работает). НАНО ещё терпит повышение тактовой до 27-32Мгц .. есть в Сети решения по осцилоскопам с частотой замеров до 500кГц., но оцифровка там страдает - 5-6 бит только. Для большинства внешних сигналов этого вполне достаточно тем не менее.

У нас машинка для линии бегала с оцифровкой в 500кГц "на ура"..

P.S. И ещё. Откройте для себя io.h и прочие стандартные инклуд-файлы типового avr-gcc. Найдете очень много полезных макросов, обозначений, которые помогут Вам писать в регистры, таймеры, и т.д. напрямую "одной командой" практически точно также просто, как и digitalWrite() от Wiring.

P.P.S. на компараторе собираются BLDC-контроллеры бесколлекторников, на Атмелах, ежели вчё, можно посмотреть как оно там реализовано. Тоже в Сети есть примеры..
Благодарю за ответ!
 

Rivay

✩✩✩✩✩✩✩
15 Авг 2019
8
0
Огромное спасибо, еще раз, тем кто ответил на мой вопрос. Ваша информация исчерпывающая и полезная. Ваши решения буду подбирать эмпирическим путем, так как проект весьма не простой, но скажу сразу. это очередной велосипед, но собственный.
 

Rivay

✩✩✩✩✩✩✩
15 Авг 2019
8
0
Еще проще - взять вторую плату Ардуино. Одна в цикле читает аналоговый вход, сразу фильтрует сигнал (убирает шум) и как только значение изменилось настолько, что нужно предпринимать действие - дергает за цифровую ногу «главную» Ардуино. А она уже будет выполнять прерывание по такому случаю, не отвлекаясь на постоянные измерения.
Чем сложнее код, тем больше будет вероятность возникновения ошибки. Ваше решение действительно простое)) я хочу начать с него)
 

Rivay

✩✩✩✩✩✩✩
15 Авг 2019
8
0
Я бы с огромным удовольствием забил бы на ардуино и сделал бы на СТМ контроллере, но одна из целей проекта - Повторяемость, а ардуино популярная система) . Можно выставить порог (ограничение) т.е изменение с разницей 5 и более единиц, есть множество фильтров, так что эту проблему можно решить, меня больше беспокоит многозадачность ардуино не с таймерами , а с обработкой сигналов. Я могу ипользовать только чип, но повторюсь, мне хочется , чтобы проект легко повторили, и начиная изучать способности ардуино, я заметил множество ограничений. И любопытно как их можно обойти, человек с поста выше, рассказал что можно в коде инициализировать нужный регистр и возможно работать с системой чипа на прямую , буду изучать, пока точно говорить не могу.
Прошу простить , если не правильно был понят.