Как достичь времени <50 ppm с помощью Sparkfun Artemis ATP?

Я хочу получать данные с АЦП через очень регулярные интервалы. Сейчас, используя миллисекундные/микросекундные сигналы (которые управляются внутренним RC-генератором), я получаю ошибку примерно на 3000 ppm, и показания дрейфуют.

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

  • Как-нибудь перенастройте millis, чтобы вместо этого использовать кристалл 32,768 кГц для синхронизации (звучит сложно или невозможно).
  • Используйте внешний TCXO 32,768 кГц для управления цифровым выводом, который может действовать как вход таймера, автоматически увеличивающего счетчик.

Являются ли какие-либо из этих вариантов простыми, если использовать Arduino IDE и обычный код/библиотеки Arduino для программирования?

Если я не смогу этого сделать, я, вероятно, буду использовать внешний TCXO для управления цифровым выводом с поддержкой прерываний и напишу собственную функцию millis, которая будет сообщать количество сработавших прерываний, но меня беспокоят потенциальные нетривиальные накладные расходы при запуске ISR на частоте 32,768 кГц, даже с ISR, который просто увеличивает энергозависимое uint32_t.

, 👍1

Обсуждение

один образец каждые 10 лет — это очень регулярный интервал... пожалуйста, не думайте, что «очень регулярный интервал» каким-то образом описывает длину интервала, @jsotola


1 ответ


Лучший ответ:

1

Частота прерывания 32,768 кГц, вероятно, будет немного высокой для AVR 16 МГц. Однако у вас более мощное ядро ARM с тактовой частотой 48 МГц, что даст период прерывания около 1465 циклов ЦП. Я думаю, что это, скорее всего, сработает. По крайней мере, оно того стоит. пытаюсь.

Другим вариантом было бы использование RTC или GPS-приемника с выход «импульса в секунду» (PPS) и направить этот сигнал на прерывание В ISR вы считываете показания micros() и обновляете три глобальные переменные:

  • количество импульсов, полученных на данный момент, что является количеством прошедших секунд

  • значение micros() на последнем импульсе

  • изменение вышеуказанного значения между двумя последними импульсами, т.е. количество micros() в секунду (должно быть около 106 ± 3000)

Затем вы можете использовать эти переменные для реализации собственного millis().

Последние две переменные могут быть несколько затронуты некоторыми прерываниями Джиттер задержки. Вы можете попробовать отфильтровать этот джитер, который по сути, это сводится к реализации программной ФАПЧ.

,