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

Sdílet
Vložit
  • čas přidán 21. 07. 2024
  • Программирование на СИ в среде Keil μVision.
    Пишем код под микроконтроллер STM32F407VG на плате STM32F4DISCOVERY.
    Продолжаем работать с библиотекой HAL. Сегодня мы познакомимся с Аналого-цифровым преобразователем, присутствующим в нашем микроконтроллере.
    Напишем код для измерения напряжения на ножке порта с помощью использования регулярного канала АЦП в ручном режиме (без использования прерываний).
    Для визуализации принятых данных микроконтроллером используем дисплей LCD 20x4
    Купить отладочную плату STM32F4-DISCOVERY можно здесь ali.pub/178fif
    Дисплей LCD 20x4 можно приобрести тут ali.pub/vk7tl
    Навигация по видео:
    00:00 Введение
    00:27 Очень коротко об АЦП (ADC)
    04-20 Настраиваем проект в Cube MX
    12-30 Начинаем писать исходный код для реализации АЦП (ADC)
    17-23 Находим в документации, какие функции и как использовать для реализации АЦП (ADC)
    23-10 Посмотрим схему подключения
    26-10 Первый тест кода
    27-40 Улучшаем код для читабельности показаний
    30-30 Смотрим окончательный результат нашего труда
    Рекомендуется также перед просмотром данного урока просмотреть данное видео:
    УРОК 1. Установка Keil μVision • Программирование МК ST...
    УРОК 4. Библиотека HAL. STM32 CUBE MX. Светодиоды и кнопка • Программирование МК ST...
    УРОК 6. Библиотека HAL. LCD 20x4. 4-битный режим • Программирование МК ST...
    УРОК 7. HAL. LCD 20x4. 4-битный режим. Выводим информацию • Программирование МК ST...
    Текстовая версия урока и исходный код здесь narodstream.ru/stm-urok-16-hal...
    Группа в контакте club116656325
    Группа в Одноклассниках ok.ru/group/52987126153436
    Группа в Facebook / 236905359999556
    Мой сайт "Программирование МК" narodstream.ru
    Форум narodstream.ru/forum
    Вы можете помочь проекту:
    ЮMoney
    yoomoney.ru/to/41001176473465
    Webmoney
    Z341906933112
    Карта Сбербанка (МИР)
    2202201799288929
    Можно в USDT
    1) Сеть:TRC20
    Адрес: TBBPFk5Widf1CYvF7Xk5ssKXeiPJHwtMgS
    2) Сеть: BSC BNB Smart Chain (BEP20) (комиссия намного меньше)
    Адрес: 0x2e38754DF1e54649Bf0D5CD6fD6D8c96a9f22f17
    3) Сеть: Huobi ECO Chain (HECO) (комиссия еще меньше)
    Адрес: 0x2e38754DF1e54649Bf0D5CD6fD6D8c96a9f22f17
  • Věda a technologie

