Запустить АЦП Ардуино при помощи импульса

Asha11981
Offline
Зарегистрирован: 26.01.2020

Стоит такая задача: мерить напряжение и выполнять программу в момент, когда приходит импульс. Импульсы приходят через равные промежутки времени (в данном случае 20 миллисекунд, но это значение может меняться в будущем). Длина импульса 0.5 миллисекунд. Время работы программы меньше 20 миллисекунд (14-17). Как это можно реализовать? Что читать, куда смотреть?

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Asha11981 пишет:

Что читать, куда смотреть?

Читать книшки, смотреть в сторону прерываний и ассемблера на AVR.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Asha11981 пишет:

Стоит такая задача: мерить напряжение и выполнять программу в момент, когда приходит импульс. Импульсы приходят через равные промежутки времени (в данном случае 20 миллисекунд, но это значение может меняться в будущем). Длина импульса 0.5 миллисекунд. Время работы программы меньше 20 миллисекунд (14-17). Как это можно реализовать? Что читать, куда смотреть?

 

 

Зависит от того насколько быстро надо запускасть измерение после прихода импульса и куда он приходит.

В atmega328 есть возможность автоматически запускать АЦП по фронту или уровню сигнала на INT0 (pin D2)

По прерыванию об окончании измерения начинать обрабатывать данные.

Ассемблер изучать не обязательно. А вот даташит на  atmega328 - да. 

А что потом с этими данными надо делать?

Asha11981
Offline
Зарегистрирован: 26.01.2020

asam пишет:

 

Зависит от того насколько быстро надо запускасть измерение после прихода импульса и куда он приходит.

В atmega328 есть возможность автоматически запускать АЦП по фронту или уровню сигнала на INT0 (pin D2)

По прерыванию об окончании измерения начинать обрабатывать данные.

Ассемблер изучать не обязательно. А вот даташит на  atmega328 - да. 

А что потом с этими данными надо делать?

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

Зеленый - пила, Розовый - импульс. Когда приходит импульс нужно измерять напряжение на "зубе" в этот момент, можно и в течение импульса и использовать последнее полученное значение. Импульс заканчивается позже "зуба". Длина зуба - 10 миллисекунд, период пилы - 10 миллисекунд, длина импульса - 0.5 миллисекунд

С длительностью программы я, возможно, погорячился. Мерил с помощью функцию millis() и выводил это через Serial.println(), возможно, так нельзя. 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Странно ты как-то вопросы задаёшь, с первого раза ничо нипанятно, ну да ладно.

А импульс-то розовый, откуда берёцца?

Ну и по теме: могёшь свою пилу мерить постоянно, как тока импульс пришёл - результат уже готов, ничо ждать нинуно.

Ну или по фронту на intX запускать АЦП и в обработчике прерывания ловить результат.

Есть варик с компариком заморочицца, но входных данных про импульсы нихватат.

rkit
Offline
Зарегистрирован: 23.11.2016

В ацп есть режим запуска по внешнему прерыванию. Вся информация есть в даташите.

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

Asha11981 пишет:

Стоит такая задача: мерить напряжение и выполнять программу в момент, когда приходит импульс. .... 

Она уже давно не стоит - её решили ещё разработчики микроконтроллера.

Asha11981 пишет:

Что читать?

Даташит, конечно.

Asha11981 пишет:

куда смотреть?

В раздел "Starting a Conversion" главы про ADC и в описание регистра ADCSRB.

Измерение можно запустить по следующим событиям:

1. Внешнее прерывание
2. срабатывание компаратора
3. Совпадение значение Match A таймера 0
4. Переполнение таймера 0
5. Совпадение значение Match B таймера 1
6. Переполнение таймера 1
7. Событие "захвата" таймера 1

Ваш случай, мне кажется, №1 или №2 - выбирайте, что удобнее.

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

Asha11981, как известно, Ардуино - система, позволяющая существенно снизить уровень вхождения в программирование микроконтроллеров.

Т.е.:

1. Концепция Ардуино: уровень вхождения - школьник старших классов.

2. Программирование микроконтроллеров в общем случае: уровень вхождения - студент средних-старших курсов профильного ВУЗа.

Так вот, все отписавшиеся пытаются подтолкнуть Вс ко второму пути, а я бы посоветовал попытаться пройти по первому, т.е. не выходя за пределы концепции Ардуино.

Для Вашей задачи IMHO подойдет:

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

2. Сконфигурировать прерывание на фронт входящего импульсча.

3. В цикле проверять флаг и в случае, если он установлен, обрабатывать полученное значение (например, выводить его на печать) и сбрасывать флаг.

Дэйташит на контроллер читать не обязательно (конечно, если такой простейший подход себя оправдает). Нужно только уметь программировать на уровне школьного факультатива и прочитать, как в Ардуино подключаются прерывания. Ну и, естественно, аккуратно просчитать необходимые интервалы времени. По последним могну сказать, что для упоминавшегося выше 328 контроллера аналоговое чтение (при использовании стандартных функций Ардуино) занимает 112 мкс, а вхождение в прерывание - единицы мкс. Сопоставьте с имеющимися у Вас данными по длительностям импульсов и решите, подходит ли Вам простейший случай. Если не подойдет, тогда - да, нужно будет погружаться в дэйташит.

Asha11981
Offline
Зарегистрирован: 26.01.2020

andriano пишет:

Asha11981, как известно, Ардуино - система, позволяющая существенно снизить уровень вхождения в программирование микроконтроллеров.

Т.е.:

1. Концепция Ардуино: уровень вхождения - школьник старших классов.

2. Программирование микроконтроллеров в общем случае: уровень вхождения - студент средних-старших курсов профильного ВУЗа.

Так вот, все отписавшиеся пытаются подтолкнуть Вс ко второму пути, а я бы посоветовал попытаться пройти по первому, т.е. не выходя за пределы концепции Ардуино.

Для Вашей задачи IMHO подойдет:

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

2. Сконфигурировать прерывание на фронт входящего импульсча.

3. В цикле проверять флаг и в случае, если он установлен, обрабатывать полученное значение (например, выводить его на печать) и сбрасывать флаг.

Дэйташит на контроллер читать не обязательно (конечно, если такой простейший подход себя оправдает). Нужно только уметь программировать на уровне школьного факультатива и прочитать, как в Ардуино подключаются прерывания. Ну и, естественно, аккуратно просчитать необходимые интервалы времени. По последним могну сказать, что для упоминавшегося выше 328 контроллера аналоговое чтение (при использовании стандартных функций Ардуино) занимает 112 мкс, а вхождение в прерывание - единицы мкс. Сопоставьте с имеющимися у Вас данными по длительностям импульсов и решите, подходит ли Вам простейший случай. Если не подойдет, тогда - да, нужно будет погружаться в дэйташит.

Спасибо Вам за то, что рассказали на пальцах, что нужно сделать. Сделал по Вашим советам, все получилось :).

Спасибо всем, кто откликнулся.