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

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

  1. REm

    REm Гик

  2. serg_admin

    serg_admin Гик

    Настраивать частоту семплирование для для начинающего будет сложней и выбор частот более ограниченный. А замер при этом все равно будет работать в прерывании.
    Помехи/погрешность растет при увеличении частоты семплирования, а не из за прерываний.
    В чем жесть?
     
  3. Radius

    Radius Гик

    Вам необходимо разобраться как работают таймера в ATmega323, конкретно разобраться с регистрами таймеров, далее с помощью таймера формируете прерывание через 1 мс. В прерывании запускаете АЦП. АЦП по окончанию преобразования выдаст прерывание в котором вы и считываете значение. С АЦП тоже желательно разобраться на уровне регистров, посмотреть примеры в DataSheet, а не использовать готовую функцию analogRead(). Мне не понятно почему вы синусоиду в 4 кГц хотите оцифровать с частотой 1 кГц. По теореме Котельникова частота дискретизации должна быть не менее чем в два раза выше частоты сигнала.
     
    Последнее редактирование: 14 фев 2017
  4. serg_admin

    serg_admin Гик

    Миллисекундный таймер в Arduino уже есть -
    http://robotosha.ru/arduino/multitasking-and-interrupts-arduino.html

    Если абсолютно все настраивать через регистры и на прерываниях тогда наверное лучше на C писать - без обертки Arduino IDE, иначе конфликты библиотек начнутся. Например:
    - ШИМ использует таймеры.
    - AnalogRead ждет флаг, но он будет сбрасываться после прерывания
    - функция mills тоже использует таймер
    Ну и вообщем-то многие библиотеки Arduino надеются на то, что прерывания вы не трогаете, поэтому тут надо аккуратно - понимать, что вы сломаете.
     
  5. mcureenab

    mcureenab Гуру

    Это вы на 1кГц таймер повесили семплирование. )))
    Если требуется максимальная частота, то лучше привязаться к времени выполнения AnalogRead. Когда требования к стабильности частоты не высокие, то это самое простое решение. И около 10кГц даст.
     
  6. mcureenab

    mcureenab Гуру

    Так наверное флаг сбрасывается по готовности замера.
     
  7. serg_admin

    serg_admin Гик

    Нет.

    Вот текст с DataSheet atmega328 (arduino UNO)

    ADIF: ADC Interrupt Flag This bit is set when an ADC conversion completes and the Data Registers are updated. The ADC Conversion Complete Interrupt is executed if the ADIE bit and the I-bit in SREG are set. ADIF is cleared by hardware when executing the corresponding interrupt handling vector.