Доступ к количеству цикла STM32F103

Tiger762
Пт 29 апреля 2016 г. 2:46 утра
Поэтому мне нужно взять 8000 аналоговых образцов в секунду для проекта. Я начал смотреть на возможность использования модуля GPS, который выпускает сигнал 1PPS для дисциплинирования MCU. Запланируется таймер на 125 микросекунд в будущем. Во-первых, будет откалибровать MCU, увидев, сколько такковых циклов накапливается в течение 1-секундного периода GPS. Должно быть 72 миллиона циклов. Если бы это на самом деле n циклических циклов, то у меня будет следующий график итерации для таймера (125 * N / 72000000).

Первый шаг - получить доступ к количеству цикла такта. Я нашел http: // Stackoverflow.com/вопросы/1337 ... C-ON-STM32 и перегонять его в голый необходимый код:

#define demcr ( *((volatile uint32_t *) 0xe000edfc))
#define dwt_ctrl ( *(volatile uint32_t *) 0xe0001000)
#define cyccntena (1<<0)
#define dwt_cyccnt ((volatile uint32_t *) 0xe0001004)
#define cpu_cycles *dwt_cyccnt

Далее я помещаю в Setup () это:

Demcr | = demcr_trcena;
*Dwt_cyccnt = 0;
Dwt_ctrl | = cyccntena;

Наконец, в Loop () у нас есть:

x = cpu_cycles;
задержка (10);
Сериал.println (cpu_cycles - x);

Я получаю постоянный поток:
720502
720500
720498
......

У моих модулей GPS нет фактического выхода 1PPS, но у них зеленый светодиод SMT : D Я думаю, что фотоэлемент может вызвать аппаратное прерывание. Затем ISR захватывает количество тактовых циклов процессора, чтобы затем узнать, какая точная частота процессора. Если оказалось, что процессор работает на 100 частей на 1 млрд., Тогда я бы сократил все запросы на таймер на 100 частей на час.

Пито
Сб 30 апреля 2016 г. 16:25
Вы не можете дисциплинировать MCU от GPS 1PPS напрямую.
Вы можете дисциплинировать качественный VCXO от GPS, и вы можете использовать VCXO в качестве часов для MCU.
GPS 1PPS - это долгосрочный Cesium Pustis (т. Е. 1 секунды за миллион лет), но не краткосрочный (то есть сейчас). Краткосрочный джиттер может быть 6-100NS на основе качества GPS.
Это несколько часов MCU в секунду. Таким образом, ваши 1PP могут быть плюс/минус много часов MCU в виде «шума». Долгосрочное среднее из этого шумного 1PPM является точным Cesium (атомные часы).
Дисциплинирование VCXO из GPS 1PPS нелегко, это своего рода ракетостроение.. :)
Вам нужен кристаллический генератор, контролируемый качественным напряжением (лучше, когда он подвергается духовке), вы кормите импульсы GPS 1PPS в интегратор с длинной интеграцией. Период (несколько часов), вы подаете напряжение из интегратора в VCXO, плюс вам нужен некоторый цикл обратной связи с фазовым компаратором и т. Д..

Rogerclark
SAT 30 апреля 2016 г., 11:12 вечера
@pito

Это интересно.. Бьюсь об заклад.

Я сделал немного, если гугл и нашел это

http: // www.Eevblog.com/forum/chat/how-a ... ps-signal/

Похоже, что некоторые подразделения GPS лучше других (они, кажется, думают, что подразделения Trimble имеют наименьшее джиттер, но я не думаю, что были каких -либо убедительных доказательств)

Я думаю, что на самом деле нужен OP, так это точные часы 8 кГц, тогда его можно использовать для запуска ISR для преобразования.

Однако, если OP нуждается в уровне точности, который они утверждают, мне интересно, является ли MCU идеальным устройством для накопления этого.
Это может попасть в сферу FPGA или дискретное оборудование.

Пито
Сб 30 апреля 2016 г., 11:47 вечера
ОП должен переосмыслить его подход, я думаю. Ему также нужно понять все источники джанитера времени - GPS 1PPS имеет значительный джиттер, генератор PLL CPU внутри MCU также довольно шумный, ISR тоже создает джиттер. Если ему нужно что-то выполнимое и менее шумное, то простой внешний кристаллический осциллятор (то есть 10-20 МГц), подающий входной вход MCUS (без умножения путем PLL), и блокировка преобразования АЦП во внутренний таймер, установленный на период 8 кГц, будет хорошим решением..

