Программирование МК STM32. УРОК 18. HAL. ADC. Regular Channel. DMA

แชร์
ฝัง
  • เผยแพร่เมื่อ 23 ม.ค. 2025

ความคิดเห็น • 51

  • @АндрейКоробов-ч4г
    @АндрейКоробов-ч4г 6 ปีที่แล้ว +6

    Имя массива уже является указателем и нет необходимости писать &ADC_Data

  • @ОлексійЮрченко-я8м
    @ОлексійЮрченко-я8м 4 ปีที่แล้ว

    Огромное Вам спасибо.

  • @DrargonsM
    @DrargonsM 8 ปีที่แล้ว

    Все очень интересно!!!

  • @ИльясК-л7л
    @ИльясК-л7л 5 ปีที่แล้ว +2

    Здравствуйте. Столкнулся с интересной проблемой (может другие уже это проходили).
    Все делал как в данном уроке, но прерывание по ДМА возникает только один раз при старте. Соответственно проект не работал.
    КУБ версии 5.4.0
    Оказалось дело в последовательности инициализации периферии. Для данного микроконтроллера (STM32F407) после генерации проекта КУБом она следующая (из файла main.c):
    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_USART2_UART_Init();
    MX_DMA_Init();
    Для нормальной работы проекта необходимо инициализацию ADC1 переместить ниже, примерно так:
    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USART2_UART_Init();
    MX_DMA_Init();
    MX_ADC1_Init();
    Но при повторной сборке проекта КУБ возвращает все обратно. Поэтому надо не забывать менять последовательность. Уже дважды столкнулся с такой проблемой работы КУБа, было потеряно много времени...

    • @od3417
      @od3417 3 ปีที่แล้ว

      Спасибо.

    • @tora_32
      @tora_32 ปีที่แล้ว

      Спасибо! для f103c8t6 ваш совет также помог!

  • @alexvorozhbitov1482
    @alexvorozhbitov1482 5 หลายเดือนก่อน

    У меня была проблема с функцией sprintf в cubeide - она никак не хотела работать. Надо было в дереве проекта (в корневой папке) зайти в properties -> MCU settings и поставить галочку возле функции "Use float with printf from newlib-nano (-u _printf_float)" и возле второй. Так на форуме STM написано.

  • @turneroq9888
    @turneroq9888 3 ปีที่แล้ว +2

    Пишу из 2021 года. Использовал Stm32L1xxx
    Сел я посмотреть эти уроки, как обычно ничего не заработало(4 канала с использованием DMA). У меня была ошибка в HAL т.к случался overrun в самом начале и отключался DMA и ADC из-за этого. Выводилось однозначение начальное(при 1 чтении ADC) .
    -Одна из причин была неправильная постановка функций MX_DMA_Init() и MX_ADC_Init(); Сначала должно идти DMA, потом ADC.
    - Другая это в CubeMX где "IN3 Channel Speed" выбрать что-нибудь кроме disable(я выбрал slow). Я использовал IN1-IN4 входы ADC.
    -Ну конечно же тактирование. У меня SYSCLK 32 MHz, HCLK 32 MHz, APB1 и APB2 presclaler на 1. В настройках ADC prescaler делится на 4.
    При таких условиях все заработало.

    • @yakovdruker6227
      @yakovdruker6227 3 ปีที่แล้ว +1

      -Одна из причин была неправильная постановка функций MX_DMA_Init() и MX_ADC_Init(); Тоже есть такое!

  • @ДмитрийТисов-ж6я
    @ДмитрийТисов-ж6я 9 หลายเดือนก่อน

    Спасибо

  • @NIKOLAY_PSHONIA
    @NIKOLAY_PSHONIA 4 ปีที่แล้ว

    Здравствуйте. См. ваши видео по ним и учусь. Подскажите как лучше? У меня stm32f407 2 датчика температуры (резисторы 100к) каждый на своем выводе МК. Цель по каждому (по 6 замеров). скидываем в кучу потом делим /6 (усредняем). 2 раза в секунду надо усредненные показания без таймера и прерываний. Понимаю что надо DMA, но как лучше инжекторный или регулярный. инжекторный - может накапливать в буфере. Можно ли останавливать после 6 замеров и сброса в DMА ? пока МК не заберет и не запустит заново. что бы МК забирал когда сделано 6 замеров. СПАСИБО.

  • @flipix100
    @flipix100 6 ปีที่แล้ว

    Помогите настроить это на stm32f103c8t6. cubemx не предлагает DMAContinuousRequests. И в коде его не пропишешь. Может я что не включил. Пока хоть по прерываниям настроил.

  • @biriuk3344
    @biriuk3344 4 ปีที่แล้ว

    Здравствуйте!
    А как быть с калибровкой АЦП, если в нём используются каналы для дифференциального входа, для обычного входа и для обработки сигналов от встроенных датчиков, например, от встроенного датчика температуры?
    Для дифф. входа:
    HAL_ADCEx_Calibration_Start(&hadc1, ADC_DIFFERENTIAL_ENDED);
    Для обычного входа:
    HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
    Не делать же калибровку перед каждым замером конкретного канала?
    Спасибо.

  • @user-usver
    @user-usver 8 ปีที่แล้ว +2

    Здравствуйте! Подскажите, как сделать, чтобы три разных АЦП преобразовывали три разных канала, но в ОДИН И ТОТ ЖЕ момент времени? Заранее спасибо.

  • @ДенисБердяев
    @ДенисБердяев 2 ปีที่แล้ว

    не могу понять что у меня не так, с АЦП приходят данные по каждому каналу, но они не соответствуют действительности, а именно пины пустые, ни с чем не замкнутые, а значения колеблются от 1500 до 3000, причем чем выше канал по счету тем больше значение, если ставлю перемычку на 3V то приходит значение 4000 (никогда 4096 не было)

  • @maratg6837
    @maratg6837 8 ปีที่แล้ว

    Код бы посмотреть.. Делал также, только среда IAR и МК другой (405-й) - только один канал из двух работает..

  • @ІванВерьовкін
    @ІванВерьовкін 7 ปีที่แล้ว +1

    У меня во время старта 1 раз отработал dma и все. пока HAL_ADC_Start_DMA(&hadc,(uint32_t*)adc,3); не закинул в while. цеклически отробатывать он отказываеться((( Cube mx настроил..

    • @ГеоргийОлиниченко
      @ГеоргийОлиниченко 4 ปีที่แล้ว

      та же проблема, вы ее решили?

    • @ІванВерьовкін
      @ІванВерьовкін 4 ปีที่แล้ว

      @@ГеоргийОлиниченко Честно я не помню, знаю что автор этого видео очень часто облажается! но и на этом спасибо!

  • @ДмитрийБуньков-щ8ш
    @ДмитрийБуньков-щ8ш 7 ปีที่แล้ว

    Здравствуйте. В данном случае вы использовали физически один ацп. Вот хотим мы к примеру отцифровать n сигналов и чтобы это было быстрее, надо чтобы половину отцифровал один ацп, а половину другой. Как нам для dma настроить переключение периферии? Объясните пожалуйста. Если бы появилось соответствующее видео, было бы идеально. Заранее спасибо

  • @TheMysteo
    @TheMysteo 5 ปีที่แล้ว

    Здравствуйте! Подскажите пожалуйста , что у меня может быть не правильно в программе. Работаю с АЦП STM32L1 сгенерировал периферию в кубе.
    Настроил DMA , 2 регулярных канала и 2 инжектированных.
    У регулярных каналов SamplingTime = ADC_SAMPLETIME_96CYCLES
    У инжктированных 16 и 24 .
    Бывает, что в DMA каналы местами меняются и в старших байтах вместо одного канала, совсем другой. Помогает только перезапуск

  • @maratg6837
    @maratg6837 8 ปีที่แล้ว

    Дело было в FIFO.. Я эту галку не поставил, а она была нужна.
    Вы в ролике, к сожалению, никак не прокомментировали необходимость включения FIFO и других параметров, связанных с ним, а вопрос интересный и важный..:) Будет здорово, если напишите об этом.
    Спасибо за ваш курс!

  • @victorkeng1569
    @victorkeng1569 6 ปีที่แล้ว

    Здравствуйте! Я совсем новичок в stm32 программировании и у меня появился вопрос: Как использовать значения полученные из ацп при помощи DMA сразу, как только мы их получили, то есть по окончании преобразований?... Есть какое-то прерывание и как его вызвать...

  • @Jensiru
    @Jensiru 8 ปีที่แล้ว

    Странно, делаю всё тоже самое на ILI9341 и частота обновления данных очень и очень медленная, порядка 1-2 секунды ждать надо для обновления данных на дисплее.

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      В смысле то же самое на ili9341? А при чем тут регулярный канал АЦП?

    • @Jensiru
      @Jensiru 8 ปีที่แล้ว

      +narod stream такой же код, только вывод на ili9341, а не на 2004 и т.п. У вас быстро всё меняется, а у меня на регулярном как-то долго.

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      надо смотреть весь проект, только очень жаль, что у меня нет такого дисплея, но может переделаю под свой с 8-разрядным подключением, а может так увижу. Киньте заархивированный проект на GoogleDisk и я гляну, как посвободнее буду. Только перед архивацией удалите из проекта следующие папки (только если проект, конечно, генерировался в Cube MX):
      Drivers\CMSIS;
      Drivers\STM32F4xx_HAL_Driver
      MDK-ARM\Папка_с_именем_Вашего_проекта
      Больше ничего не удаляйте

    • @Jensiru
      @Jensiru 8 ปีที่แล้ว

      Отправил в ЛС, как скачаете или чего найдёте - отпишитесь

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Сергей Аксенов Хорошо.

  • @Jensiru
    @Jensiru 8 ปีที่แล้ว

    Здравствуйте, не планируете ли вы еще урок по ДМА в инжектированном канале? Так то в ДШ написано, что можно использовать их не смотря на то, что есть свои регистры у каждого канала. Быть может урок по DMA в SPI..., что существенно ускоряет те же дисплеи.

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Здравствуйте! Пока об этом не думал. Мне почему-то даже не удалось опросить несколько каналов в регулярном режиме.

  • @Jensiru
    @Jensiru 8 ปีที่แล้ว

    Видео как обычно на высоте, смотрю, стали объяснять больше по документации по всем пунктам в кубе и по строкам кода, что не может не радовать:)
    Урок по вотчдог будет? АЦП как по-мне одна из самых сложных и нужных тем.
    Вопрос чутка не по теме, почему цена на этот дисплей (270,52 руб) столь высока по сравнению с тем же ili9341 (365,44 руб) на котором и рисовать можно, и видео запускать, и картинки, да и сенсорный модуль есть?
    Просто в будущем хочу в машину его воткнуть, а этот как-то не очень внешне, ну и функций маловато.
    За уроки большое спасибо, ждём следующих видео:) Я думаю было бы неплохо в будущем совместно с подписчиками делать различные практические штуковины или типа отчёта чтобы что-то было, а вы потом в видео своих сможете выложить.
    Пример (первое что в голову пришло): в каком-то из видео даёте задание сделать вольтметр до 10 вольт и прислать видео-фото отчёт с какими-то условиями кода. Ну а через какой-то срок сами можете записать видео как это сделать.
    Таким образом может собраться довольно много людей и будет постоянная связь со своими подписчиками. Хотя, ютуб для этого дела не очень подходит. Ну это просто идея, вам виднее, конечно:)

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Спасибо! Сторожевой пёс ещё не освоен. АЦП - это очень нужная вещь. Так же как и цап. Пока существует динамик и микрофон, будет АЦП и ЦАП. Чтобы записать с микрофона в цифру - нужен АЦП, чтобы послушать потом цифру через динамик - ЦАП. Пока от них никуда. Там ещё SPI не за горами.

  • @maratg6837
    @maratg6837 8 ปีที่แล้ว +1

    Прошу прощения, дело было не в FIFO. Я заодно поменял параметры Peripheral data width и Memory data width - сделал так, как и в видео - DMA_PDATAALIGN_HALFWORD (был WORD).
    Так что FIFO не причем. Однако услышать про него все равно было бы интересно..

  • @ДимаПигарь-б4и
    @ДимаПигарь-б4и 8 ปีที่แล้ว

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

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Может тока не хватает? Через транзистор подключали?

    • @ДимаПигарь-б4и
      @ДимаПигарь-б4и 8 ปีที่แล้ว

      через транзистор

    • @ДимаПигарь-б4и
      @ДимаПигарь-б4и 8 ปีที่แล้ว

      так самое главное что в косе все работает, в кэиле нет

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Не совсем понятно. Если Вы прошиваете файл, сгенерированный в coo cox, то пищит?

    • @ДимаПигарь-б4и
      @ДимаПигарь-б4и 8 ปีที่แล้ว

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

  • @СергейФ-е9г
    @СергейФ-е9г 6 ปีที่แล้ว

    Здравствуйте!
    Почему не работает один канал АЦП с ДМА, точнее делает только одно измерение? Если используется два и более каналов, то все хорошо.

  • @fandusmercius723
    @fandusmercius723 4 ปีที่แล้ว

    Türkiye'den selamlar.

  • @kthxby3532
    @kthxby3532 8 ปีที่แล้ว

    Столкнулся с ошибками Cubemx. Возможно кому-то будет полезен мой опыт. Была проблема с неправильными результатами измерений. В отладчике обнаружил что DMA неправильно раскладывает их в память. Причина оказалось в том что cube генерировал проект с ошибкой.
    В cube параметр Data Width для Periph и Memory был Half Word
    А в файле с инициализацией DMA (stm32f4xx_hal_msp.c) было:
    PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    MemDataAlignment = DMA_MDATAALIGN_BYTE;
    Проблема решается заменой DMA_PDATAALIGN_BYTE на DMA_PDATAALIGN_HALFWORD.

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Спасибо!
      Странная ситуация.
      Обязательно проверю и передам в техподдержку.

    • @kthxby3532
      @kthxby3532 8 ปีที่แล้ว

      Не стоит, не тратьте время. Тем более, что ошибка, как оказалась, трудно воспроизводимая. Я сам хотел им написать, сейчас попробовал новый проект создать - ошибки нет. Зато вылезла вот такая ошибка графического интерфейса:
      pp.vk.me/c837626/v837626799/4260/TnKrgGt73Nc.jpg
      В общем понятно, что надо с настороженностью относиться к тому что генерирует куб.
      P.S.Возможно просто мне попалась версия куба сильно глючная. Буду разбираться. Спасибо за уроки и за быстрый ответ!

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Вообще лучше использовать последнюю версию. На данный момент вроде 4.16.1