Komentáře • 47

  • @user-ry7wu9pm8k
    @user-ry7wu9pm8k Před 7 lety +12

    Хорошие уроки! Благодарю! Когда первый раз изучаешь материал, скорость не нужна) Это не олимпиада, скорость потом нарабатывается. Нужна скорость - на сайте можно прочитать)

  • @user-hw3kc3qz1r
    @user-hw3kc3qz1r Před 5 lety

    Огромное Вам спасибо. Все видео получаются очень интересными и информативными.

  • @user-dx7gh3wu4n
    @user-dx7gh3wu4n Před 8 lety +3

    Спасибо за познавательные видео и продолжайте в том же духе.

    • @narodstream552
      @narodstream552  Před 8 lety +1

      Спасибо! Своей обратной связью Вы мне этот дух поднимаете!

  • @DrargonsM
    @DrargonsM Před 8 lety +4

    Лайк ! очень интересно!

  • @user-il2bz9qg6u
    @user-il2bz9qg6u Před 4 lety

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

  • @user-br6gp7hc4l
    @user-br6gp7hc4l Před 3 měsíci

    Спасибо

  • @ButerbrodnyBaron
    @ButerbrodnyBaron Před 7 lety +4

    с каждым упоминанием предела измерения АЦП предел уменьшается на 1)

  • @user-vq5cs2ps9n
    @user-vq5cs2ps9n Před 7 lety

    Можно задать опорное напряжение от внешнего источника на ногу Vref согласно datasheet на конкретный контроллер.
    Младший разряд в цифровых измерительных системах всегда "прыгает" на +/-1 значение (деление) в лучшем случае, при отсутствии шумов от входного сигнала и от самого АЦП.

    • @narodstream552
      @narodstream552  Před 7 lety

      Петр Долгих в принципе можно. Также можно и отфильтровать прыжки. Я показал вообще принцип программирования АЦП с помощью HAL, а дальше уже вопрос фантазии.

    • @user-vq5cs2ps9n
      @user-vq5cs2ps9n Před 7 lety

      narod stream Хотелось как-то вставить свои пять копеек и дополнить Ваш труд.

    • @user-tl3fg5br5u
      @user-tl3fg5br5u Před 7 lety

      Петр Долгих а как кой смысл?, Как я понял из datasheet, опорное напряжение все равно больше питания микроконтроллера нельзя подать(3,6V). В дискавери Vref на Vdd посажен и все...

  • @YuriyIY
    @YuriyIY Před 8 lety +1

    А будет видео с регулярными каналами и ДМА? Ну или просто преобразование нескольких каналов и распихивание в разные переменные. :-) Хотя, у меня есть мысль использовать именно непрерывное преобразование и ДМА. Кстати, по опорной напруге. Там можно их две делать, минимальную и максимальную.

    • @narodstream552
      @narodstream552  Před 8 lety

      Конечно, будет. Уже готово по прерываниям в регулярном канале, но ещё не заливал, надо доработать его немного. А следующим пойдёт в рейс именно регулярный DMA, так что ждите.

  • @sergeydemchuk1039
    @sergeydemchuk1039 Před 4 lety

    Сделайте пожалуйста урок на Triple Interleaved mode с использованием DMA. Довольно сложно с этим всем разобраться самому.
    А вообще в идеале, что мне нужно: Triple Interleaved Mode, DMA и при этом сканирование 8-ми каналов. Это вообще возможно.
    Удачно получилось только реализовать поочередное сканирование 13-ти каналов АЦП в обычном режиме с использованием DMA.
    З.Ы. Если вопрос вас заинтересовал, возможно ли с вами связатсья по почте?

  • @user-sd8gz1jg6z
    @user-sd8gz1jg6z Před 7 lety

    Подскажите пожалуйста как провести калибровку ацп?

  • @Avrora707
    @Avrora707 Před 2 lety

    sprintf может конвертировать ФЛОАТ в строку? Я пишу так:
    float f = 1.123456789;
    char c[50] = {}; //size of the number
    sprintf(c, "%g", f);
    Но после принта массив все равно остается пустой. Библиотека #include включена. МК - STM32F072

  • @smidani8132
    @smidani8132 Před 2 lety

    я вот не пойму одно, всё настроил, но откуда напряжение на ноге изначально если я ещё ничего не подавал? STM32f4 похоже изначально настраивает её в высокий уровень, это нормально?

  • @user-dz5tj2ek5b
    @user-dz5tj2ek5b Před 6 lety

    при установке функции sprintf,не компилируется хотя подключил stdio.h.Вывожу данные через USART на экран ПК.

    • @rockykid3785
      @rockykid3785 Před 6 lety +1

      причёт тут stdio? вы путаете с printf

  • @TheVovanin
    @TheVovanin Před 5 lety

    Здравствуйте, давно смотрю ваши ролики, они стали для меня очень полезными! Хотел бы узнать возможно ли как то передать сигнал с платы по USB но без USART ? Моя задача считать аналоговый сигнал и передать его на компьютер. Для начала хотелось бы просто посмотреть на форму сигнала. Можно ли это как то реализовать?
    Спасибо большое!

    • @narodstream552
      @narodstream552  Před 5 lety

      Как правило по USB аналоговые сигналы не передаются. По данной шине передаётся информация в виде последовательного кода.

    • @Rus422
      @Rus422 Před 5 lety

      Конечно, можно. Данные АЦП после преобразования передаются по USB через VCP. Принимаете эти данные и визуализируете.

  • @iVAtcg
    @iVAtcg Před 7 lety +1

    Разве не так нужно:
    if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
    {
    // код
    }

  • @fanatnauki
    @fanatnauki Před 5 lety

    Здравствуйте Narod Stream! Подскажите пожалуйста, где узнать максимальную частоту оцифровки ацп?
    У меня плата с stm32f767, частота ядра 216 МГц. Нашел в RM, что ацп висит на шине APB2, которая делит частоту пополам. Еще предделитель делит на 4, больше не получается.
    Выходит 216/2/4=27 Мгц. Правильно рассуждаю? yadi.sk/i/8Uanr9qOHCpuGg
    Делаю индукционный нагреватель на 300 кГц, хочу сделать фапч программно. Скорости большие, но хранить и передавать данные с ацп не надо, обрабатываются на лету. Так что теоретически должно хватить )))

    • @narodstream552
      @narodstream552  Před 5 lety

      Здравствуйте!
      Нет такой величины - максимальная частота оцифровки АЦП.
      Поэтому каждый понимает под этим какие-то свои величины.
      Конкретнее скажите
      Вам нужен сэмплрейтинг или реальная частота колебаний, которую Вы хотите измерить?
      Сэмплрейтинг зависит от того, какое разрешение АЦП Вы выставите, 8 бит, 12, 16 или ещё какую. мегабиты в секунду Вы в принципе нормально рассчитали. Поэтому получаем что частота сэмплирования с разрешением 8 бит (градаций будет от 0 до 255 единиц) будет где-то 4 мегабита. Чтобы нам измерить синусоиду, то нам как минимум надо 20 сэмплов на один период, чтобы у нас хоть что-то нарисовалось. При 8-битном разрешении мы соответственно получим 200 килогерц максимальную частоту, которую мы сможем измерить. При 12-битном - меньше, при 16-битном - 100 килогерц. Да я по-моему в каком-то уроке это говорил, когда свой самодельный осциллограф подключал на F746. Если хотите большие частоты, то используйте внешний АЦП и контроллер, у которого есть широкий аппаратный параллельный порт (на 32 ноги). Тогда будет нормально.
      Это я тоже теоретически, так как такой целью не задавался. Поэтому не знаю таких контроллеров и таких АЦП. Только знаю, что они есть.

    • @fanatnauki
      @fanatnauki Před 5 lety

      А, дошло, делим еще на 8 (процессов делений отрезка, как Вы рассказывали в видео про avr, каждый расходует один такт), итого 168,7 КГц.
      Плюс еще время на конверсию. Не найду, сколько это, пишут 15 тактов. Это общее время или каждое из 8 штук?

    • @narodstream552
      @narodstream552  Před 5 lety

      Это общее время, вернее не время, а количество тактов. как правило в Cube MX оно написано.
      Мне удалось где-то 100 герц колебаний замерить с разрешением 8 бит.

  • @Jensiru
    @Jensiru Před 8 lety

    Не пойму, откуда берутся эти 4096 ?
    u = ((float)HAL_ADC_GetValue(&hadc1))*3/4096
    Как быть если 5 вольт к примеру подавать? Или больше? Т.е. простенький вольтметр чтобы был. Делитель из резисторов надо ставить? Урок по вотчдогу будет?

    • @narodstream552
      @narodstream552  Před 8 lety

      1. Данная цифра из даташита. Если смотреть все уроки по АЦП, то то я где-то я делаю экскурс по даташиту, там есть формула расчета. Только там она несколько наоборот. Получается неизвестная величина в теле уравнения. Переворачиваем уравнение и получаем эту формулу. Вообще-то эта цифра очевидна, т.к. АЦП у нас 12-битный, 12 включенных бит это - FFF, т.е. 4095, а 0 мы используем тоже. Имеются споры насчет того, все таки 4096 или 4095. Вообще в даташите стоит 4095, но с 4096 у меня почему-то получилось точнее.
      2. Если 5 вольт и больше, то тут только 1 вариант - собрать делитель на резизторах с тем учетом, чтобы на выходе делителя не превышалось 3 вольта, а 3 вольта - это максимальное опорное напряжение АЦП у нашего МК. А вот если мы хотим очень точно измерить малые напряжения, то опорное напряжение можно понижать, но тогда надо будет использовать внешнее опорное напряжение. Как-то так.
      3. Урок по режимам низкого энергопотребления пока не стоит на повестке дня. Пока кроме него очень много разработанных, но не опубликованных проектов.

    • @Jensiru
      @Jensiru Před 8 lety

      Странно, может я чего пропустил про 4096 в уроках....Спасибо большое за развёрнутый ответ:) Кстати, мне таки удалось запустить ILI9341 по SPI1. Дело было в двух лишних строках при отправке команд и данных.
      А урока не будет по LCD 2002 с кнопками? ( www.dfrobot.com/wiki/images/thumb/1/1e/Arduino_Shield8.png/600px-Arduino_Shield8.png ) Интересно было бы глянуть реализацию меню на нём или ILI9341. Меню, подменю...

    • @narodstream552
      @narodstream552  Před 8 lety

      Отлично! Дисплей, это хорошо. Пока не до кнопок. Вообще собирался. Там в принципе ничего сложного, я в обзоре физику этого дисплея с кнопками объяснял, там через АЦП заводится всё. Как будет время, замучу занятие. Я думаю, будет интересно

    • @user-tl3fg5br5u
      @user-tl3fg5br5u Před 7 lety

      Проблема с этим дисплеем, что кнопки на 5V работают, а у stm32 ацп 3.6V максимум и напрямую кнопки не подрубишь(делитель нужно городить)

  • @Jensiru
    @Jensiru Před 8 lety

    Для тех, кому лень или с телефона видео по АЦП по АВР ч.1 : czcams.com/video/JUy8tAjBvhc/video.html

  • @motoday3580
    @motoday3580 Před 5 lety

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

    • @narodstream552
      @narodstream552  Před 5 lety +2

      А ещё круче после каждой строчки кода было бы сплясать чечётку.

    • @motoday3580
      @motoday3580 Před 5 lety

      @@narodstream552 сплясать не нужно ... а хорошо было коментов больше... это все уроки.

    • @narodstream552
      @narodstream552  Před 5 lety +3

      Я больше сделаю - вместо комментариев я вживую объясню. А комментарии любой для себя напишет сам, как ему нравится. Зачем нам тратить драгоценное время на это. А вообще лучший комментарий - это грамотно и читабельно написанный код.

    • @motoday3580
      @motoday3580 Před 5 lety

      @@narodstream552 Согласен .. но когда открываешь код и смотришь урок, не очень удобно . Собственно в этом уроке по adc вы дали очень понятные коментарии все сразу понятно . Я по этому и затронул эту тему , так в остальных уроках на мой взглят этого нехватает.

    • @narodstream552
      @narodstream552  Před 5 lety +1

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

  • @bobahkz
    @bobahkz Před 7 lety

    Напряжение 3.3 вольта!
    Делайте уроки покороче, 33 минуты для 7 строчек кода это ОЧЕНЬ долго.
    И рассказываете как не уверенно, как будь-то разбираетесь с STM32 прям во время записи видио.

    • @user-il3xh5di2i
      @user-il3xh5di2i Před 6 lety +5

      По поводу длительности согласен, но зато все понятно и разжевано! Я смотрю на скорости 1.5, в итоге все замечательно!

  • @iVAtcg
    @iVAtcg Před 7 lety +1

    Разве не так нужно:
    if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
    {
    // код
    }