Программирование МК STM32. УРОК 10. HAL. Изучаем PWM (ШИМ). Мигаем светодиодами плавно

  Рет қаралды 29,879

narod stream

narod stream

Күн бұрын

Пікірлер: 85
@DrargonsM
@DrargonsM 8 жыл бұрын
Интересны мир программирования! Полезная серия видео! Всем рекомендую посмотреть прошлые ролики!!!
@ДмитроПерший
@ДмитроПерший 5 жыл бұрын
Учитывая, что у TFT 2.8" на ILI9341 нет аппаратного управления яркостью (как ни странно и что печально; даже у Адафрут, не говоря уже о китайских клонах; видно пожадничали на встроенный ШИМ), пришлось реализовывать через таймер на STM-ке. Всё просто, в течении 0,5 сек гасишь яркость до нуля, подгружаешь картинку и поднимаешь яркость в течении 0,5 сек до максимума. Очень хорошо смотрится, если нужно менять контрастные картинки. Нет резкого перехода. Лайк за видео.
@serb_off
@serb_off 8 жыл бұрын
Спасибо большое за урок!
@narodstream552
@narodstream552 8 жыл бұрын
Я рад, что Вам понравилось!
@raven8867
@raven8867 5 жыл бұрын
Спасибо Вам за уроки!Мог бы 1000 лайков поставил!
@januszstrzelewicz5731
@januszstrzelewicz5731 8 жыл бұрын
Today, I not much remember of the Russian language (I had lessons in primary school), but great to watch your manual. Good job! Finally made sense instructions about the Cube and Keil. I look forward to more advanced projects :-)
@narodstream552
@narodstream552 8 жыл бұрын
Thank you so much for your high appreciation of my work! I shall continue to try for you! Teraz mam zamiar spróbować jeszcze więcej! Dziękuję bardzo za wysoką ocenę mojej pracy!
@MrMosetwo
@MrMosetwo 5 жыл бұрын
Спасибо за Видео. Очень полезно А можно ешё видосики про PWM? например как управлять моторчиком и джойстиком?
@dkoxperiakoziukov3808
@dkoxperiakoziukov3808 7 жыл бұрын
Очень наглядно. Спасибо. Я думаю, что все бы сказали спасибо если бы Вы поделились опытом работы с RTC в различных режимах энергопотребления микроконтроллера stm32F4xx, а так же резервирования аварийного питания. Для меня пока остается открытой тема работы таймера реального времени без питания на контроллере. Вывод vbat подключен к банку конденсаторов и нет возможности подключить к нему батарейку опционально. Я не уверен, что заряда кондеров хватит надолго.
@leesohaeng
@leesohaeng 8 жыл бұрын
nice example for stm32 user~!
@seppneimusser5723
@seppneimusser5723 5 жыл бұрын
Wsö atlitschna, balschoje spasiba!
@koliakrasnoff
@koliakrasnoff 6 жыл бұрын
Как Вам удается писать русские комментарии на 9:55? У меня кейл русский не поддерживает, заменяет знаками вопроса. Вы русификатор ставили или включили русский язык в настройках? Или при скачивании кейла надо было указать страну?
@VadRov
@VadRov 5 жыл бұрын
Поставить в настройках редактора кодировку utf-8: edit->configuration->editor->encoding->encode in utf-8 ...
@ВикторШехматов-ч5ч
@ВикторШехматов-ч5ч 3 жыл бұрын
Скоро НГ, смотрю это в 2021. Можно самому через микроконтролер и транзисторы режимы для гирлянды пользовательские сделать
@Jensiru
@Jensiru 8 жыл бұрын
Почему пишется TIM4->CCR1=i ? В гугле парень написал htim4.Instance->CCR1=i и тоже заработало. Вопрос быть может не про саму строку, а больше о том, что такое CCR1 и почему выбрано именно оно. В РМ пишется: TIMx capture/compare register 1 (TIMx_CCR1) (ТАБЛИЦА) Bits 31:16 CCR1[31:16]: High Capture/Compare 1 value (on TIM2 and TIM5). Bits 15:0 CCR1[15:0]: Low Capture/Compare 1 value If channel CC1 is configured as output: CCR1 is the value to be loaded in the actual capture/compare 1 register (preload value). It is loaded permanently if the preload feature is not selected in the TIMx_CCMR1 register (bit OC1PE). Else the preload value is copied in the active capture/compare 1 register when an update event occurs. The active capture/compare register contains the value to be compared to the counter TIMx_CNT and signaled on OC1 output. If channel CC1is configured as input: CCR1 is the counter value transferred by the last input capture 1 event (IC1). Урок то для новичков предназначен, плохо что не рассказали про этот регистр и табличку в РМ текста выше. Запомнить то можно всё как пишется, но вот понять сложно почему именно так, а не как-то иначе. Правильнее было бы рассказывать и показывать как надо работать с документацией! Видел уроки в которых вместо обращения к документации, просто бегали по всем файлам и копировали всё подряд, но ведь для новичка важно понять почему и зачем одно надо делать, а другое - нет. Странно, после просмотра видео аж расстроился, неужели в HAL нету просто одной функции в которой и будут задаваться все параметры ШИМ? Т.е. чтобы не писать целую кучу IF и считать всё в голове (ведь это надо знать, что нужно что-то считать), а написать одну строчку и радоваться. Как пример для понимания та же функция HAL_Delay. За урок премного благодарен, в любом случае информации по HAL ещё не много, а здесь уже разжёвывается. До выхода урока делал всё так же, но без IF, поэтому ничего и не работало. Думал, функция может какая есть, чтобы задавать параметры.
@narodstream552
@narodstream552 8 жыл бұрын
+Сергей Аксенов -> Указатель на свойство класса, а точка ставится в случае использования свойства стркутуры. Видимо где то заранее объявлен был экземпляр класса. Самое главное, что работает.
@Jensiru
@Jensiru 8 жыл бұрын
+narod stream Ну да, работает:) Сделал себе так, вроде чутка проще: if(iCCR1=i; // зажигаем else if((i>=16384) && (iCCR1=32768-i; else if((i>=32768) && (iCCR2=i-32768; else if((i>=49152) && (iCCR2=65536-i; else if((i>=65536) && (iCCR3=i-65536; else if((i>=81920) && (iCCR3=98304-i; else if((i>=98304) && (iCCR4=i-98304; else TIM4->CCR4=131072-i; Другие цифры и изменил условие на >=, чтобы не уменьшать значения. Если захочется сделать так: зажигаем светодиод долго и плавно, а гасим быстро и плавно. Это тоже с условиями надо будет возиться? Никаких функций задержек нету ведь?
@aerotachka
@aerotachka 7 жыл бұрын
Работает конечно, но TIM4 ->CCR1 это 'из CMSIS. И мы делаем не очень хороший с точки зрения стиля и сопровождаемости кода замес из HAL и CMSIS. В HAL для этих целей есть свои инструменты. В данном случае использовать макрос __HAL_TIM_SET_COMPARE (&htim4, i); Описание всего это дела в мануале по HAL, глава TIM Firmware driver defines
@ДимаПигарь-б4и
@ДимаПигарь-б4и 8 жыл бұрын
Здравствуйте, можете объяснить как связаны Prescaler, Counter Mode и Pulse для PWM?
@АндрейИ-ф3л
@АндрейИ-ф3л 5 жыл бұрын
8:47 В левой части экрана список функций. Владимир, скажите, пожалуйста, чем отличается ***_Init от ***_MspInit ?
@narodstream552
@narodstream552 5 жыл бұрын
А разве в документации нет описания функций?
@narodstream552
@narodstream552 5 жыл бұрын
Без MSP - функция инициализации PWM полностью. (Initializes the TIM PWM Time Base according to the specified parameters in the TIM_HandleTypeDef and initializes the associated handle.) C MSP - низкоуровневая часть инициализации, часть полной инициализации (в нашем случае она вообще пустая) (Init the low level hardware : GPIO, CLOCK, NVIC and DMA)
@АндрейИ-ф3л
@АндрейИ-ф3л 5 жыл бұрын
@@narodstream552 , спасибо. Я не смог найти тот файл документации, который вы показываете в видео. А в файле для STM32F0 функции вообще не описаны. www.st.com/content/ccc/resource/technical/document/user_manual/2f/77/25/0f/5c/38/48/80/DM00122015.pdf/files/DM00122015.pdf/jcr:content/translations/en.DM00122015.pdf
@АндрейИ-ф3л
@АндрейИ-ф3л 5 жыл бұрын
Нашел для F4, но это тоже не он. www.st.com/content/ccc/resource/technical/document/user_manual/2f/71/ba/b8/75/54/47/cf/DM00105879.pdf/files/DM00105879.pdf/jcr:content/translations/en.DM00105879.pdf
@АндрейИ-ф3л
@АндрейИ-ф3л 5 жыл бұрын
Виноват. Есть расшифровка функций.
@zakharpopov827
@zakharpopov827 Жыл бұрын
Зачем задержка не понял, что там бешено будет меняться?
@РазДва-ш8о
@РазДва-ш8о 3 жыл бұрын
В видео так удачно получилось, что выбранный таймер задействует ногу микроконтроллера на которой сидит светодиод. А что делать если все встроенные таймеры на задействуют ногу на который светодиод находится?
@РазДва-ш8о
@РазДва-ш8о 3 жыл бұрын
У меня STM32F410RB. В итоге пришлось воспользоваться таймером 1, запустить с помощью него ШИМ и кинуть перемычку с задействованной ножки на анод светодиода LD2, установленного непосредственно на плате. Все прекрасно работает. Спасибо за урок.
@spindle853
@spindle853 4 жыл бұрын
Комрады.... А можно ли передать rcc1, rcc2, ит.д. В другую функцию как параметр? Я пробовал у меня не получилось ничего.
@YuriyIY
@YuriyIY 8 жыл бұрын
Для того, чтоб каждый раз не тыркать ресет на плате, надо в кейле настроить флэшер. Идем меню Flash, далее Configure Flash Tools, в открывшемся окошечке вкладка Utilites, кнопка Settings. И там поставить чекбокс Reset and Run. Теперь, после заливки прошивки, проект будет стартовать, т.к. контроллер будет сбрасываться.
@narodstream552
@narodstream552 8 жыл бұрын
+Юрий Яремчук Огромное спасибо! Я как раз искал данный функционал! Я где-то слышал об этом, кстати тоже у какого-то блогера, но он только оговорился об этом но к сожалению не объяснил, где именно и как это включить. В следующем занятии я так и поступлю и объясню популярно, как именно это настроить. Ещё раз огромное спасибо Вам за данную информацию!
@YuriyIY
@YuriyIY 8 жыл бұрын
narod stream И хотелось бы посмотреть, как измерить таймером параметры входного сигнала. Длительность импульса, период и т.д. Спасибо. :-) Очень мало полезной инфы по HAL, а тут такой канал рядом, а я и не нашел. Загадка.
@alexmueller1041
@alexmueller1041 7 жыл бұрын
Если нужно перенести все настройки из предыдущего проекта, не нужно ничего менять в файлах и и копировать. Лучше сделать все прям v Кубе. 1. Открыть Проект , опции которого нужно перенести в новый проект. 2. нажать в Кубе save the Project in new file 3. Здесь поменять имя проекта и указать новое место локализации. 4. Нажать ОК. ( При необходимости внести дополнительные изменения в переферию в Кубе) 5. Генерировать код
@narodstream552
@narodstream552 7 жыл бұрын
Данным образом проект порой переносится некорректно. То есть те файлы, которые мы создавали самостоятельно и ко которых Куб ничего не знает, он не переносит. По крайней мере раньше было так, может теперь и исправили. Я привык делать именно ручным копирование, считаю это надёжным. Всё равно спасибо за информацию. Может, быть, кому-то будет полезно делать именно по методу, оглашенному Вами.
@ГригорийМир-ю3ч
@ГригорийМир-ю3ч 2 жыл бұрын
почему так много кода а можно это сделать switch ?
@ivanrusev2270
@ivanrusev2270 6 жыл бұрын
Ну вообщем вы профессионал а я деллитант
@leibmark
@leibmark 5 жыл бұрын
Спасибо!
@МаксимВолкович-р4л
@МаксимВолкович-р4л 7 жыл бұрын
Уроки очень полезные так как есть готовый работающий пример. Но мне не хватает теории.
@narodstream552
@narodstream552 7 жыл бұрын
Теории очень много по контроллерам STM. Я ещё не по одному железу такой поддержки не видел. Вам, видимо, не теории не хватает, а умения в ней разобраться. Смотрите дальше данные уроки, я всё равно порой, если есть возможность, объясняю , где и каким образом я нахожу в документации необходимые для разработки решений позиции. Правда, делаю я это кратко, чтобы не терять наше драгоценное время, так как ещё очень много нереализованных проектов, по которым уже написано очень много сценариев и кода.
@МаксимВолкович-р4л
@МаксимВолкович-р4л 7 жыл бұрын
Попутно вашим урокам буду подтягивать теорию самостоятельно если будут вопросы. Ничего в этом страшного нету.
@musckowit
@musckowit 7 жыл бұрын
HAL по сути framework и это ни то, что может дать теорию, но только поверхностные знания.
@igorm6585
@igorm6585 5 жыл бұрын
Почти всегда люди путают скважность и коэффициент заполнения (величина, обратная скважности) :-) Если период единички равен периоду нуля, то коэффициент заполнения равен 0.5, а вот скважность равна 2. Ведь скважность - это отношение периода следования (повторения) импульсов к длительности импульса.
@volodymyrkyrieiev4273
@volodymyrkyrieiev4273 5 жыл бұрын
Здравствуйте, Владимир. У меня есть задача, в которой нужно управлять 2мя электроклапанами. Сигнал - 7.2мс импульс, после которого ШИМ 25% с частотой 20кГц. Я пробую включать таймер в реж PWM с прерываниями с 100% заполнением и переполнением по 7.2 мс. В прерывании меняю параметры ARR и CCR чтобы частота ШИМа была 20кГц ну и заполнение нужное мне и выключаю прерывания. Первая проблема с которой столкнулся - если пробую выключить таймер во время первого импульса 7.2мс, то ничего не выходит, на выходе все равно 1, и вторая проблема, то, что при включении таймера не всегда получаю этот первый импульс......причем это как то хаотично. Включаю таймер в прерывании по переполнению другого таймера (к которому подключен энкодер), а выключаю в прерывании от кнопки
@narodstream552
@narodstream552 5 жыл бұрын
К сожалению, передо мной пока такие задачи не стояли, поэтому не могу подсказать, это надо время, чтобы всё это переварить и реализовать.
@ivanrusev2270
@ivanrusev2270 6 жыл бұрын
я любитель программирования AVR.уже 4 года учусь.Если бы не AVR .Мне бы было труднее освоить информацию.STM32 лучше и гибче функционал и быстрее.Я не программист.Я Электрик.Но мне это интересно.Хот и не всё и не всегда понимаю процессы в AVR и в STM32.Спасибо таким как вы.Я думаю нет никаких больших денег.Которые вам платили.На этом большие деньги не заработаешь.Есть у меня два проекта на AVR.Хотел бы перенести на STM32
@egorkomogortsev3700
@egorkomogortsev3700 8 жыл бұрын
Уважаемый, а не подскажите как включить в кейле всплывающие подсказки (автозаполнение). Не знаю как правильно это называется(
@narodstream552
@narodstream552 8 жыл бұрын
+rover abaddon Здравствуйте! Были уже такие вопросы, но я не знаю как. У меня они сами собой работают. Может версии кейлов как-то различаются.
@ВасилийПетров-л1й
@ВасилийПетров-л1й 6 жыл бұрын
а если ножки шима не выходят на диод? например в stm32f103? как плавно помигать в таком случае?
@narodstream552
@narodstream552 6 жыл бұрын
Дрыгать ножкой, изменяя скважность.
@ВасилийПетров-л1й
@ВасилийПетров-л1й 6 жыл бұрын
ни один из четырех таймеров на плате не имеет канала с номером ножки диода!
@narodstream552
@narodstream552 6 жыл бұрын
Значит дрыгаем ножкой без таймера - программно: Подняли уровень, подождали, опустили уровень подождали и т.д.
@МаксимГалкин-ы7у
@МаксимГалкин-ы7у 5 жыл бұрын
Здравствуйте. Сделано в точности как у Вас в видео, но есть одна неувязочка, когда мы игрались с одним светодиодом. И такая проблема: Светодиод работает только в режиме повышения яркости, потом он скидывается резко в ноль и опять повышает яркость. Выглядит так, как будто он просто не заходит во второй цикл for и просто игнорирует его. то есть постоянно крутится в первом цикле Программа написана в TrueStudio. Все Ваши другие уроки работали без проблем. Урок из текстового варианта работает так же хорошо. Проблема именно в описанной ситуации Можете что подсказать по данному поводу? Спасибо
@narodstream552
@narodstream552 5 жыл бұрын
Здравствуйте! Надо смотреть проект.
@МаксимВолкович-р4л
@МаксимВолкович-р4л 7 жыл бұрын
По готовому делать это хорошо. Но не хватает описания как работать с документацией.
@narodstream552
@narodstream552 7 жыл бұрын
Да и так уже уроки огромные, если буду объяснять, как читать книги, то, я думаю будут ещё втрое больше. Будем считать, что читать мы уже умеем, если пришли программировать такие контроллеры.
@ДимаПигарь-б4и
@ДимаПигарь-б4и 8 жыл бұрын
объясните мне пожалуйста, как правильно посчитать и настроить таймер, чтобы импульс был один раз в секунду?
@narodstream552
@narodstream552 8 жыл бұрын
Посмотреть на какой шине находится таймер, посмотреть частоту данной шины, но скорей всего для таймеров это отдельная частота (смотрится в Clock Configuration в Cube. И соответствующим образом настроить делитель и период. В уроке по таймерам я рассказывал, как именно, подробно.
@oleksandrlisovyi6314
@oleksandrlisovyi6314 8 жыл бұрын
Здравствуйте! Пробовал по Вашему примеру реализовать плавно мигающий светодиод на мк STM32F030C8Т6. В результате часть кода просто не работает, точнее работает только одна часть кода, где светодиод должен плавно гаснуть либо загораться. В зависимости от написанного кода части программы работают по разному, но не так, как нужно. Пишу в system workbench. Не подскажете в чем может быть проблема? Может это сам компилятор код оптимизирует так?
@narodstream552
@narodstream552 8 жыл бұрын
Скорей всего не в этом дело. Видимо под такой контроллер как-то по другому надо организовывать код.
@oleksandrlisovyi6314
@oleksandrlisovyi6314 8 жыл бұрын
Ради эксперимента решил скомпилировать тот же код с теми же настройками cubemx только в keil. Результат меня удивил - занимает почти в 2 раза меньше (в SW .hex файл занимает 25 кб, в keil тот же код занимает 14 кб), код скомпилированный в SW работает неверно, в то время как код скомпилированный в keil делает то - что нужно.
@Jensiru
@Jensiru 8 жыл бұрын
Странная штука, пример с одним светодиодом и на дискавери не пашет как надо, тоже через СВ компилирую. Дело не в контроллере походу. for(int i=0; iCCR1=i; for(int d=0; d0; i--) { TIM4->CCR1=i; for(int d=0; d
@Jensiru
@Jensiru 8 жыл бұрын
Всё, разобрался, дело в оптимизации компилятора, в св4стм32 включена оптимизация кода и это действует даже на HAL функции. Вот решение проблемы, можно выставить без оптимизации или лучше -О1. Оптимизацию лучше включать при заливке уже полностью готовой программы, дабы сэкономить место и всё. Enabling Optimization After importing a workspace/project, optimization seems to be disabled by default. The code size of the built project can be significantly reduced by enabling Optimization. To enable compiler optimization, do the following (click image on right to enlarge): Open project properties dialog by selecting from menu Select “C/C++ Build” » “Settings” from menu tree on the left Select the “Tool Settings” tab In this tab, select “Optimize for size (-Os)” for both the “MCU GCC Compiler” AND “MCU G++ Compiler” See image on right for details, click to enlarge! Пруф: wiki.modtronix.com/doku.php?id=tutorials:nz32:ide:sw4stm32-with-nz32-boards#enabling_optimization
@msdesignru
@msdesignru 8 жыл бұрын
неплохо, вы профессиональный эмбеддер или только хобби?
@narodstream552
@narodstream552 8 жыл бұрын
+msdesign(dot)ru В плане микроконтроллеров - просто увлекаюсь.
@english4fun
@english4fun 8 жыл бұрын
+narod stream понял, жаль
@alexanderkalashnikov2067
@alexanderkalashnikov2067 6 жыл бұрын
А что не видно? Хекса боится, как огня.
@ДавааАймаа
@ДавааАймаа 8 жыл бұрын
Здравствуйте! по вашему примеру попробовал настроить ШИМ на stm32f052, всё работает, только вот амплитуда сигнала на ножке почему то 1.5В, не доскажите в чем проблема? пытаюсь открыть мосфет транзистор, 1.5В не хватает в итоге транзистор нагревается и выгорает(
@narodstream552
@narodstream552 8 жыл бұрын
Здравствуйте! Даже не в курсе. Странно как-то. Не должно такого быть. Амплитуда по идее должна быть 3.3 в
@alexanderkalashnikov2067
@alexanderkalashnikov2067 6 жыл бұрын
Эо ослом снималось, или вольтметром?
@ГеоргийОрлов-г5в
@ГеоргийОрлов-г5в 6 жыл бұрын
Как вы пишите комментарии на русском? У меня кириллицу забивает знаками вопроса. Драйверы ставили?
@vitalimitko5168
@vitalimitko5168 6 жыл бұрын
Нашел у Вас 2 урока по таймерам, этот и 5тый. Маловато инфы по работе с таймерами. Там функционала как у дурака фантиков. Вы ограничились приметивным прерыванием и шим. А тема очень широкая и требовательная.
@narodstream552
@narodstream552 6 жыл бұрын
Я ограничился тем, чем мы собирались пользоваться в следующих уроках, а остальное потихоньку наросло)
@МаксимВолкович-р4л
@МаксимВолкович-р4л 7 жыл бұрын
А если перед практическим уроком записывать урок теории. Можно ли так?
@narodstream552
@narodstream552 7 жыл бұрын
Тут на то, что есть времени не хватает, хоть прекращай это неблагодарное занятие. Но пока терплю.
@igorm6585
@igorm6585 5 жыл бұрын
IMHO проще было не кучу констант в Экселе набивать, а писать константы в коде типа 65536, 2*65536L, 3*65536L, ... Препроцессор при компиляции сам бы их вычислил, а код был бы нагляднее.
@narodstream552
@narodstream552 5 жыл бұрын
Я поделился своими мыслями, Вы своими. Пока предъява не массовая.
@ShakirovRuslan
@ShakirovRuslan 7 жыл бұрын
apply - эплай
@GypsyRewind
@GypsyRewind 6 жыл бұрын
supply - сопли
@LinArt
@LinArt 6 жыл бұрын
Предлагаю Сотрудничество, занимаюсь авто электроникой , Могу ваш канал популяризировать а вы мой
@narodstream552
@narodstream552 6 жыл бұрын
К сожалению, пока нет времени этим заниматься.
@LinArt
@LinArt 6 жыл бұрын
Жаль как будете готовы к сотрудничеству сообщите удачи вам.
@RockPANDOR
@RockPANDOR 6 жыл бұрын
прекрасный обучающий курс но извините за критику - надо сперва написать алгоритм или граф карандашом на бумажке и показать стрелочками,как должна работать программа,где она ветвится,попытаться заранее рассчитать все задержки (хотя бы приблизительно) и только после этого набивать код. Сложную программу методом тыка и последовательного многократного перепрошивания вы не напишите, это любительство Ни в коем случае не в обиду,просто рисуйте алгоритм перед написанием программы. может даже сделайте пару видео по теории разработки алгоритмов. польза для канала сразу будет заметна.
@tora_32
@tora_32 4 жыл бұрын
Спасибо за урок!
Правильный подход к детям
00:18
Beatrise
Рет қаралды 11 МЛН
UI на ESP32 своими руками при помощи LVGL
12:34
Kirill Ivanychev
Рет қаралды 9 М.
STM32: PWM шаг за шагом на STM32CubeIDE
10:51
G1Tech
Рет қаралды 30 М.
Review.  Библиотеки для всего STM32 (HAL, LL, CMSIS)
16:29