STM32 ADC DMA. Когда MCU сообщает об окончании ADC?

Я использую ADC с DMA (STM32F4, ide STM32CubeIDE), и я думаю, что понимаю, как это работает, но все еще имею одну дилемму. Насколько я понимаю, MCU вызывается только после завершения передачи DMA, в основном MCU переходит в эту функцию, когда DMA ADC завершается.

void HAL_ADC_ConvCpltCallback (ADC_HandleTypeDef * hadc)

Это правильно?

Итак, если это правда, у меня возникает следующая дилемма: например, adc_clock составляет 10 МГц, время выборки составляет 480 adc_cycles, разрешение ADC 12 бит. adc_sample_period = 1/10 МГц * (480 + 12 + 3) = 49,5 мкс. Это означает, что MCU будет переходить в HAL_ADC_ConvCpltCallback () каждые 49,5 мкс ??? На мой взгляд, это сложно, особенно в больших проектах. Кто-нибудь знал, как решить эту "проблему"? Я хочу читать результаты АЦП, например, каждые 1 мс, но также хочу реализовать DMA в АЦП. Любая идея приветствуется


person subavet995    schedule 27.03.2020    source источник
comment
Вам нужно начать со спецификации. Что вы будете делать со значениями АЦП, какие разрешения и дедлайны в реальном времени действительно необходимы и так далее. Нет смысла улавливать каждое преобразование АЦП на высокой тактовой частоте, если вам не нужно декодировать сигнал в режиме жесткого реального времени.   -  person Lundin    schedule 27.03.2020
comment
@Lundin Я знаю, что буду делать со значениями adc. Он будет использоваться в формуле для расчета силы тока. Разрешение 12 бит (0-4095), подчеркну в тексте выше. Я согласен с утверждением, что чтение adc каждые 49,5 мкс - это напрасная трата ресурсов MCU. Мне нужно adc valuse каждые 1 мс, может быть, чтобы задействовать таймер для срабатывания ADC DMA?   -  person subavet995    schedule 27.03.2020
comment
Начать с уменьшения тактовой частоты преобразования АЦП?   -  person Lundin    schedule 27.03.2020
comment
Минимальная частота АЦП составляет 5 МГц. (APB2 / add_prescaler) = (40 МГц / 8) = 5 МГц. Итак, 1 / 5Mhz * (480 + 12 + 3) = 99uS, что, на мой взгляд, слишком сложно. Попробую будет таймер, сообщу результаты   -  person subavet995    schedule 27.03.2020


Ответы (2)


Прочтите документацию uC - не запускайте "магические" функции HAL.

Период 1 мс между преобразованиями АЦП - это абсолютно ничто. У меня много проектов, в которых я использую режимы двойного или тройного АЦП с результирующей частотой дискретизации 18 MSPS.

Вообще говоря, если вам нужен плохой, медленный, неэффективный и работающий «случайно» код - используйте HAL. В противном случае изучите свое оборудование и вместо этого используйте регистры.

person 0___________    schedule 27.03.2020
comment
Спасибо за ответ. Хочу использовать HAL У меня нет времени на детальное чтение регистров. Я использую тройной ADC DMA с ~ 9,7 MSPS (1 / 49,5 мкс * 480). - person subavet995; 27.03.2020
comment
@ subavet995 у вас нет. если конверсия занимает 49,5 мкс, тогда ваш коэффициент конверсии составляет 20 тысяч SPS. Число, которое вы показываете, - это часы АЦП, а не частота дискретизации. Мой совет - начните с азов. Кстати, HAL займет у вас гораздо больше времени, чем регистры. \ - person 0___________; 27.03.2020
comment
Да ты прав. Я постараюсь решить это с помощью таймера - person subavet995; 27.03.2020

Вот как я решаю эту проблему: я меняю конфигурацию DMA. DMA был настроен для работы в круговом режиме, это означает, что когда АЦП завершает одно преобразование, данные сохраняются в DMA и MCU уведомляется через

void HAL_ADC_ConvCpltCallback (ADC_HandleTypeDef * hadc)

Обычно MCU уведомлялся каждые 49,5 мс, и для моей цели это было слишком интенсивно (мне нужен результат АЦП каждые 1 мс). Я создаю таймер, который используется для индикации АЦП, когда необходимо запустить выборку, и с DMA в нормальном режиме (АЦП выполняет только одно измерение), что решает мою проблему. Каждые 1 мсек получал результат от АЦП. Так что фокус был в режимах прямого доступа к памяти (круговой / нормальный режим).

person subavet995    schedule 02.04.2020