Я предполагаю, что 21 кГц является опечаткой, и АЦП работает на APB2 / 4 = 21 МГц.Время выборки составляет 3 цикла, время преобразования при разрешении 12 битов составляет 12 циклов, поэтому частота дискретизации АЦП равна = 1,4 МГц (21/(12+3)
).Когда ядро работает на частоте 84 МГц, это одна выборка каждые 60 ядерных циклов.
60 циклов едва хватает даже для запуска выполнения обработчика прерываний с учетом состояний ожидания флэш-памяти.
Глядя на график, который вы прикрепили, выглядит, что фактическая частота дискретизации составляет 300 кГц (в полном цикле сигнала 10 кГц 30 выборок), то есть 3,33 мкс,или 25200 тактов.Учитывая нелепое количество служебных данных в HAL , это кажется реалистичным.
Ваш код выполняет однократное преобразование с прерыванием, которое запускается после его завершения, затем читает и сохраняет значение и только после этого инструктируетАЦП, чтобы начать следующее преобразование, вводя переменную задержку, которая зависит от пары трудно прогнозируемых факторов.
Использование непрерывного преобразования
АЦП может перезапустить покрытие (или последовательностьесли он есть), либо сразу после окончания последнего, либо с помощью таймера, см. описание битов EXTSEL
, EXTEN
, SCAN
и CONT
регистров управления в Справочном руководстве.Он может даже инициировать передачу DMA после каждого преобразования, поэтому вы можете настроить канал DMA для сохранения показаний в буфере.Это гарантировало бы равные интервалы дискретизации даже при максимально возможной частоте дискретизации.