Rogerclark
Солнце 01 мая 2016 г. 1:46
@pito

Да. У ISR есть джиттер, и OP, вероятно, придется отключить все остальные прерывания.

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

OP никогда не говорил, почему им нужно точно выборки, точно при 8 кГц.

И, хотя и не невозможно сделать при использовании Arduino с Libmaple и т. Д., вероятно, было бы лучше кодировать напрямую, используя HAL

Пито
Солнце 01 мая 2016 г., 7:22 утра
Негативная точка «Движения Ардуино» - это люди (новое поколение, скажем,) склонны решать каждую техническую проблему с «Arduino Poard.. :)

Mrburnette
Солнце 01 мая 2016 г. 13:19
Пито написал:Негативная точка «Движения Ардуино» - это люди (новое поколение, скажем,) склонны решать каждую техническую проблему с «Arduino Poard.. :)

Ddrown
Пн, 02 мая 2016 г. 12:48
Tiger762 написал: У моих модулей GPS нет фактического выхода 1PPS, но у них зеленый светодиод SMT : D Я думаю, что фотоэлемент может вызвать аппаратное прерывание. Затем ISR захватывает количество тактовых циклов процессора, чтобы затем узнать, какая точная частота процессора. Если оказалось, что процессор работает на 100 частей на 1 млрд., Тогда я бы сократил все запросы на таймер на 100 частей на час.

Ахулл
Пн, 02 мая 2016 г., 14:04
Я не уверен, что мы снова не думаем о проблеме здесь. Если вы просто хотите запустить ADC с регулярным промежутком, с хорошей точностью и используйте DMA, чтобы получить результаты, вы можете сделать хуже, чем посмотреть на код в Sig-O-Scope. Если вы не выбираете, скажем, на 16 кГц, 32 кГц, 64 кГц или какое -то другое множественное, вы должны получить довольно хорошее приближение того, что аналоговый сигнал 8 кГц - это то, что вы пытаетесь измерить. Учитывая, что нам удалось управлять АЦП на маркере около 1 МГц, я уверен, что 8 кГц будет легким.

Rogerclark
Пн, 2 мая 2016 г., 21:29
Энди,

Я думаю, что мы видим, как большая проблема ОП, так это убедиться, что образцы взяты ровно на 8000.00000000 раз в секунду, и что время между образцами ровно 1/8000.00000000 секунды.

Наличие точных системных часов E.глин. до 1 части в 100 миллионах и т. д. кажется важной, так же как и то, что ничто не останавливает АЦП, инициируемое именно в правильный момент.

Думая об этом, также заставляет меня задуматься о том, будет ли время преобразования также проблемой, так как я думал, что время преобразования варьировалось в зависимости от входного напряжения, что может вызвать больше джиттера, чем все другие факторы.

Ахулл
Пн, 02 мая 2016 г., 22:34
Rogerclark написал:Энди,

Я думаю, что мы видим, как большая проблема ОП, так это убедиться, что образцы взяты ровно на 8000.00000000 раз в секунду, и что время между образцами ровно 1/8000.00000000 секунды.

Mrburnette
Пн, 2 мая 2016 г., 11:03
У меня две мысли:
Сводка концепции обратной связи переменной: 4. Емкость нагрузки (CL) моего параллельного резонансного кристалла оценивается в 20PF. Как рассчитать значение конденсаторов нагрузки, используемых в моей параллельной резонансной цепи осциллятора?

Используйте эту формулу, чтобы приблизить значение необходимых конденсаторов:

Cl = ((C1 x C2) / (C1 + C2)) + cStray

CSTRAY-это неприятная емкость в цепи, обычно 2-5PF. Если частота колебаний высока, значения конденсаторов должны быть увеличены, чтобы снизить частоту. Если частота низкая, значения конденсаторов должны быть уменьшены, тем самым повышая частоту колебаний. Когда CL = 20PF, C1 и C2 будут приблизительно 27-33 пт каждый, в зависимости от количества бездомной емкости.
С помощью VARCAP, я думаю, UC может выполнять самооплатум внешней схемы смещения постоянного тока (цифровой запрограммированный резистор), мой отслеживание переднего края GPS PPS. Это саморегулирование может быть выполнено при запуске, или это может быть выполнено периодически, когда UC обнаруживает изменение температуры окружающей среды- простой термистор и точный резистор должны быть адекватны для отслеживания температуры, поскольку точная температура не требуется, просто дельта от предыдущий захват.

Луча

Рабочая библиотека для SSD1306