STM32 PWM на практике.
HTML-код
- Опубликовано: 5 окт 2024
- Краткий рассказ о том, как включить генерацию PWM сигнала на процессоре STM32. Не претендует на полноценное описание всех тонкостей этого процесса.
------------------------------------------
Поддержать автора канала можно перейдя по ссылке:
yoomoney.ru/to...
Или просто отправив перевод на Yandex.кошелек:
4100116547550395
А также переводом по номеру карты Сбер:
4279-3000-1033-0561
------------------------------------------
Более 5 лет программирую МК, часть знаний забывается если долго не использовать. Благодаря вашему видео очень быстро освежил память, спасибо!)
спасибо большое,дней 5 уже не мог разобраться и тут наткнулся на ваше видео!
Кратко и информативно - плюс автору! Могу только дополнить, что в серии f303 advanced control таймеры (а это TIM1, TIM8 и TIM20) имеют возможность тактирования удвоенной частотой шины, если шина 72MHz, то частота тактирования 144MHz. Эта настройка осуществляется в регистре RCC->CFGR3, бит TIM1SW.
Да просто опечатка В принципе разобрался Спасибо Вам за ответ
Максимальную частоту PWM которую можно снять с шины это половина частоты самой шины , то есть если частота шины к примеру 80 мГц , то на выходе можно снять 40мГц максимум , хотя на крутых платах я не совсем добился частоты переваливающию за 50мГц , надо было еще подсказать зачем такие значения заносим в регистр напрямую , а то некоторым не совсем понятно или с ходу могут не понять , это значение половина значения периуда , тоесть нашего тикания , к примеру если периуд 200 то что бы получить 50 процентов заполнения ШИМ , то нужно просто взять е половинку 100, и тогда будет хороший меандр
т.е по примеру выше, например для STM32F103C8T6 мы сможем получить ШИМ свыше 35 мГц?
На случай, если кому-то очень не хватает частоты ШИМа, но уходить с AVR не хочется, добавлю, что в копеечном attiny85 имеется высокоскоростной асинхронный таймер (Timer1 + PLL), который умеет работать на частоте 64 МГц. Что сходу дает частоту ШИМ 250 кГц. А если полная длительность импульса не требуется, можно ее уменьшить наполовину, и получить ШИМ 500 кГц.
А почему не хочется уходить с AVR??? Бегом надо бежать!!! Технический прогресс никогда не будет стоять на месте и ждать пока вы наиграетесь в ардуино.
Не знаю, чем вам не угодил AVR, и куда вы хотите бежать, но в данной ситуации он полностью удовлетворяет поставленной задаче. Камни разные важны, камни разные нужны.
Бомба пушка ! Ваши видео подтолкнули и помогли перейти с Arduino на stm
Надо не часто, но как же stm поможет расширить возможности) спасибо
Доброго дня.
Вы очень интересно всё объясняете. Можно вас попросить записать видео по прерываниям в stm32 совместно с работой энкодера для меню.
За ранее благодарен за ответ.
Объясните мне, зачем нужно заносить значение заполнения шим напрямую в регистр? Чем это отличается от халовской функции SET_COMPARE? Благодарю заранее)
Владимир Спасибо!! Только по вашему видео получилось плавно моргать светодиодом на TIM2 на процессоре STM32F103. Материал усваивается,когда на столе получилось все без ошибок и потом уже легче осваивать материал!!! В каком куске кода идет плавное включение диода? Выключение плавное,а вот включение светодиода быстрое.. Это если вариант с одним диодом. Разобрался! CCR2 CCR3 Спасибо.
Разве предделитель и период нужно выбирать не с учетом Prescaler = Желаемый_предделитель - 1 ? Ведь там минимальное значение предделителя = 0, но по сути частота делится на 1. Значит, если мы хотим разделить частоту на 8, то нужно выставить значение 7. (та же логика и с периодом)
Спасибо за содержательные ролики. Не могли бы вы поднять тему регулировки Dsad time при комплементарном pwm
Может dead time? Ну типа "мертвое время"?
У меня один вопрос, почему все снимают видо про Keil, неужели так плох Atollic? Но спасибо, видео очень хорошее!
А какая разница? Это всего лишь IDE каждый выбирает что ему удобнее. Если вам по какой-то причине удобнее использовать Atollic, то вы можете абсолютно свободно это делать.
Потому что кеил понятнее и удобнее. Что называется сел и поехал.
@@ugene4063 атолик разве не сел и поехал? Настроил дебаг конфигурейшн и погнал
Даааа, работает! Частоту 100 кГц набирает в лёгкую! В avr наверное уже не вернусь. Владимир - Вы мой личный Иисус Христос!
Только у меня нет файла tim.c, все настройки идут в main. Походу кейл обновили.
PS. Вот еще что. В avr был глюк - когда ШИМ подбирался к крайниму верхнему значению, он не заполнял скважность на 100%, была пауза в один такт (провал шириной в одну микросекунду). Об этом даже в эрратах предупреждали, приходилось ставить дополнительное IF, чтобы убрать этот провал. В stm такого нет, только в счетный регистр надо записывать на единичку больше (не 4096, а 4097, иначе тоже появляется провал).
Генерировать настройки периферии в один файл - main.c или разнести по файлам, например spi.c, i2c.c, tim.c задается в настройках проекта в кубе. Удобнее чтобы не плодить кашу из кода.
И это... Что касается PWM, само понятие подразумевает что существуют чередующиеся периоды высокого и низкого уровней повтопяющиеся с определенной частотой. Без как вы выразились провала, это уже не ШИМ, а просто сигнал логического уровня. Записывая такие значения в регистр вы просто нарушаете нормальную работу генератора ШИМ.
Ну вот работает у меня step-down преобразователь со 100% мощностью. Это значит надо полностью открыть ключ (мощности киловаттные, любая лишняя дерготня мне кажется - ни к чему). А из-за этого короткого провала получается скважность не 100%, а 99,999%
Вы думаете, что записывать в регистр на единицу больше это ошибка (и читерство)? )))
Я ничего не думаю. Есть у меня причины не любить ШИМ со скважностью 100% и во всех случаях, когда это только возможно я заменю его на 99.99%. Это долгая дискуссия и слишком долгое обьяснение. Ну реально вагон времени потратить не хочется. Неспроста и в процессорах 99.999% скважность стоит. Не думаете же вы что и в STM и в AVR ошибка. Более того в эрраташите это обозначено как особенность а не как ошибка.
Добрый день, что можете сказать про dsLogic - насколько он хорош в работе и где вы его брали ? Спасибо.
Для большинства работ вполне подходит. К работе претензий нету. Брал на каком-то сайте уж и не вспомню где.
@@VladimirMedintsev Спасибо, а по цене не помните как на офицальном или дешевлен, а то сейчас я понял появились клоны на али. и как можно понять клон или оригинал?
Когда я покупал клонов еще не было. А официальный стоил 60 долларов.
Спасибо за столь познавательное видео!!!
Подскажите пожалуйста, у меня STM32F103 и мне нужно с него получить 2 рабочие частоты 30кГц и 100кГц. Т.к. они будут использоваться для усилителя и импульсного блока питания хотелось бы понять, надо ли использовать внешний кварцевый резонатор или нет и реально ли получить две рабочие частоты с разной скважностью и периодом 50!50?
Заранее спасибо Это видео вселяет надежды)
Да, это возможно. Но нужно понимать, что внутренняя RC цепочка имеет отклонение по частоте гораздо больше чем кварцевый резонатор. Если указанная в даташите точность вас устраивает то внешний кварц не нужен.
Частота гулять будет по температуре.
А как же определить какой порт нужно настроить на канал ШИМа .В Stm32f1 нашёл.А в Stm32f4 ?
Можно пример получения 15-35мГц ШИМ?
Здравствуйте Владимир. Подскажите пжлст простой способ преобразовать ШИМ в напряжение 0...10 В. Для управления частотником. Точность сильная не нужна - у меня есть обратная связь - она подстроит.
Конденсатор и резистор. Проще способа нету. На конденсаторе измеряем напряжение.
@@VladimirMedintsev А 10В откуда возьмется ? Операционник?
Операционный усилитель.
Только не скважность 50%, а рабочий цикл
Добрый день. Подскажите, как можно присвоить значение счётчика циклов REP (0-255), какой либо переменной для МК STM32F103C8T6.
Доброе время суток! Не подскажите как лучше поступить. У меня 4 драйвера (drv8432) на 4 мотора. В отличии от некоторых драйверов у него 2 входа ШИМ для изменения направления вращения мотора. Можно ли использовать 1 ШИМ с stm32 с двумя выходными каналами. И направление регулировать CCR регистром, по очереди включаяя и отключяя выходы?
А есть ли возможность проверить максимальную частоту работы GPIO (GPIOx-> OSPEEDRx |= {0x1,0x2,0x3}) с помощью PWM (TIMx->ARR = 2, 3, 4; TIMx->CCRx = {1..3})?
к сожалению нет в хозяйстве ни осциллографа ни анализатора уровней ☹
Честно говоря я не понял чего бы вы хотели проверить. Частоты переключения gpio в 2 мегагерца я использовал.
В смысле хотели бы посмотреть как начнут фронты заваливаться у сигналов? Это можно но уже завтра.
именно фронт. спс!!
Вот тут я думаю вы найдете ответ на свой вопрос - ruclips.net/video/wFN2K_ALT8k/видео.html
Огромное спасибо!
Не подскажешь как сгенерировать опорную частоту 32.768khz для stm32f103c8t6? Нужно для датчика. В MCO не поддерживается LSE с 32.767khz частотой. Поэтому вроде как остаётся только вариант с таймером и ШИМ. Если частота 72mhz то 2197 это делитель, получится частота 32.771. а как это все организовать в cube mx?
У тебя есть два способа задать частоту: это предделитель (prescaler) и счетчик (counter). Чтобы просто сгенерировать частоту, не нужно использовать ШИМ. Нужно в конфигурации канала таймера выбрать OUTPUT COMPARE. И подбирая значения делителя и счетчика можно добиться нужной частоты. Для твоего случая достаточно установить предделитель = 70, а счетчик = (нужная частота) - 1, то есть 32767. Ну предделитель устанавливается в зависимости от частоты тактирования таймера.
Здравствуйте! Скажите пожалуйста, можно при генерации ШИМ сигнала выставить значение периода меньше 128, чтобы получить больше значение частоты, чем 560 кГц? Например период 64? Что будет?
Вы еще раз разберитесь со значениями регистра. Для ШИМ сигнала высокой частоты есть HRTIM.
@@VladimirMedintsev Спасибо за информацию
Попробовал повторить и не понял где там вообще светодиоды в коде описаны, их переключения нигде же нет или я чего то не понимаю?
Сори, разобрался.
Надо что то написать для улучшения статистики канала.... Раз уж по видео придраться не к чему :))
Сегодня выпал в осадок на али, F407VGT стали по 220р ! Еще они.... будут умолять нас кубом не пользоваться.. :))
И появился китайский клон CS32F103C8T6 , но почему то по 50р, как и оригинал, видимо скоро подешевеет...
Ммммм) год назад.... Теперь зайди сейчас на али и посмотри сколько это все стоит)
А можно пояснить для чайников, что за ошибка в HAL?
Скорее не ошибка а дибилизм. Нет нормальной функции для изменения скважности генерируемого сигнала. Запустить-остановить генерацию можно, а изменить скважность только через перенастройку. Хотя делов то всего одно значение в регистр записать.
Ну, тогда это не ошибка... :)
Вот список функций:
Time PWM functions. This section contains the following APIs:
HAL_TIM_PWM_Init()
HAL_TIM_PWM_DeInit()
HAL_TIM_PWM_MspInit()
HAL_TIM_PWM_MspDeInit()
HAL_TIM_PWM_Start()
HAL_TIM_PWM_Stop()
HAL_TIM_PWM_Start_IT()
HAL_TIM_PWM_Stop_IT()
HAL_TIM_PWM_Start_DMA()
HAL_TIM_PWM_Stop_DMA()
Как вы думаете какая из них позволяет изменять скважность генерируемого ШИМ сигнала?
Такая же проблема с подключением энкодера))) до смешного тупость. Не баг а фича©
DeInit, меняем нужное, потом опять Init... :) Так?