Как достичь времени <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.
@Vulcan, 👍1
Обсуждение1 ответ
Лучший ответ:
Частота прерывания 32,768 кГц, вероятно, будет немного высокой для AVR 16 МГц. Однако у вас более мощное ядро ARM с тактовой частотой 48 МГц, что даст период прерывания около 1465 циклов ЦП. Я думаю, что это, скорее всего, сработает. По крайней мере, оно того стоит. пытаюсь.
Другим вариантом было бы использование RTC или GPS-приемника с
выход «импульса в секунду» (PPS) и направить этот сигнал на прерывание
В ISR вы считываете показания micros() и обновляете три
глобальные переменные:
количество импульсов, полученных на данный момент, что является количеством прошедших секунд
значение
micros()на последнем импульсеизменение вышеуказанного значения между двумя последними импульсами, т.е. количество
micros()в секунду (должно быть около 106 ± 3000)
Затем вы можете использовать эти переменные для реализации собственного millis().
Последние две переменные могут быть несколько затронуты некоторыми прерываниями Джиттер задержки. Вы можете попробовать отфильтровать этот джитер, который по сути, это сводится к реализации программной ФАПЧ.
- Использование millis() и micros() внутри процедуры прерывания
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Использование TIMER0_COMPB_vect
- 4-битный счетчик вверх и вниз
- Включить и отключить отдельные прерывания
- Как настроить векторный таймер прерываний сторожевого таймера на Arduino Redboard/Uno?
- ATtiny85 AC Phase Control для регулировки яркости лампочки
- Присоедините функцию Arduino ISR к члену класса
один образец каждые 10 лет — это очень регулярный интервал... пожалуйста, не думайте, что «очень регулярный интервал» каким-то образом описывает длину интервала, @jsotola