STM32 ADC. Основные приемы работы. Примеры кода и настройки.
ฝัง
- เผยแพร่เมื่อ 5 ก.ย. 2024
- Основные настройки STM32 ADC. Коротко и по делу, как включить, как настроить использовать. Примеры кода.
Канал в телеграмм - t.me/vladimir_...
Канал Яндекс.Дзен - zen.yandex.ru/...
Канал на RuTube - rutube.ru/chan...
Канал на TH-cam - / vladimirmedintsev
------------------------------------------
Если вы хотите поддержать автора канала номер карты Сбер:
2202-2023-2480-4008
------------------------------------------
супер! хоть и хорошо знаю ацп, но с удовольствием посмотрел. спасибо!
По идее так по таймеру будет срабатывать АЦП раз в 2 секунды, только первое срабатывание после включения или перезагрузки микроконтроллера произойдет через 1 секунду. Это связано с тем, что Toggle on match меняет состояние с LOW на HIGH и наоборот при сравнении со значением в Pulse. Если разбирать Ваш случай, то при включении МК таймер начнет считать до 1000, затем он сбросится и сравняется со значением в Pulse (0), в этот момент произойдет переключения сигнала с LOW на HIGH, что вызовет наше событие (АЦП) и мы получим значение через секунду, потом таймер снова досчитает до 1000 (пройдет 1 секунда), сбросится и произойдет переключение сигнала, но уже с высокого уровня (HIGH) на низкий (LOW), что уже не вызывает наше событие, поэтому мы не получим значение с АЦП через секунду, далее счетчик снова отсчитывает до 1000 и при сбрасывании меняет уровень сигнала уже с LOW на HIGH, что нам и нужно для вызова АЦП, затем данный цикл повторяется. Поэтому получать данные с АЦП мы будем раз в 2 секунды в этом случае.
Смотрю 90% ваших видео с мобильного (5,5 дюймов 1080р амолед) и все отлично видно!
Нормально все видно, продолжайте снимать видео, очень интересно
Спасибо за урок, всё классно и понятно.👍 Я без проблем вижу всё на экране монитора. Всех Вам благ.
Спасибо большое. Очень полезное видео. Хотелось бы больше информации для начинающих, но с Вашей позицией я знаком по этому поводу.
Спасибо за видео! С экрана смартфона всё видно.
Нормальное поучительное видео. Я много раз уже обращался к вашим роликам, когда разбираться сильно не хочется а сделать надо.
Спасибо.
Нормально видно на телефоне, только качество на максимум нужно. Видео для меня полезно, спасибо!
Мужик, ты крут!
Нормально все видно, 720р на j7 видно все прекрасно)
Спасибо за видео. А по поводу разрешения захвата экрана, то мне кажется, что нужно снимать под FullHD. Поясню. Если я посмотрел видео на мобильном устройстве (как говорится, на ходу) и содержание меня заинтересовало, то я обязательно добавлю его себе в закладки, чтобы посмотреть его позже на стационарном ПК в нормальном разрешении.
Спасибо. Досмотрел до конца!
В стандартной винде есть инструмент лупа, можно её использовать. А вообще пора вам помощника искать для монтажа )
За видео спасибо )
Был бы с этого доход хоть какой-нибудь было бы время и на монтаж. А так это хрупкий балланс между развлечением и хобби. Я вообще задумываюсь сбежать в англоязычный сегмент.
@@VladimirMedintsev зачем сбегать? Можно же между видосиками про STM выкладывать видео про различные блюда. Сегмент домохозяек очень большой и подписоты много будет. Почти все каналы такой тематики МК набирают подписчиков не более 10 тыс.
@@VladimirMedintsev Не уходите пожалуйста :) Еще хотел сказать, что в этот раз у Вас, тьфу-тьфу не сглазить, вообще очень четкое и информационно наполненное (в смысле достаточно быстро говорили) видео вышло. У Вас вообще и до этого все видео очень и очень неплохие.
@@ajdarseidzade688 Да блин это все по ночам делается, иногда просто не получается быстро говорить. Я для такого всем советую в настройках просто включить ускоренный просмотр видео. И отрегулировать скорость как кому нравится.
Владимир, за библиотеку 3F 1.11 отдельное Спасибо.
Какой системной литературы много на эту тему? Я по стм32 нашел только какие-то слайдовые обзоры, как на презентации, много AN и похожей документации на сайте ST, но она написана для людей которые уже умеют программировать, я бы не сказал что такое подходит новичкам. Скажите название литературы которая относиться к системной на эту тему?
Делители в таймерах надо уменьшать на 1.Т.е., не 8000, а 7999. Не 1000, а 999. Тогда всё будет точно.
Я и в массивах про нулевой элемент вспоминаю только когда отлаживать начинаю. А все потому что нету в наших домах нулевого этажа. Во всем правительство виновато.
@@VladimirMedintsev Вот нигадяи, а. :-)
Можно монтировать видео во всяких SonyVegas, там можно довольно быстро увеличить нужный фрагмент, кроме того, можно записывать отдельный участок и у некоторых записывающих экран программ есть функция увеличения. Но это будет отнимать ваше время, к сожалению. Но самое главное это конечно нормальный монитор. Храни судьба тех людей, кому хватает одного монитора и тем более ноутбучного.
Все видно спасибо делайте в куб пожалуйста
Спасибо
Здравствуйте, Владимир. С огромным интересом смотрю Ваш канал. Очень интересует вопрос создания электронных весов на базе STM32. Приобрел у китайцев на Али комплект (тензодатчик 10 кг + АЦП hx711) Нужно прикрутить эту связку к STM32, а результат вывести на обычный LCD1602. Но знаний катастрофически не хватает. Думаю такой проект заинтересовал бы многих Ваших подписчиков. Желательно в среде разработки CubeIDE.
Благодарю вас за идею. Это я всегда с удовольствием. Но чтобы было интересно заниматься каким-то проектом нужно как минимум иметь все на столе, а тензодатчиков у меня нету. И микросхемки для них тоже.
Владимир спасибо. Подскажите stm32f4 два датчика темпераптуры (100к). Хочу делать по 6 замеров - > скидывать в буфер
1раз в секунду по 6 непрерывных замеров (потом /6 = усредняю). делаю PID по вашему видео
volatile uint16_t adc_buffer[6][2]; // [6 замеров] для [2х датчиков] через DMA, но без прерывания и таймера. Лучше инжекторный или ошибаюсь? и про настройку что за чем - PORT. DMA. ADC ?? (беру готовые примеры у всех по разному)
Дядь Вов, тебе и всем, можно стлинком работать хорошим шнуром, полметра, только в экране, в комплекте идет обычно см 15 шинка, 30 см сделал в экране, работает, хочу сейчас 50 см сделать, отпишусь о результатах
Хорошая идея, спасибо огромное.
@@VladimirMedintsev попробовал, метр работает, просто в экране без земли, кабель типа Мкэш в экране попробовал сейчас, работает
Еще раз большое спасибо. Меня этот вопрос всегда интересовал.
@@VladimirMedintsev дядь Вов, смотрю твои видео и учусь, только с Атмела на Стм перешел, это тебе спасибо за познавательное видео, делай еще 😉
я сделал шнур пол метра без экрана и норм вроде работает)
в инжект каналах 4 дата регистров 4 канала можно настроить.И управление 4 шимами
- пасиба за видео, дай Бог вам здоровья. Подскажите, у вас вначале крупным планом PCB-шка с энкодером, подскажите, какие есть хорошие и качественные энкодеры, с плавным хорошим ходом. Эти обычные дешевые китайские, они все какие-то деревянные, или туго идут или почти не чувствуется трещётки. Имею в виду, если вдруг вы знаете типы энкодеров, доступные к покупке на e-Bay или Ali-шке, такие как в измерительных приборах стоят. Спасибо.
Покупка это всегда в каком-то роде лотерея. Нельзя сказать заранее что вот этот товар особо хорош. Я покупаю много и от партии к партии все сильно меняется.
ПРИВЕТ! DAC к таймеру привязывать аналогично? мне нужно сделать отсчет от большего до нуля в течении времени.
Столкнулся с очередной проблемой. Связана она с тем, что я вынужден на одном устройстве заменить микроконтроллер с STM32L431RCT6 (который убило разницей потенциалов между землями, я об этом писал) на STM32F030R8T6, который оказался под рукой. По ногам всё совпало, программу перетащил. Единственная проблема - у F030 нет инжектированых каналов АЦП. Соответственно - надо переключать каналы самому на лету. У меня их 3 - IN0, IN1, Vref. делаю вот как
if (FL_StatusFlags & ADC_Vref_Status) {
FL_StatusFlags &=~ ADC_Vref_Status;
ADC_Vref += HAL_ADC_GetValue(&hadc); // Считываем код ADC_Vref
HAL_ADC_Stop_IT(&hadc); //Останавливаем
adsConfig.Channel = ADC_CHANNEL_0; // Устанавливаем канал
adsConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
adsConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
HAL_ADC_ConfigChannel(&hadc, &adsConfig); //Сонфигурируем АЦП
FL_StatusFlags |= ADC_CH0_Status; //Ставим флаг что запустили канал IN0
HAL_ADC_Start_IT(&hadc);
}
На всех каналах возвращает одно и тоже число. Если начинаю с Vref - то это будет Vref. Если начинаю с IN0 - то это будет IN0 и т.д. Не приходилось такое делать ?
вот что говорит первоисточник: It is also mandatory to use the ADC peripheral in DMA mode when we want to perform conversions
of multiple channels using scan mode. Это Ваш случай
@@alexeyjilinsky5926 Ок. Спасибо
Доброго времени суток. Владимир, какую литературу почитать по stm32?
Все интересное и необходимое на сайте st.com или вот тут я про хорошую книгу рассказывал th-cam.com/video/dSinwjV1vVQ/w-d-xo.html
Добрый день Владимир. Не читал все комментарии, был ли такой вопрос: можно ли запускать тайм-аут опроса АЦП (функция HAL_ADC_PollForConversion(...)) с большей скоростью, т.е. не в миллисекундах, а в микро или наносекундах? Ведь частота тактирования и преобразования АЦП не такие низкие...
Есть много способов запустить преобразования с требуемой частотой. Посмотрите в сторону DMA.
Здравствуйте Владимир !!! Пересмотрел ещё раз видео про АЦП и имею ряд вопросов. Описание задачи: Я выбрал для своего устройства процессор STM32L151VDT6. Одна из причин - мне необходимо измерять сопротивление термопреобразователя Pt100 по четырехпроводной схеме. А у процессоров с буквой V (100 ног), помимо VDDA и VSSА есть еще на отдельных ногах VREF+ и VREF-. Ну и я рассуждал так - берем опорный резистор (200 Ом 25ppm) , подключаем его между REF+ и REF-, REF- на землю. Последовательно с опорным подключаем измеряемый резистор и верхний конец его запитываем от Vcc (оно же- VDDA). Т.е. Получаем цепь Vcc - Rизм - Rопорн-GND. По этой цепи течет ток и мы имеем падение напряжения на Rопорн - подаем его на REF+ и REF-, а также имеем падение напряжения на Rизм - подаем его на IN0 и IN1. И все красиво. Измеряем разницу между IN0 и IN1, относительно опоры REF+ и REF-. А вопрос вот в чем - могу ли я при этом измерить, например, напряжение опорного источника микропроцессора (Vrefint) для вычисления напряжения питания, например? Ведь опорой для АЦП теперь у меня будет не напряжение питания, а падение напряжения на опорном резисторе. На Nucleo мне эту ситуацию проработать не удалось. Зарание скажу - я развел на плате еще и AD7790 так что измерение термометра могу перенести туда. Но все, если бы можно было бы не паять AD7790 - всё ж комплектация будет дешевле.
Если кратко то vrefint подключен к одному из каналов вашего АЦП, вы можете считать это значение. Смотрите в кубе.
@@VladimirMedintsev Как Vrefint считать я понимаю. Как вычислить напряжение питания не понимаю. Если бы у меня REF+ было бы подключено к питанию - тогда понятно. Вся шкала 4095 - это напряжение питания, код полученный с Vrefint - 1,224В. Пропорция. Но у меня REF+ подключен не к питанию, а к опорному резистору. И падение напряжения на нем будет меняться от температуры т.к. будет меняться сопротивление измеряемого термодатчика, а значи - и ток. Вот если бы можно было бы, например, программно переключать опору АЦП с REF+ на VDDA - тогда бы получилось бы.
@@user-je8oz6lh6w Простите, с мобильного в командировке комментарии второго уровня не видно. В референс мануале есть формула как это пересчитывать, я сейчас с мобильного устройства ее не найду.
@@VladimirMedintsev Спасибо Владимир! Собственно я сам допер. Но, часто так бывает, что решение проблемы приходит в тот момент, когда пытаешься объяснить её кому то другому. Так что - спасибо что вы есть!!!
Ну, недостатки мобильной жизни и хронических командировок. Раньше ответить не мог, я догадывался что там есть комментарий, а панель управления каналом его не отображала.
помогите с вопросом новичку) плата bluepill, затык на примере с прерыванием. сделал как на видео, но переменная val не меняется, хотя в отладчике во вкладке регистров SFRs регистр ADC-DR-DATA меняется корректно
разобрался сам. частота МК и частота отладчика не совпадали. может коллеге-новичку пригодится данная информация
По поводу видеть на экранчке, там в настройках вроде есть font large. Все никак не складывается в голове, установил в настройках 4 ножки на АЦП, и как к каждой обращатся аля analogread на ардуино. Там какая то хитрая структура hadc
Тут нет analogread это не ардуино.
@@VladimirMedintsev как определить с какого канала из 4х получены значения без инжектирования и dma?
Каналы перебираются последовательно в том порядке, в котором вы их настраиваете. Для этого есть регистры ADC_SQR1… ADC_SQR3. Считайте сколько раз опросили и узнаете какой сейчас. Если это не устраивает, то инжектируйте.
в даташите на stm32f0 написано, что макс. частота сэмплирования 1МГц. а в реальной жизни с 1000 замеров в секунду на двух каналах справится как думаете?
Конечно справится. Куда она денется. Главное пнуть посильнее.
@@VladimirMedintsev спасибо! будем значит пытать суперконденсатор импульсной зарядкой. видео про токовые мониторы как раз в тему пришлось.
Добрий вечер, а можно ли скачять куб без регистрации. У мене не получаетса зарегистрироватса на "ст.ком"
Добрый вечер! Обновление с версией 1.11.1 глючное только для STM32F3? Для других оно нормально? У меня STM32F0.
Я проверял только на F3 и мы сразу всей компанией откатились в ожидании.
Владимир, а приходилось ли Вам использовать встроенный датчик температуры контроллера?
Приходилось, а что такого в нем необычного?
@@VladimirMedintsev Да что-то не получается у меня с пересчётом показаний. Имеется ли какая-нибудь библиотека для него? И как производится калибровка, ведь он имеет довольно большую абсолютную погрешность?
@@user-su4lv1mh9s нет, никакой библиотеки для этого не требуется. Если у вас не получается прочитать значения с этого датчика, значит вы не разобрались с АЦП. Надо знания подтянуть. Ну а погрешность да, там особой точности нет, о чем и сказано в даташите.
Подскажите пожалуйста, с АЦП приходят какие-то "средние" значения если на пинах ничего нет, я ожидал увидеть там ноль или как у вас минимальные, по факту там от 1000 до 2000, если замыкаю на 3V то все нормально, отображает ~4000
Это нормально.
@@VladimirMedintsev нет ли в таком случае возможности как то это регулировать, тоесть изменение напряжения почувствовать получается, а как быть с обрывом линии? Неужели только дополнительными элементами схемотехникой?
Замислився: не знаю чим регістри в адресному просторі пам'яті відрізняються від DMA (буду розбиратися, дякую за натяк).
Изначально DMA означало передачу данных не процом, а отдельным контроллером.
А откуда вы узнали что то или иное так. Почему таймер4й а не 7й... Есть какие то первоисточники?
Да, есть. Этот первоисточник называется Reference Manual. Он доступен на сайте производителя микроконтроллеров. Вы можете его абсолютно свободно скачать и изучить.
А как мне замедлить значение что бы цифры не менялись быстро.?на дисплее?
Фильтрация лучший выход.
@@VladimirMedintsev Программная или аппаратная?.Ну допустим у меня есть датчик тока .Ток меняется мгновенно. На дисплее мы значения не увидим как нужно.А мне для срабатывания нужны мгновенные значения.Если программная .То можете ссылку ?
На злобу дня хотел спросить. Недавно обновил CubeIDE до версии 1.1.0. Она потребовала обновить прошивку отладчика до версии 34 и все... Теперь отладчик отказывается работать с CubeIDE. Пишет что не может проверить ST-линк девайс. А утилитой флешера все нормально прошивается. Кто нибудь с этим столкнулся уже? Или я один такой счастливчик? С кейлом еще не пробовал если что.
Там в настройках отладчика есть 3 варианта устройства. Я далеко от компьютера не подскажу название. Выберите устройство следующее за segger. У меня глючило пока там не пошурудил.
@@VladimirMedintsev Я так понимаю речь об openocd? Он тоже ругается с текстом: UNEXPECTED idcode: 0x2ba01477 . Я очень сильно подозреваю, что индусы впилили проверку на валидность самого отлдачика и без "правильного" серийного номера, оно работать не захочет...
Т.е. я так понимаю вы до самого конца ролик досмотрели и увидели мое ворчание по поводу обновления...
@@VladimirMedintsev nfo : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.232783
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Warn : UNEXPECTED idcode: 0x2ba01477
Error: expected 1 of 1: 0x1ba01477
@@VladimirMedintsev нет, я пока еще в процессе просмотра =) Спасибо, кстати, за видео. Познавательно.
А можно писать в регисрах.
Можно, никто не возражает. Если вам удобнее пишите в регистрах.
@@VladimirMedintsevвы можете ответить на два вопроса? 1 какой компелятор лчше использовать.И почему нельзя обойтись без куба кортекс м3 стм32 получается почти всё начинаю с кортекс м4 прерывание по тамеру -ноль ацп -ноль. в ацп я согласен не все регистры похожы в таймерах один в один только 2 и 5 32 битный cmsis лучше но информации и примеров на кортексе 4 и дальше почти нет а если и есть то не правельная это не авр
@@ivanrusev2270 Да, пожалуйста:
1. В принципе для начинающего нет разницы какой конкретно компилятор использовать. У них, разумеется есть отличия, но для начинающих эти отличия не играют никакой роли. Ну а если серьезно, то мне не очень нравится код создаваемый GCC, хотя это придирки.
2. Без куба обойтись можно, но не имеет смысла. С использованием куба повышается производительность труда. Там реально за несколько минут получить готовый проект который нормально собирается и компилируется, а потом его (при необходимости) можно оптимизировать. Если это необходимо. А без использования куба время сборки заготовки для проекта возрастает в разы и риск ошибок также. Т.е. все дело в целесообразности.
@@VladimirMedintsev получается что на cmsis нет смысла тратить время я 4 года програмировал avr учился и всё на смарку тут столько регистров но самое главное что нет примеров на другие кортексы
@@ivanrusev2270 Все немного не так как вы себе это нарисовали. Давайте немного по другому.
Что все ждут от программиста МК? Разумеется работающего кода и этот код нужен не через год, он нужен завтра. Т.к. продукт надо продавать. Для ускорения разработки созданы специальные инструменты. Один из которых STM32CubeMX он позволяет за считанные минуты создать под-основу будущего проекта, грамотно подключить необходимые библиотеки, настроить периферию микроконтроллера, настроить тактирование и сформировать проект под выбранную вами IDE. Это реально хорошо экономит время и это реально работает.
Далее программист должен написать код и "оживить" устройство. При этом он может использовать библиотеку HAL или LL в зависимости от того, какой уровень ему необходим. Этого вполне достаточно чтобы написать хороший и работающий проект. Однако, бывают ситуации, когда требуется опуститься на самый низкий уровень. В этом случае надо помнить, что библиотека CMSIS уже (всегда) подключена к проекту и вы в любой момент можете ее использовать. Т.е. просто взять и начать использовать данные там определения.
По поводу "все на смарку" ну если вы так реально считаете, то видимо ничему за 4 года так и не научились. Потому, что главное это четко понимать написанное на языке Си, если это есть, то освоение какой-либо библиотеки это всего-лишь просмотреть ее код, найти интересующие вас функции и их попробовать.
По поводу того "нет примеров на другие кортексы" вы наверное издеваетесь? Вместе с STM32CubeMX вам разработчик дает СОТНИ примеров на всю доступную периферию, прочитать, взять куски кода и использовать.
Почему нельзя в 4К писать видосы, ну или в 2К? Судя по паршивому качество предположу, что видос писался в 720.
Видос писался в HD качестве. А писать в 2 или 4К у меня нет возможности. Я делаю это на ноутбуке возрастом в 6 лет.
и смысл писать это в 2к? не все же смотрят это на диагонали 1,5м телевизоре... а представляете что получится с этим видео на мобильном телефоне? - Ютюб на столько ухудшит качество что при 720 буквы превратятся в мутные пятнышки
@@highvolthome Да ладно, что там ухудшится, каждый выберет в настройках нужное разрешение, хотя больше чем full hd, для записи с экрана. смысла нет.
забейте на куб иде. Зачем он вообще нужен если есть keil.
Ну как минимум не нарушать законодательство. Для дома и для семьи можно использовать что угодно, а с определенного уровня приходится задумываться и о лицензиях. Также, иногда это бывает требованием заказчика к коду, чтобы все было лицензионненько. В моей практике было что заказчик (ну правда не Российский) просил подтвердить лицензионную чистоту автокада.
@@VladimirMedintsev мне кажется с определенного уровня уже не стоит вопрос в лицензии - если проект "взрослый" и особенно если это военка, то тем более. В целом насчет законодательства согласен. но с другой стороны на этом канале контент воспринимается как образовательный и лично я привык к подаче в кейл, поскольку сам в нем работаю. Но безусловно cube ide понравился черной темой) я вообще ненавижу белые темы, от них глаза устают. В целом мне кажется кейл не стоит тех денег которые за него хотят. Вот если бы в Visual studio прикрутили С с intellisens-ом и возможностью прямо из оболочки так же отлаживать мк-она бы стоила 4к евро, но не кейл.
Уважаемый ты удивишься но попробуй вбить stm32 visual studio. Там есть плагин VisualGDB лицензия дешевая, ителисцайнс о да просто песня с середины команду набираешь и все круто. Но на работе заставляют мучатся в CubeIDE лицензионненько хотять.
Hal это зло
Доказать сумеете?
@@VladimirMedintsev 1. Если какие проблемы ниже уровнях hal, ты подвиснешь изучая все уровни, т.к и не знаешь как это работет и какие регистры и за что отвечает. Это что то типа ардуино.. Я бы такого программиста не взял на работу.
@@1975nacgul прям потеря века :)