AnalogRead и частота опроса АЦП

Тема в разделе "Arduino & Shields", создана пользователем un1x, 13 фев 2017.

  1. un1x

    un1x Нерд

    Прошу помочь в следуещем вопросе, есть синусоидальный сигнал, считываю его с помощью analogRead(), каким образом можно задать частоту считывания, например подаю гармонику с частотой 4000гц нужно получить массив значений гармоники, но не за какой-то промежуток времени а за 1ms.
    Примеры и темы с faq приветствуются.
     
    Последнее редактирование: 13 фев 2017
  2. mcureenab

    mcureenab Гуру

    1ms это разве не промежуток времени?
     
  3. mcureenab

    mcureenab Гуру

    https://www.arduino.cc/en/Reference/analogRead

    Делаете 10 analogRead(). Они займут примерно 1ms.
     
  4. un1x

    un1x Нерд

    Промежуток, когда писал имел ввиду что сигнал должен быть моментальным.
     
  5. mcureenab

    mcureenab Гуру

    Еще не легче.
     
  6. un1x

    un1x Нерд

    Интересует именно зависимость от частоты, чтоб получать большие массивы с данными. Побывал через прерывания не особо понял как реализовать многократное считывание.
     
  7. mcureenab

    mcureenab Гуру

    От частоты чего? Сигнала? Сэмплирования?

    Для повторяющихся операций в C++ есть циклы. for(;;) например https://www.arduino.cc/en/Reference/For.
     
  8. un1x

    un1x Нерд

    Может я неправильно выражаюсь, разговор о частоте дискретизации, т.е. о задании количества отсчетов.
     
  9. mcureenab

    mcureenab Гуру

    Делаете 10 analogRead(). Они займут примерно 1ms.

    Код (C++):
    const int ARRAY_SIZE = 100;
    int array[ARRAY_SIZE];

    for (byte i = 0; i++; i < ARRAY_SIZE){
        array[i] = analogRead(pin);
    }
    100 сэмплов займут 10ms примерно.
     
    Последнее редактирование: 13 фев 2017
    un1x и arkadyf нравится это.
  10. un1x

    un1x Нерд

    UPD, затупил телефон, спасибо, вечером попробую.
     
    Последнее редактирование: 13 фев 2017
  11. serg_admin

    serg_admin Гик

    Я бы использовал прерывание одного из таймеров, но в этом случае у Вас может отвалится AnalogWrite для пары каналов. Но где вы данные будите хранить? Объем памяти для AVR очень ограничен.
     
  12. un1x

    un1x Нерд

    Запись на Flash накопитель в текстовый файл.
    UPD. Я пробовал играться FlexiTimer'ом но пока не очень его раскурил, ибо мы там задаем период.
     
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    Это долгий по времени процесс (0,4-1 сек), причем на это время вся остальная функциональность "замирает".
     
    un1x нравится это.
  14. serg_admin

    serg_admin Гик

    Вот здесь вроде доступно объясняют
    http://robotosha.ru/arduino/multitasking-and-interrupts-arduino.html

    Дополнительно скажу, что таймеров на Arduino обычно 3 на каждом по два прерывания сравнения и одно переполнения. Один из таймеров 16-ти битный.
     
    un1x нравится это.
  15. un1x

    un1x Нерд

    Тогда какой путь решения данной проблемы? просто это один из массивов который нужно сохранить а их около ~80.
     
  16. un1x

    un1x Нерд

    Имеется кнопка записи по срабатыванию которой производится считывание и запись данных:
    Код (C++):
     if (_dA0>450 && _dA0<500)
      {
        if((millis()-buttonPressTime>250) && N<80){
          bn=1;
         readandwrite();
          buttonState=true;
          buttonPressTime=millis();
        }  
      else  {
        bn=5;
        buttonState=false;
      }
      }
    То есть в данной конфигурации у меня повиснит программа на время записи?
     
  17. serg_admin

    serg_admin Гик

    Карточка работает по SPI а там скорость неплохая. Задержки я думаю на реализации файловой системы но 0.4 -1 сек это че-то перебор.
    На счет "замирания" - код в прерываниях может и не замрет (миллисекунды ведь считать продолжает)- зависит от реализации.
     
    un1x нравится это.
  18. un1x

    un1x Нерд

    Я про прерывания обязательно прочту, правда мне c замашками PHP developer'a это достаточно трудно дается, всем спасибо господа. Если что то не будет получаться обязательно апну данную тему.
     
  19. rkit

    rkit Гуру

    В авр есть режим непрерывного семплирования аналогового входа с прерыванием.
    Читайте даташит.
     
    arkadyf нравится это.
  20. mcureenab

    mcureenab Гуру

    rkit говорит дело. В МК семплирование реализовано аппаратно и может выполняться независимо от других вычислений, параллельно. Когда очередной замер готов, происходит прерывание и можно сохранять результат. Недостаток подхода - больше помех.

    Делать замер в прерывании, это жесть.