АЦП прерывание

The Kaban
Offline
Зарегистрирован: 28.09.2016

Здравствуйте! 

Необходимо снимать показания с ацп 10 раз в секунду. Скажите пожалуйста как лучше это реализовать?

оснавной цикл желательно не занимать простоями, думаю может использовать таймер с  прерыванием?

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

Буду рад любой помощи, спс!

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

прерывания имеет смысл использовать, когда:

а) неизвесно, когда произойдёт событие.

б) время реакции на событие должно быть максимально минимально.

кароче класс титановый велосипед для delay без delay().

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

The Kaban, если Вам нужен один канал АЦП (не нужно сразу с нескольких снимать), может проще запустить его во FreeRunning режиме. От тогда будет снимать показания постоянно. А Вы уже по мере необходимости (10 раз в секунду или ещё как) будете считывать готовые показания, ни на такт не задерживаясь так не лучше?

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

Я использую библиотеку TimerOne. Как раз то, что Вам надо, если, конечно, не сделаете так, как сказал Евгений.

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

Да, если и сделает, та библиотека всё равно пригодится - читать-то показания надо периодически.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

The Kaban 10 раз в секунду это не большая скорость. Хватит millis();

//#1
//#2
//#3
void setup() {
//#1
//#2
//#3
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ; 
//#1 1000 миллисекунд вычислит. поток 1
  static uint32_t future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ;
  // сам код
  MILLIS = millis() ;    
  }
//#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS>=future2) {
  future2 = MILLIS + 200 ;
  // сам код
  MILLIS = millis() ;    
  }
//#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS>=future3) {
  future3 = MILLIS + 100 ;  
    // сам код  
  }
}