Какова частота выхода ШИМ на Arduino?
Сигнал ШИМ генерируется таймерами на микросхемах AVR. Каждый таймер может генерировать ШИМ-сигнал на двух или трех разных контактах. Каждый вывод может иметь свой собственный рабочий цикл, но они имеют общую частоту ШИМ. Вы можете изменить частоту ШИМ, изменив источник синхронизации для таймеров. По умолчанию они используют тактовую частоту процессора, деленную на 64, т.е. у них установлен прескалер 64 с помощью кода инициализации Arduino. Чтобы еще больше запутать, есть два разных режима ШИМ: быстрый ШИМ и ШИМ с коррекцией фазы. В быстром ШИМ таймер считает до 255, затем переполняется и начинается с 0 (256 различных состояний). В ШИМ с корректной фазой таймер считает 255, затем меняет направление и понижает до нуля, меняет направление и т. Д. (510 различных состояний).
Arduino Mega имеет 5 таймеров, timer0 — timer4. Поскольку timer0 также используется для функций миллис и микросхем, он использует быстрый ШИМ, тогда как другие таймеры настроены на ШИМ с корректной фазой.
Выводы 4 и 13, управляемые таймером 0:
16 МГц / 64/256 = 976,56 ГцДругие выводы ШИМ, управляемые таймером 1-4:
16 МГц / 64/510 = 490,20 Гц
Вычисление: Режим часов / Прескалер / ШИМ, число состояний
Ситуация такая же для всех других плат Arduino, о которых я знаю, за исключением того, что у них меньше таймеров, которые подключаются к разным контактам.
Вы можете изменить частоту ШИМ, изменив прескалер таймера. Смотрите эту страницу: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Также можно настроить счетчики таймеров на значение, отличное от 255. На 8-разрядных таймерах вы потеряете выходной контакт, но на 16-разрядных таймерах вы можете использовать входной регистр захвата для определения значения TOP. Функция захвата ввода — это функция, редко используемая в сообществе Arduino, поэтому вы, вероятно, не пропустите ее.
Библиотеки Arduino позволяют использовать только 8-битное разрешение, даже на 16-битных таймерах. Если вы хотите более высокое разрешение, вам придется написать свой собственный аналогWrite или использовать библиотеку, созданную для этой цели. На Arduino Mega timer0 и timer2 являются 8-битными, а остальные — 16-битными.
Изменяя режим 16-битных таймеров, чтобы использовать полное разрешение, в сочетании с изменением предскалера и значения TOP, вы можете достичь очень широкого диапазона частот ШИМ.
Максимальная частота, которую вы можете достичь, — это тактовая частота / 4, если для прескейлера установить значение 1, а для TOP в 3 в режиме быстрого ШИМ — меньшее значение не допускается. Это даст вам 4 МГц ШИМ с разрешением 2 бита. Это может быть в 0%, 25%, 50% или 75% времени. Более высокое значение TOP даст вам более высокое разрешение на более низкой частоте.
Для более подробного объяснения прочитайте эту статью или обратитесь к таблице .
Изменение прескалера, режима ШИМ или значения TOP для таймера 0 приведет к путанице millis()
и micros()
.
Широтно-импульсная модуляция (ШИМ) | Класс робототехники
Как нам уже известно из первых уроков, любой микроконтроллер умеет хорошо работать с цифровыми сигналами. Он легко справляется с арифметическими операциями над цифровыми данными, принимает и передаёт цифровые сигналы по линиям связи. А что значит «цифровые» в данном случае?
В самом первом уроке мы зажигали и гасили светодиод с помощью Ардуино. Для того, чтобы зажечь светодиод, мы подавали на его анод высокий уровень сигнала. А чтобы погасить — низкий уровень. Получается, для управления мы использовали только два уровня напряжения: высокий и низкий. Светодиод либо будет гореть, либо не будет. Третьего — не дано. Оперируя только двумя состояниями означает, что мы работаем с цифровым сигналом.
Но что делать, если нам нужно зажечь этот самый светодиод только на половину яркости? Или запустить двигатель, на 30% его мощности? Для решения этой задачи используют подход, называемый широтно-импульсной модуляцией сигнала. О том, что такое ШИМ и как это работает, мы узнаем на сегодняшнем уроке.
Широтно-импульсная модуляция — ШИМ
Разберем понятие ШИМ на примере управления скоростью вращения двигателя постоянного тока. Поставим своей целью запустить мотор на 50% от его максимальной скорости. Пусть наш двигатель идеальный и чтобы достичь заданной скорости, нам нужно в единицу времени передавать на мотор в два раза меньше мощности. Как это сделать, не меняя источник питания?
Проведем мысленный эксперимент (а кто-то может и натуральный — ничего сложного). Возьмём мотор постоянного тока с массивным маховиком, закрепленным на валу (таким маховиком может служить колесо). Подадим питание от аккумулятора и мотор начнет набирать обороты. Через какое-то время, мотор достигнет номинальной мощности, а его ротор максимальной скорости вращения. Отключим питание, и мотор постепенно начнет замедляться вплоть до полной остановки.
Следующий опыт. Снова включим мотор, и когда его скорость достигнет половины от максимальной — выключим. Заметив, что скорость падает — снова включим. И так далее. Включая и выключая питание мотора, мы заставим ротор вращаться со скоростью, близкой к половине от максимальной!
Разумеется, в силу человеческой медлительности, мотор будет удерживать заданную скорость с некоторой погрешностью. Другими словами, скорость будет «плавать» вокруг заданного значения. Чтобы минимизировать эти отклонения, нам потребуется увеличить частоту переключений. Тут уже не обойтись без автоматики.
А как заставить мотор вращаться медленнее или быстрее? Количество переданной мотору энергии будет зависеть от отношения времени когда мотор включен — tвкл к времени когда он выключен — tвыкл.
Так, для передачи мотору 50% мощности, tвкл
будет равно tвыкл. Такой случай как раз изображен на графике. Чтобы мотор вращался еще медленнее, скажем с мощностью 25% от номинальной, придется время включения мотора уменьшить до этих самых 25% от общего периода управления T.Таким образом, имея возможность менять ширину импульсов, мы можем достаточно точно управлять скоростью вращения мотора.
Собственно, рассмотренный способ управления мощностью и называется широтно-импульсной модуляцией сигнала, а сокращённо — ШИМ. Теперь рассмотрим параметры которые характеризуют ШИМ сигнал и которые следует учитывать при написании программ для микроконтроллеров.
Коэффициент заполнения (duty cycle)
Начнем с самого главного параметра — коэффициента заполнения D (он же duty cycle). Этот коэффициент равен отношению периода ШИМ сигнала к ширине импульса:
D = T / tвкл
Пример ШИМ сигнала для разных значений D:
Чем больше D, тем больше мощности мы передаем управляемому устройству, например, двигателю. Так, при D = 1 двигатель работает на 100% мощности, при D = 0,5 — наполовину мощности, при D = 0 — двигатель полностью отключен.
Кстати, кроме коэффициента заполнения для характеризации ШИМ применяют и другой параметр — скважность S. Эти два параметра связаны выражением:
S = 1/T
Скважность, как и коэффициент заполнения — величина безразмерная. В отличие от D, она может принимать значения от 1 до бесконечности. Но чаще всего, особенно в англоязычных источниках, используют именно D.
Частота ШИМ
Частота ШИМ определяет период импульса — T (см картинку выше). Требования к этой частоте диктуются несколькими факторами, в зависимости от типа управляемого устройства.
В случае управления светодиодами одним из главных факторов становится видимость мерцания. Чем выше частота, тем менее заметно мерцание излучаемого света. Высокая частота также помогает снизить влияние температурных скачков, которые светодиоды не любят. На практике для светодиодов достаточно иметь частоту ШИМ в пределах 100-300 Гц.
С моторами постоянного тока дела обстоят немного иначе. С одной стороны, чем больше частота, тем более плавно и менее шумно работает мотор. С другой — на высоких частотах падает крутящий момент. Нужен баланс. Более подробно о моторах мы поговорим в одной из будущих статей, а пока рекомендуем для большинства DIY задач использовать частоту ШИМ 2кГц.
Плюс, общая проблема для всех случаев управления силовой нагрузкой — потери в цепях силовой коммутации (в транзисторах, и не только), которые увеличиваются с ростом частоты ШИМ. Чем больше частота, тем большее время транзисторы находятся в переходных состояниях, активно выделяя тепло и снижая эффективность системы.
Разрешение ШИМ
Ещё один важный параметр — разрешение ШИМ сигнала. Этот параметр показывает, с какой точностью мы можем менять коэффициент заполнения. Чем больше разрешение, тем плавнее будет меняться мощность на управляемом устройстве.
Например, у платы Ардуино с базовыми настройками, разрешение ШИМ — 256. То есть мы можем изменять сигнал от 0 до 255 — не густо, но для большинства DIY задач хватает.
ШИМ и микроконтроллеры
Простейший генератор ШИМ можно собрать и без всяких микроконтроллеров, только лишь с микросхемой таймера 555. Разумеется, любой микроконтроллер тоже умеет работать с ШИМ сигналом.
Например, у платы Ардуино имеется 6 контактов: 3, 5, 6, 9, 10 и 11, которые можно настроить для генерации аппаратного ШИМ. По-умолчанию, на контактах 5 и 6 частота сигнала будет 1кГц, на остальных — скромные 500Гц. Как ими пользоваться ШИМ на Ардуино подробно рассказывается на уроке «Ардуино: ШИМ» (скоро будет).
STM32F103 — гораздо более серьёзный микроконтроллер. У него целых 20 контактов имеют возможность генерации ШИМ. Частота этого микроконтроллера — 72МГц, что делает возможным плавное и точное управление моторами постоянного тока, не говоря уже о светодиодах. Узнаём подробности в уроке про STM32 и ШИМ.
Кстати, микроконтроллеры умеют не только генерировать ШИМ, но и детектировать подобные сигналы. Про это можно почитать в соответствующей статье на нашем портале (скоро будет).
Вконтакте
Arduino считывание широтно-импульсной частоты и рабочего цикла с одного цифрового входа
Я новичок в Arduino и кодировании, но сделал все учебники и думаю, что я получаю представление о том, как все это работает.
У меня есть реальная проблема, которую я хотел бы решить с помощью arduino.
У меня есть сигнал PWM от топливной форсунки на бензиновом движке, который мне нужен для получения двух отдельных логических функций изнутри arduino.
Определите задержку между каждым восходящим фронтом (чтобы вывести движок RPM) диапазон между 6 мс — 120 мс между восходящими кромками и считывание широтно-импульсного рабочего цикла (для определения рабочего цикла топливной форсунки) Диапазон ширины импульса от 0.02ms до более чем 10 мс для длин импульсов.
они должны быть представлены независимо в логике как «RPM» и «Pulse Width»
Я прочитал этот блог о «secrets of Arduino PWM» и нахожу его информативным о том, как использовать WRITE широтно-импульсных выхода с различной частотой и рабочим циклом, но я пытаюсь использовать READ широтно-импульсных выходов с различной частотой и рабочим циклом, чтобы создать переменный байт или int для каждого из них.
c++ arduinoПоделиться Источник NateCroix 23 января 2014 в 22:04
2 ответа
1
Правильно, на входах временных импульсов не так много или что-то подобное. Где Arduino-е ATmega могут фиксировать время каждой стороны рабочего цикла с помощью приведенных ниже методов. И это будет зависеть от кода, чтобы собрать их вместе и рассмотреть их как PWM для ваших нужд.
Существует несколько методов с примерами.
Опрос по замкнутому циклу приуроченных событий. Например, с PulseIn
Лучший способ-создать прерывание переполнения timer1 и во время этого ISR вытащить штифт. Это оригинальный метод, который Кен Инфракрасная библиотека Ширриффа работает — 50 мс тянет ИК-библиотеку Ширриффа, где ее разрешение так же хорошо, как и переполнение.
Используйте Прерывания смены пин-кода ISR, чтобы получить время. Где она будет слегка скрытой. Где fork микротериона из IR библиотеки Кена преобразовало переполнение в PinChangeInt. Где код MicroTherion сделал это дискретно в библиотеке. Где библиотека PinChangeInt делает это проще.
Используйте захват входного сигнала таймера. Короче говоря, когда соответствующие изменение входного pin-кода происходит захват системных часов и выдается прерывание . Таким образом, ISR может латентно получить точное время, когда это произошло. InputCapture.ino
Поделиться mpflaga 24 января 2014 в 05:41
0
Я только что написал библиотеку с примером, который делает именно это. В моей библиотеке Timer2_Counter я написал пример, который в настоящее время называется «read_PWM_pulses_on_ANY_pin_via_pin_change_interrupt», который считывает импульсы, а затем выводит ширину импульса в сша с разрешением 0.5us, а также период между импульсами и частоту импульсов.
Загрузите библиотеку и ознакомьтесь с примером. Чтобы проверить пример, вы можете подключить провод от вывода PWM, выводящего сигнал PWM, к входному выводу. Библиотека с примером находится здесь: http://www.electricrcaircraftguy.com/2014/02/Timer2Counter-более точный-Arduino-микро-function.html
PS. в этом примере кода используются прерывания смены выводов, и это может быть сделано на ЛЮБОМ выводе Arduino, включая аналоговые контакты.
Поделиться Gabriel Staples 22 марта 2015 в 01:16
Похожие вопросы:
Функция импульсной характеристики в matlab
Есть примеры суммирования вектора, но не матрицы в Matlab. Поэтому, пожалуйста, помогите решить следующие проблемы: Как написать функцию импульсной характеристики в matlab? Мне нужна программа в…
Измерение частоты прямоугольной волны в MATLAB с использованием USB 1024HLS
Я пытаюсь измерить частоту прямоугольной волны, которая считывается через модуль USB 1024 HLS Daq через MATLAB. То, что я сделал, — это создал цикл, который считывает 100 значений из цифрового…
Цифровое и аналоговое считывание с arduino по Labview
Я пытаюсь визуализировать температуру и аналоговое считывание напряжения graphing с arduino на Labview, однако через некоторое время adquisition и диаграмма формы волны замедляются. Я использую…
Измерьте рабочий цикл входа PWM с помощью PIC?
Я пытаюсь написать программу для микроконтроллера PIC24F, которая может измерять рабочий цикл входного сигнала с широтно-импульсной модуляцией. Кто-нибудь делал это? Каков был бы наилучший подход?
Найдите повторение одного и того же символа (буквенно-цифрового) с помощью bash
Я пытаюсь написать команду bash, чтобы найти, содержит ли строка повторение одного и того же буквенно-цифрового символа один за другим. Например: input: aaa, abc, aba, abc111; output: aaa, abc111….
Arduino перегрев uno
Я попытался получить цифровое считывание на своей плате arduino uno, чтобы проверить, включен или выключен сигнал 5V. Когда я подключил его к цифровому контакту 9, он очень быстро нагрелся. Кроме…
Arduino Due Sam3X8E доступ к значению таймера
Я использую Arduino Due который имеет ядро Atmel SAM3X8E мне нужно запустить таймер SAM3X8E и считывание значения непосредственно сформировать таймер у любого есть пример того как запустить таймер…
Изменение частоты цифрового ШИМ на Arduino Uno rev 3
Я пытаюсь изменить частоту цифрового ШИМ-вывода #9 на Arduino Uno до 70 Гц. Я нашел несколько примеров кода для изменения частоты контактов, но ничего не очень ясно. Может ли кто-нибудь объяснить…
Форматирование цифрового аудио
У меня есть векторизованный wav-файл со значениями от -1 до 1, 88 200 сэмплов, частота дискретизации 44.1 kHz, чтобы услышать звук в течение двух секунд. Я хотел бы отправить звук через bluetooth на…
Генерация импульсной амплитудной модуляции с использованием синусоидальной волны и сигнала PWM с использованием python
Я использую приведенные ниже коды для генерации амплитуды импульса Модуляция сигнала с помощью булевой операции между синусоидальной волной и Сигнал широтно-импульсной модуляции(PWM). Я использую…
PCA9685 16 канальный ШИМ модуль
PCA9685 — 16 канальный ШИМ(PWM) расширитель портов, управляемый по I2C(TWI). Этот модуль используется если на плате Ардуино, STM32, ESP8266 или ESP32 закончились ШИМ выходы. На плате имеются 6 отрытых контактов для формирования I2C адреса, что дает возможность подключить параллельно к шине 62 устройства PCA9685. Все выходы PWM модуля защищены резисторами 220 Ом, по этому даже если произойдет короткое замыкание любого выхода на GND или на (+)питания, то с устройством ничего не произойдет. На контроллере установлен электролитический конденсатор большой емкости, он фильтрует помехи по линии питания. Для защиты от переполюсовки, на линии питания нагрузки, установлен мощный MOSFET транзистор. Так же есть функция программного сброса по шине I2C.
Характеристики PCA9685
Количество ШИМ выходов | 16 |
Разрешение ШИМ(PWM) | 12 бит |
Частота ШИМ(PWM) | 24 … 1526 Гц |
Напряжение питания | 2,3 … 5,5 В |
Потребление в спящем режиме |
1 мА |
Допустимый ток выхода |
25 мА |
Частота шины I2C | до 1 мГц |
Размеры |
65 x 26 x 6 мм |
Вес | 11 г |
Подключение:
GND | Общий |
OE | Активация выходов |
SCL | Тактирование шины I2C |
SDA |
Данные шины I2C |
VCC |
Питание модуля |
V+ | Питание нагрузки |
Как изменить частоту ШИМ на Arduino UNO? | Электроника и жизнь
Здравствуйте, уважаемые читатели! В прошлой статье я рассказывал как с помощью Ардуино измерить частоту ШИМ сигнала. Если не читали, то лучше предварительно с ней ознакомиться, т.к. эта статья является продолжением прошлой. В данной статье я расскажу как можно изменить стандартную частоту ШИМ сигнала на Ардуино. Это может понадобиться, если по каким-то причинам, установленной по умолчанию для Ардуино частоты ШИМ сигнала не достаточно для работы готового устройства. Пример я покажу для Arduino UNO, хотя он будет актуален и для большинства других микроконтроллеров семейства Ардуино ( Arduino Nano , Arduino Mini , Arduino Mega).
Как изменить частоту ШИМ на Arduino UNOКак изменить частоту ШИМ на Arduino UNO
Изменить частоту ШИМ сигнала можно двумя методами.
Первый вариант — через регистры, меняя режим работы таймера, с которым связан пин.Частота ШИМ сигнала по умолчанию для Arduino UNOЧастота ШИМ сигнала по умолчанию для Arduino UNO
Менять частоту ШИМ сигнала на 5 и 6 пину не рекомендуется, т.к. вместе с этим, мы меняем режим работы основного таймера Timer 0, с которым связаны функции, работающие со временем, такие как delay () и используемая в нашем скетче функция pulseIn () . Так что менять частоту ШИМ сигнала будем на 9 и 10 пину. Точно таким же образом меняется частота на 3 и 11 пину.
Чтобы понять, каким именно регистрам и какое значение нужно присвоить, нужно изучить даташит на ATmega328 , начиная со 108 страницы (https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf). Именно этот микроконтроллер, является основой для Arduino UNO.
Важнейшая для нас информация находится на 110 странице, в таблице 15-6. Здесь указано какие 3 младших бита для регистра TCCR1B, связанного с работой Timer1 нужно установить, чтобы задать нужный делитель.
Таблица 15-6 даташит ATmega328Таблица 15-6 даташит ATmega328
Регистр TCCR1BРегистр TCCR1B
А для простоты можно использовать выражения, которые остается только скопировать и в ставить в функцию setup () .
Установка частоты ШИМ сигнала для пинов D9 и D10 (Timer1)
TCCR1B = TCCR1B & B11111000 | B00000001; //делитель 1 для частоты ШИМ 31372.55 Гц
TCCR1B = TCCR1B & B11111000 | B00000010; //делитель 8 для частоты ШИМ 3921.16 Гц
TCCR1B = TCCR1B & B11111000 | B00000011; //делитель 64 для частоты ШИМ 490.20 Гц (по умолчанию)
TCCR1B = TCCR1B & B11111000 | B00000100; //делитель 256 для частоты ШИМ 122.55 Гц
TCCR1B = TCCR1B & B11111000 | B00000101; //делитель 1024 для частоты ШИМ 30.64 Гц
Установка частоты ШИМ сигнала для пинов D3 и D11 (Timer2)
TCCR2B = TCCR2B & B11111000 | B00000001; //делитель 1 для частоты ШИМ 31372.55 Гц
TCCR2B = TCCR2B & B11111000 | B00000010; //делитель 8 для частоты ШИМ 3921.16 Гц
TCCR2B = TCCR2B & B11111000 | B00000011; //делитель 32 для частоты ШИМ 980.39 Гц
TCCR2B = TCCR2B & B11111000 | B00000100; //делитель 64 для частоты ШИМ 490.20 Гц (по умолчанию)
TCCR2B = TCCR2B & B11111000 | B00000101; //делитель 128 для частоты ШИМ 245.10 Гц
TCCR2B = TCCR2B & B11111000 | B00000110; //делитель 256 для частоты ШИМ 122.55 Гц
TCCR2B = TCCR2B & B11111000 | B00000111; //делитель 1024 для частоты ШИМ 30.64 Гц
Источник: https ://forum .arduino.cc/index.php?topic=328714.0
Для примера, в начале функции setup() (код скетча из прошлой статьи) добавим строку, которая для первого таймера устанавливает делитель 1024 , тем самым мы устанавливаем частоту ШИМ сигнала равной примерно 30 Гц .
Устанавливаем частоту шим на 9/10 пину 30 ГцУстанавливаем частоту шим на 9/10 пину 30 Гц
Загружаем скетч в Ардуино, открываем Монитор порта и видим, что частота на 9 пину составляет около 30 Гц .
Измеренное значение в Мониторе портаИзмеренное значение в Мониторе порта
А если скопировать выражение с установкой делителя 1, то частота составит максимально возможную для 9 пина — около 31 КГц.
Устанавливаем частоту шим на 9/10 пину 31 КГцУстанавливаем частоту шим на 9/10 пину 31 КГц
Измеренное значение в Мониторе портаИзмеренное значение в Мониторе порта
Таким способом можно изменить частоту ШИМ сигнала без подключения библиотек, но только с определенным шагом, соответствующим делителю.
Второй вариант – установка специальной библиотеки.Открываем библиотеку по ссылке https://github.com/terryjmyers/PWM. Скачиваем ее и добавляем в Arduino IDE .
В примерах библиотеки есть скетч PWM. Из кода скетча видно, что переменной frequency мы задаем нужную нам частоту. И далее, устанавливаем ее для выбранного пина. В данном случае, это пин 9.
Перенесем нужные нам данные из примера библиотеки в наш скетч, измеряющий частоту ШИМ сигнала. Не забываем в начале подключить саму библиотеку. И еще, вместо функции analogWrite () , будем использовать функцию pwmWrite (). Аргументы ровно те же, отличается только имя функции.
Скетч измерения частоты ШИМ с помощью библиотеки PWM.h. Ссылка на его скачивание в конце статьи.Скетч измерения частоты ШИМ с помощью библиотеки PWM.h. Ссылка на его скачивание в конце статьи.
Протестируем функцию на некоторых значениях.
Вначале пусть будет значение из примера – 35 Гц . В Мониторе порта получаем — 35,21 Гц.
50 Гц – получаем 50,29 Гц .
100 Гц – получаем 100,54Гц .
300 Гц – получаем 301,57 Гц .
1000 Гц – получаем 1005 Гц .
В общем, измеренные значения, весьма близки к задаваемым.
Вот такие существуют достаточно простые способы изменения частоты ШИМ сигнала на Arduino UNO. А в следующей статье, я расскажу как задавать нужную частоту ШИМ сигнала на микроконтроллерах ATtiny . Там есть свои особенности.
Ссылка на скетч из статьи — https://disk.yandex.ru/d/sKX8EiwxTyaFHA
Видео по материалам статьи (прошлой и этой):
_________________________________________________________
Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!
Другие публикации по теме:
- Как измерить частоту ШИМ с помощью Arduino UNO?
Памятка по декодированию PWM и PPM сигнала
Типичная радиоаппаратура работает как-то так. Есть передатчик (собственно, сама аппа) и приемник. Приемник с передатчиком общаются по какому-то своему протоколу, часто закрытому. Приемник декодирует этот протокол и передает положение ручек на аппаратуре дальше, например, полетному контроллеру (ПК) квадрокоптера. ПК и приемник общаются по своему протоколу, который должны понимать оба. В этом месте большой популярностью пользуются PWM и PPM. Есть и другие варианты, в частности, SBUS, DSM2 и DSX, но в рамках данной статьи мы рассмотрим только PWM и PPM.
PWM (Pulse Width Modulation), он же ШИМ, всем хорошо знаком. Раз в 20 мс по проводу передается положительный импульс, длительность которого определяет положение ручки. Длительность импульса около 1000 микросекунд соответствует одному крайнему положению, а 2000 микросекунд — другому крайнему положению. На практике присутствует некоторая ошибка измерения, из-за чего, в частности, полетный контроллер и аппаратура требуют калибровки. PWM прост и понятен, но плох тем, что требует отдельного провода на каждый канал (то есть, каждую ручку аппаратуры). Сейчас многие аппаратуры имеют 8 и более каналов, а значит при использовании PWM приходится использовать много проводов.
PPM (Pulse Position Modulation) — это такая попытка запихнуть много PWM сигналов в один провод, ну или, по крайней мере, мне лично нравится о нем так думать. PPM всегда передает короткие импульсы. Паузы между фронтами импульсов соответствуют длительности одного PWM сигнала. Сигналы передаются последовательно, сначала значение на первом канале, затем на втором, и так далее. Соответствие между PPM и PWM сигналами хорошо отражает следующая осциллограмма, записанная на Rigol DS1054Z:
Осциллограмма снята с приемника RadioLink R8EF, имеющего режим, при котором на два его пина подаются сигналы PPM и SBUS, а на остальные пины — PWM сигнал для каналов с 3 по 8. Поэтому PWM сигналы для каналов 1 и 2 не показаны. Тут можно видеть несколько интересных особенностей. Во-первых, данный конкретный приемник использует для логической единицы 3.3 В, хотя и питается от 5 В. Во-вторых, в нем PPM сигнал инвертирован по сравнению с тем, как его обычно рисуют на картинках (например, в этом треде). Как ни странно, все написанное выше про фронты импульсов при этом остается верным. В частности, на картинке курсорами выделены фронты, соответствующие PWM сигналу на 3 канале. При этом PPM сигнал оказывается смещенным относительно PWM сигналов, но вообще-то приемник и не обязан был их как-то синхронизировать.
PPM работает хорошо до тех пор, пока вы не пытаетесь засунуть в него больше 8 каналов. Если каналов больше, то либо сигналы начинают обновляться с задержкой больше 20 мс (как в случае с PWM), либо приходится «сжимать» сигналы, теряя их точность, либо использовать дополнительные провода. Лично я не видел, чтобы по PPM передавали больше 8 каналов.
Хорошо, теперь допустим, что я хочу управлять своим роботом при помощи радиоаппаратуры. Вот соответствующий код для PWM:
#include <Arduino.h>#include <PinChangeInt.h>
#define NCHANNELS 8
#define Ch2_PIN 5 // Ch3_PIN = Ch2_PIN + 1, etc
volatile int pwm_value[NCHANNELS] = { 0 };
volatile int prev_time[NCHANNELS] = { 0 };
void rising();
void falling() {
uint8_t pin = PCintPort::arduinoPin;
PCintPort::attachInterrupt(pin, &rising, RISING);
pwm_value[pin — Ch2_PIN] = micros() — prev_time[pin — Ch2_PIN];
}
void rising()
{
uint8_t pin = PCintPort::arduinoPin;
PCintPort::attachInterrupt(pin, &falling, FALLING);
prev_time[pin-Ch2_PIN] = micros();
}
void setup() {
for(uint8_t i = 0; i < NCHANNELS; i++) {
pinMode(Ch2_PIN + i, INPUT_PULLUP);
PCintPort::attachInterrupt(Ch2_PIN + i, &rising, RISING);
}
Serial.begin(9600);
}
void loop() {
for(uint8_t i = 0; i < NCHANNELS; i++)
Serial.println(«ch» + String(i+1) + » = » + String(pwm_value[i]));
Serial.println(«—————-«);
delay(1000);
}
А это — код для PPM:
#include <Arduino.h>#include <PinChangeInt.h>
#define PPM_PIN 6
#define MAX_CHANNELS 12
volatile int pwm_value[MAX_CHANNELS] = { 0 };
volatile int prev_time = 0;
volatile int curr_channel = 0;
volatile bool overflow = false;
void rising()
{
int tstamp = micros();
/* overflow should never acutally happen, but who knows… */
if(curr_channel < MAX_CHANNELS) {
pwm_value[curr_channel] = tstamp — prev_time;
if(pwm_value[curr_channel] > 2100) { /* it’s actually a sync */
pwm_value[curr_channel] = 0;
curr_channel = 0;
} else
curr_channel++;
} else
overflow = true;
prev_time = tstamp;
}
void setup() {
pinMode(PPM_PIN, INPUT_PULLUP);
PCintPort::attachInterrupt(PPM_PIN, &rising, RISING);
Serial.begin(9600);
}
void loop() {
for(uint8_t i = 0; i < MAX_CHANNELS; i++)
Serial.println(«ch» + String(i+1) + » = » + String(pwm_value[i]));
if(overflow)
Serial.println(«OVERFLOW!»);
Serial.println(«—————-«);
delay(1000);
}
Код был проверен на радиоаппаратуре RadioLink T8FB и приемнике к ней R8EF. На следующем фото приемник, переведенный в режим PPM, подключен к Arduino Nano с залитой в нее прошивкой для PPM:
Пример отладочного вывода по UART:
ch2 = 1492
ch3 = 1500
ch4 = 1508
ch5 = 1496
ch5 = 2000
ch6 = 996
ch7 = 1996
ch8 = 2000
…
Назначение использованной выше библиотеки PinChangeInt должно быть понятно по коду. Она позволяет вешать прерывания на передний и задний фронты (нарастание и спад) сигнала на заданных пинах. Подробности об этой библиотеке можно найти здесь и здесь. Полная версия кода прошивок для декодирования PWM и PPM сигналов доступна на GitHub.
Вооруженные полученными здесь знаниями, мы можем не только управлять Arduino при помощи радиоаппаратуры, но и, например, паять перекодировщики PWM в/из PPM (если не хочется платить за готовые на AliExpress), или даже изготавливать собственные радиоаппаратуры на базе какого-нибудь NRF24L01 или иного радиомодуля. Это просто первое что мне лично пришло в голову.
А какие безумные идеи для творчества есть у вас?
Метки: AVR, Электроника.
отзывы, фото и характеристики на Aredi.ru
Мы доставляем посылки в г. Калининград и отправляем по всей России
- 1
Товар доставляется от продавца до нашего склада в Польше. Трекинг-номер не предоставляется.
- 2
После того как товар пришел к нам на склад, мы организовываем доставку в г. Калининград.
- 3
Заказ отправляется курьерской службой EMS или Почтой России. Уведомление с трек-номером вы получите по смс и на электронный адрес.
!
Ориентировочную стоимость доставки по России менеджер выставит после оформления заказа.
Гарантии и возврат
Гарантии
Мы работаем по договору оферты, который является юридической гарантией того, что мы выполним
свои обязательства.
Возврат товара
Если товар не подошел вам, или не соответсвует описанию, вы можете вернуть его, оплатив
стоимость обратной пересылки.
- У вас остаются все квитанции об оплате, которые являются подтверждением заключения сделки.
- Мы выкупаем товар только с проверенных сайтов и у проверенных продавцов, которые полностью отвечают за доставку товара.
- Мы даем реальные трекинг-номера пересылки товара по России и предоставляем все необходимые документы по запросу.
- 5 лет успешной работы и тысячи довольных клиентов.
analogWrite () — Ссылка на Arduino
Описание
Записывает аналоговое значение (сигнал ШИМ) на вывод. Может использоваться для освещения светодиода с разной яркостью или для привода двигателя с разной скоростью. После вызова analogWrite ()
вывод будет генерировать устойчивую прямоугольную волну указанного рабочего цикла до следующего вызова analogWrite ()
(или вызова digitalRead ()
или digitalWrite ()
). на той же булавке.
Доска | Штырьки ШИМ | Частота ШИМ |
---|---|---|
Uno, Nano, Mini | 3, 5, 6, 9, 10, 11 | 490 Гц (контакты 5 и 6: 980 Гц) |
Мега | 2–13, 44–46 | 490 Гц (контакты 4 и 13: 980 Гц) |
Леонардо, Микро, Юн | 3, 5, 6, 9, 10, 11, 13 | 490 Гц (контакты 3 и 11: 980 Гц) |
Uno WiFi Rev2, Nano Every | 3, 5, 6, 9, 10 | 976 Гц |
Платы MKR * | 0-8, 10, A3, A4 | 732 Гц |
MKR1000 WiFi * | 0-8, 10, 11, A3, A4 | 732 Гц |
Ноль * | 3–13, A0, A1 | 732 Гц |
Нано 33 IoT * | 2, 3, 5, 6, 9 — 12, A2, A3, A5 | 732 Гц |
Nano 33 BLE / BLE Sense | 1–13, A0 — A7 | 500 Гц |
Срок погашения ** | 2-13 | 1000 Гц |
101 | 3, 5, 6, 9 | контакты 3 и 9: 490 Гц, контакты 5 и 6: 980 Гц |
* В дополнение к возможностям ШИМ на контактах, упомянутых выше, платы MKR, Nano 33 IoT и Zero имеют настоящий аналоговый выход при использовании analogWrite ()
на контакте DAC0
( A0
).
** В дополнение к возможностям ШИМ на контактах, указанных выше, Due имеет настоящий аналоговый выход при использовании analogWrite ()
на контактах DAC0
и DAC1
.
Вам не нужно вызывать pinMode ()
, чтобы установить вывод в качестве выхода перед вызовом analogWrite ()
.
Функция analogWrite
не имеет ничего общего с аналоговыми выводами или функцией analogRead
.
Синтаксис
Параметры
pin
: вывод Arduino для записи.Допустимые типы данных: int
.
значение
: рабочий цикл: от 0 (всегда выключен) до 255 (всегда включен). Допустимые типы данных: int
.
Возвращает
Генерировать сигнал с широтно-импульсной модуляцией на выводе аналогового выхода
Описание
Блок ШИМ генерирует прямоугольные импульсы с различной продолжительностью включения в зависимости от входное значение, отправляемое в блок на аппаратном выводе Arduino ® . Этот блок позволяет цифровому выходу обеспечивать диапазон различные уровни мощности, аналогичные аналоговому выходу.
Для получения дополнительной информации о том, как выбрать контакты, когда вы Simulink ® модель содержит ШИМ, стандартное чтение сервопривода, стандартную запись сервопривода, непрерывную запись сервопривода и захват ввода блоков, см. Конфликт конфигураций контактов на таймере Arduino.
Ограничения
Если вы используете блок PWM вместе с блоками последовательного приема и последовательной передачи в модели Simulink, используйте более длительные времена выборки, чтобы избежать переполнений.
В этой таблице указан верхний предел выходной частоты, которая может быть сгенерирована. на цифровых выводах следующих плат Arduino.
Тип платы Arduino Номер контакта Arduino Сгенерированные выходные частоты ШИМ (Гц) Uno, Nano 3.0 5
,6
980,4 3
,11
31372,55
,3921,16
,980,4
,490,2
,245.1
,122,55
,30,64
Мега 2560 / ADK 4
,13
980,4
9
,10
31372.55
16,
1,16
980,4
,490,2
,245,1
,122,55
,30,64
Леонардо, плата управления роботом, плата двигателя робота, Micro 3
,11
980.4
Arduino PWM: широтно-импульсная модуляция в Arduino
Многие платы Arduino, такие как Uno и Nano, не имеют возможности выводить разные напряжения, как мы обсуждали в нашей статье о цифро-аналоговом преобразователе (DAC) Arduino. Однако они могут быстро переключать выходные сигналы в форме широтно-импульсной модуляции (ШИМ) для имитации переменного выходного сигнала.
Мы можем использовать две характеристики для описания сигнала ШИМ Arduino (или любого другого ШИМ):
1.Частота: частота появления импульсов в заданный период времени.
2. Рабочий цикл : какой процент времени включен сигнал.
Например, сигнал с коэффициентом заполнения 50% будет иметь одинаковое время повторения во включенном и выключенном состоянии. Частота в управляющем сигнале имеет тенденцию оставаться постоянной. Ознакомьтесь с нашей статьей All About PWM , чтобы узнать больше об этой технике.
На данный момент мы рассмотрим ШИМ, поскольку он напрямую связан с платами Arduino, особенно в контексте Arduino Uno с микроконтроллером ATmega328P.К счастью, мы можем применить эти концепции к любой доске разработчиков.
Изображение: Джереми С. Кук
Управление светодиодами Arduino PWM
Чтобы начать работу со светодиодами Arduino PWM, вы можете использовать «Fade», пример PWM, который встроен в Arduino IDE. Чтобы получить доступ к этому примеру, который вы можете видеть на скриншоте выше, выполните следующие действия:
1. Перейдите к среде IDE и найдите имя в разделе «основы».
2. Загрузите пример на свою доску.
3. Подключите последовательно светодиод и соответствующий резистор к выводу 9. Вы увидите, что светодиод со временем светлеет и темнеет.
4. При желании вы можете изменить номер выходного контакта (на 3, 5, 6, 10 и 11).
Вы также сможете изменить яркость и степень выцветания, и вы можете использовать этот код в качестве шаблона для более сложных дизайнов.
Управление двигателем Arduino PWM
Вы также можете использовать ШИМ с двигателем постоянного тока. В этом методе используется та же концепция импульсного напряжения, но вам понадобится установка драйвера двигателя / транзистора, чтобы справиться с более высокими потребностями двигателя в токе.
Если вы хотите управлять сервоприводом через ШИМ, придерживайтесь среды Arduino и используйте один или несколько сервообъектов, например:
- Пример развертки, как показано на веб-сайте Arduino.
- Управление сервоприводом с помощью ATtiny85 в рамках Arduino.
Частота и рабочий цикл Arduino PWM
В основных обсуждениях ШИМ частота имеет тенденцию отодвигаться на второй план по сравнению с рабочим циклом. И во многих случаях, когда вы превышаете определенный уровень, это не имеет большого значения.Однако в других случаях частота имеет значение. Например, шесть контактов аппаратного ШИМ на Uno работают на двух разных частотах по умолчанию с помощью трех отдельных таймеров. Они делятся на:
- D3 / D11, с частотой вращения 490,20 Гц.
- D5 / D6, с частотой вращения 976,56 Гц.
- D9 / D10, с частотой вращения 490,20 Гц.
Удобно, что вы можете изменять эти значения частоты как заданные в коде. Вот пример: TCCR2B = TCCR2B & B11111000 | B00000001 дает D3 / D11 частоту 31 372.55 Гц. Вы можете установить D5 / D6 еще выше с помощью TCCR0B = TCCR0B & B11111000 | B00000001, , что дает скорость 62500,00 Гц. Значения уровней ниже 100 Гц доступны для всех контактов ШИМ по мере необходимости.
Используете ли вы его для управления двигателями, освещением или другим приложением, Arduino PWM - отличный инструмент в вашем распоряжении. С помощью этой техники вы можете делать гораздо больше, чем просто включать и выключать устройство; вы можете смоделировать более тонкий вывод с минимумом оборудования.
Купите все продукты Arduino здесь
Учебное пособие поArduino PWM со светодиодным диммером
Этот светодиодный DIMMER представляет собой схему PWM (широтно-импульсной модуляции) на базе Arduino Uno, разработанную для получения переменного напряжения по сравнению с постоянным напряжением.Метод ШИМ объясняется ниже. Прежде чем мы приступим к созданию схемы светодиодного диммера на 1 Вт, сначала рассмотрим простую схему, показанную на рисунке ниже.
Теперь, если переключатель на рисунке постоянно замкнут в течение определенного периода времени, лампочка будет постоянно гореть в течение этого времени. Если переключатель замкнут на 8 мс и разомкнут на 2 мс в течение цикла 10 мс, то лампочка будет гореть только в течение 8 мс. Теперь среднее значение терминала за период 10 мс = время включения / (время включения + время выключения), это называется рабочий цикл и составляет 80% (8 / (8 + 2)), поэтому среднее выходное напряжение составит 80% от напряжения батареи.
Во втором случае переключатель замкнут на 5 мс и разомкнут на 5 мс в течение 10 мс, поэтому среднее напряжение на выходе будет 50% от напряжения батареи. Скажем, если напряжение аккумулятора составляет 5 В, а рабочий цикл составляет 50%, то среднее напряжение на клеммах будет 2,5 В.
В третьем случае рабочий цикл составляет 20%, а среднее напряжение на клеммах составляет 20% от напряжения батареи.
Теперь, как эта техника используется в светодиодном диммере ? Это объясняется в следующем разделе этого руководства.
Как показано на рисунке, Arduino UNO имеет 6 каналов ШИМ, поэтому мы можем получить ШИМ (переменное напряжение) на любом из этих шести контактов. В этой главе мы собираемся использовать PIN3 как выход ШИМ.
Необходимые компонентыОборудование: ARDUINO UNO, блок питания (5 В), конденсатор 100 мкФ, светодиод, кнопки (две штуки), резистор 10 кОм (две штуки).
Программное обеспечение: arduino IDE
Принципиальная схема и поясненияСхема подключается на макетной плате согласно принципиальной схеме.Однако при подключении светодиодных клемм необходимо соблюдать осторожность. Хотя в этом случае кнопки показывают эффект подпрыгивания, это не вызывает серьезных ошибок, поэтому на этот раз нам не о чем беспокоиться.
ШИМ от UNO довольно простой. Хотя настроить контроллер ATMEGA для сигнала ШИМ непросто, мы должны определить множество регистров и настроек для точного сигнала, однако в ARDUINO нам не нужно иметь дело со всеми этими вещами.
По умолчанию все файлы заголовков и регистры предопределены ARDUINO IDE, нам просто нужно их вызвать, и все, у нас будет выход PWM на соответствующем выводе.
Теперь, чтобы получить выход ШИМ на соответствующем выводе, нам нужно поработать над двумя вещами:
|
Сначала нам нужно выбрать вывод ШИМ из шести выводов, после этого нам нужно установить этот вывод как вывод.
Затем нам нужно включить функцию ШИМ в UNO, вызвав функцию analogWrite (pin, value). Здесь «пин» представляет номер пина, на котором нам нужен вывод ШИМ, мы указываем его как «3».Итак, на PIN3 мы получаем вывод ШИМ. Значение представляет собой рабочий цикл включения, от 0 (всегда выключен) до 255 (всегда включен). Мы собираемся увеличивать и уменьшать это число нажатием кнопки.
Использование контактов PWM в Arduino Uno объясняется в приведенном ниже коде C. 8 = 256.
Вы можете установить значение ШИМ с помощью инструкции analogWrite (pin, value).
Итак, analogWrite (3, 125) установит вывод 3 на значение 125.
Теперь вот что интересно.
Что произойдет, если мы установим для analogWrite значение больше 255? Скажем, 256?
Давайте подумаем об этом минутку.
Если значение ШИМ равно 255, двоичная версия - 11111111 (всего 8 бит) сохраняется в регистре ШИМ (не стесняйтесь использовать этот калькулятор для таких преобразований из двоичного в десятичное).Подключенный светодиод загорится с максимальной яркостью.
Давайте добавим 1 к регистру и сделаем значение ШИМ 256.
Двоичная версия 256 - это 0000000100000000 (всего 16 бит), так как теперь нам нужно два байта для представления этого значения.
Но, Arduino (на самом деле, его микросхема Atmega328P) может уместить только первый байт в регистр PWM, тот, который отмечен зеленым цветом.
Второй байт переполнится и «исчезнет» (красная часть).
Итак, на самом деле в регистре ШИМ хранится 00000000.Это десятичный «0», что означает, что ваш светодиод выключен.
Другими словами, analogWrite (3, 0) и analogWrite (3, 256) будут иметь одинаковый эффект на светодиод или двигатель.
Добавьте еще одну «1» в регистр, и значение ШИМ теперь равно 257.
Двоичная версия 257 - 0000000100000001 . Байт зеленого цвета сохраняется в регистре ШИМ, а остальной байт (красный) исчезает. В регистре теперь хранится десятичное значение «1».
Урок, который нужно усвоить, состоит в том, что, хотя вы можете установить значение ШИМ в analogWrite на любое десятичное число, которое вам нравится, только первый байт этого числа поместится в регистр ШИМ.
Остальные переполнятся и исчезнут.
Arduino Drone PWM читать коммерческий приемник
Это руководство разделено на несколько частей: Дрон строительный Приемник PWM чтения IMU + ПИД-регулирование ESCs PWM запись
2.0 Приемник PWM читать
Итак, приступим. Мы могли перепрыгнуть через часть сборки дрона, поскольку мы уже делали это в прошлых видео / руководствах. Я сосредоточусь только на части полетного контроллера дрона. Прежде всего, ниже представлена полная схема этого урока. Двигатели, подключенные к ESC и ESC к сигнальным контактам 4, 5, 6 и 7 от порта D Arduino NANO. Нам нужно будет создать сигнал ШИМ на эти контакты, чтобы управлять двигателями. Модуль IMU подключается к выводам i2c микроконтроллера A4 и A5.И 4-канальный вход от приемника к контактам 8, 9, 10 и 12 порта B.
В этой части мы будем работать с последними 4 контактами. Прежде всего, давайте посмотрим, как выглядит ШИМ-сигнал, который дает нам приемник. Я запитал приемник, подав на него 5 В, включил передатчик и подключил один сигнал к осциллографу, как мы видим ниже. У меня есть сигнал с широтно-импульсной модуляцией. Как мы видим здесь, ширина импульса радиоконтроллеров обычно составляет от 1000 до 2000 мкс.Частота обычно находится в диапазоне от 40 до 200 герц. В данном случае у нас 67 Гц, что является общим значением. Итак, мы должны подключить этот сигнал к Arduino и прочитать значение от 1000 до 2000. Итак, как мы это делаем?
Прежде всего, давайте поделимся заземлением и 5 В с приемником и подключим канал 1 к контакту 8 Arduino UNO для тестирования. Код будет работать так же в случае Arduino NANO. Мы могли бы использовать функцию pulse in для измерения ширины импульса. Но это не лучшее решение, потому что в коде полетного контроллера основной проблемой является время.В то же время, когда мы считываем значения PWM приемника, мы должны считывать данные IMU и вычислять значения PID, а также записывать сигнал для каждого из 4 ESC. Это много процессов, поэтому, чтобы не мешать и не создавать проблем с синхронизацией, мы должны использовать прерывания, в данном случае прерывания состояния контактов. Это прерывает основной цикл каждый раз, когда выбранный вывод меняет свое состояние с низкого на высокое, с высокого на низкое или с того и другого.
Хорошо, мы активируем прерывание изменения состояния для вывода 8, добавляя эти строки в код.Контакты с 8 по 13 Arduino, который использует чип Atmega 328, которые являются NANO, UNO и pro mini, соответствуют регистру порта B. Теперь каждый раз, когда сигнал на этом входе изменяется, мы переходим к подпрограмме обслуживания прерывания или ISR.
В ISR мы производим первое измерение прошедшего времени, а когда произойдет второе изменение, мы снова подсчитываем время и вычитаем первое значение, чтобы получить ширину импульса. Представьте себе это. Первое значение вывода - НИЗКОЕ. По нарастающему фронту вводим прерывание и получаем значение времени.Через некоторое время на заднем фронте мы снова входим в прерывание и получаем второе значение времени. Разница между этими двумя значениями времени и есть фактическая длительность импульса. Таким образом, мы получили входное значение.
2.1 Пример 1 канала
Я запускаю последовательную связь и печатаю значение на мониторе. Загрузите следующий пример в Arduino, подключите приемник к цифровому выводу 8 и откройте монитор. Как видите, когда я перемещаю джойстик канала 1, значение изменяется в диапазоне от 1000 до 2000.
Загрузите пример 1 канала здесь:
2.1 Пример 4 канала
Хорошо, теперь мы должны сделать то же самое для 4 каналов. Я назову эти каналы: входной YAW, входной Pitch, входной валок и входной дроссель. Хорошо, но теперь каждый из этих контактов может создавать прерывание. Поэтому для этого мы должны сначала проверить, на каком контакте произошло изменение. Используя регистры порта вывода, мы проверяем, является ли каждый вывод высоким или низким, и в то же время, было ли последнее состояние высоким или низким. Зная как последнее, так и текущее состояние входа, мы могли обнаруживать изменение состояния на каждом выводе и измерять время только тогда, когда это изменение происходит.
Загрузите 4-х канальный пример здесь:
Итак, у нас есть измеренная временная ширина каждого канала. Если ваш радиоконтроллер не отправляет импульсы от 1000 до 2000, и вы не можете его настроить, вам следует сопоставить эти значения с диапазоном от 1000 до 2000 или от 0 до 1000 с помощью функции карты. Нам нужен этот точный диапазон, потому что в будущих частях учебника нам придется записывать сигнал ШИМ на ESC двигателей с тем же диапазоном, чтобы вращать двигатели.Где 1000 - отсутствие движения, а 2000 - полный газ.
Итак, в качестве резюме этой первой части, мы сначала определяем наши переменные для каждого канала, для счетчика времени и еще нескольких переменных, которые мы будем использовать. Затем определите конфигурацию входных контактов в контуре настройки, чтобы активировать срабатывание прерывания. Процедура прерывания определяется отдельно от основного цикла с вектором, соответствующим прерываниям, созданным контактами, которые мы выбрали, и в основном цикле единственное, что мы делаем в этом примере, - это выводим значения на последовательный монитор.Нам придется удалить эти строки в окончательном коде и добавить все оставшиеся части.
Хорошо. В следующей части мы прочитаем данные IMU и создадим ПИД-регулятор для 4 двигателей, используя данные гироскопа и ускорения.
Хорошо, теперь, когда у нас есть сигнал приемника, давайте прочитаем данные IMU.
Учебное пособие и примеры ESP32 PWM (AnalogWrite)
В этом руководстве вы узнаете о ESP32 PWM и о том, как управлять каналами PWM в Arduino Core.Но прежде всего вы познакомитесь с тем, что такое ШИМ и как он работает в большинстве микроконтроллеров на аппаратном уровне. Затем мы исследуем периферийное оборудование ESP32 PWM и проверим, какие функции у него есть.
Затем мы перейдем к библиотекам Arduino Core, которые реализуют драйверы для периферийного устройства ESP32 LED PWM и способы использования его функций API, таких как ledcWrite (). Это что-то похожее на широко известную функцию Arduino analogWrite (), но с немного большей функциональностью и настройками, как мы увидим.Без лишних слов, давайте перейдем к делу!
Требования для этого учебного курса
Предварительные знания
Программные инструменты
Аппаратные компоненты
Вы можете получить полный комплект курсов для этой серии руководств, перейдя по ссылке ниже. Или просто обратитесь к таблице, где указаны точные компоненты, которые будут использоваться в практических лабораториях только для этого конкретного руководства.
Широтно-импульсная модуляция (ШИМ)
Широтно-импульсная модуляция (ШИМ) - это метод создания цифрового сигнала с управляемой формой волны для использования в различных приложениях.Существуют различные варианты реализации аппаратной ШИМ в различных микроконтроллерах. Но по сути они одинаковы с точки зрения конечного результата и использования.
Внутреннее оборудование ШИМ и как работает ШИМ?
Это общая схема оборудования типичного периферийного устройства с ШИМ.
Как вы можете видеть на диаграмме выше, основным компонентом генератора сигналов ШИМ является модуль таймера. Таймер синхронизируется с помощью тактового сигнала, полученного от тактовых импульсов основной системы.И он начинает отсчет с 0 каждый такт, который увеличивается на единицу.
Пока таймер ведет отсчет, его значение сравнивается двумя компараторами. Если он достигает значения регистра рабочего цикла , генерируется сигнал соответствия, который сбрасывает состояние вывода, так что оно становится LOW . Таймер будет продолжать отсчет, пока не достигнет значения регистра периода , затем другой компаратор сгенерирует сигнал соответствия, который устанавливает вывод ШИМ в состояние HIGH .Таймер возвращается к 0, процесс повторяется, и так далее!
Свойства сигнала ШИМ
Типичный сигнал ШИМ имеет следующие свойства, которыми мы можем управлять, запрограммировав регистры периферийного устройства ШИМ микроконтроллера. Такие как частота ШИМ, разрешение ШИМ и рабочий цикл ШИМ. При изменении параметра рабочего цикла ШИМ изменяется и ширина импульса. Следовательно, среднее напряжение формы волны также изменяется, и это создает своего рода управляемый аналоговый выход (не совсем точно).
Частота ШИМ равна 1 / T, где T - период каждого цикла. Вы можете установить любое значение частоты в зависимости от того, что вы пытаетесь контролировать. Мы углубимся в это в будущих уроках, а пока мы хотим уменьшить яркость светодиода. Так что для этого приложения будет достаточно частоты ШИМ 1 кГц.
Последний параметр ШИМ, Разрешение, является мерой того, сколько дискретных уровней рабочего цикла мы можем контролировать. Посмотрите на изображение в формате GIF выше, вы заметите, что рабочий цикл ШИМ увеличивается на 10% на каждом уровне.Таким образом, общее количество дискретных уровней управления рабочим циклом составляет 10 уровней. Разрешение ШИМ = log2 (Num_of_Levels) = log2 (10) = 3,3 бит.
Установка разрешения на 8 бит даст нам общий уровень рабочего цикла = 2 n , где n - разрешение (в битах). Таким образом, весь диапазон рабочего цикла имеет 2 8 = 256 уровней. Следовательно, диапазон значений рабочего цикла составляет [0 - 255]. Чем выше разрешение, тем точнее можно контролировать рабочий цикл.
ESP32 Hardware PWM
В этом разделе я расскажу вам об аппаратных возможностях периферийного устройства ESP32 LED PWM, о том, как оно работает и какие функции оно имеет.Таким образом, вы можете эффективно использовать его в зависимости от конкретных требований вашего приложения.
Контакты ШИМ ESP32
Аппаратное обеспечение ШИМ ESP32 имеет 16 различных каналов, а не контакты. Вы можете назначить любой из этих каналов любому контакту GPIO, который хотите. Но он должен иметь выходной драйвер или, другими словами, он должен работать как выходной контакт.
В наших платах разработки ESP32 все контакты GPIO могут быть настроены для работы в режиме вывода, за исключением 4 контактов. Эти контакты предназначены только для ввода, поэтому они не поддерживают функцию ШИМ.Вы можете избежать этих контактов и использовать любые другие.
См. Эту распиновку платы разработчика ESP32.
(если это не ясно, щелкните правой кнопкой мыши и откройте его в новой вкладке для увеличения)
Каналы ШИМ ESP32
Контроллер ШИМ ESP32 в первую очередь предназначен для управления яркостью светодиодов, хотя это может быть используется для генерации сигналов ШИМ и для других целей. Он имеет 16 каналов, которые могут генерировать независимые сигналы ШИМ.
ШИМ-контроллер ESP32 имеет 8 высокоскоростных каналов и 8 низкоскоростных каналов, что дает нам в общей сложности 16 каналов.Они разделены на две группы в зависимости от скорости. Для каждой группы есть 4 таймера / 8 каналов. Это означает, что каждые два канала используют один и тот же таймер. Следовательно, мы не можем независимо контролировать частоту ШИМ каждой пары каналов.
Это аппаратная схема ESP32 PWM из таблицы данных.
Это означает, что у нас есть 16 каналов, и мы можем независимо управлять их рабочим циклом ШИМ. Но частота должна быть разделена между каждой парой каналов, подключенных к одному таймеру.Если вам нужно более 8 различных сигналов ШИМ с разными частотами, вам следует подумать о поиске внешнего решения (например, IC контроллера ШИМ I2C).
Управление выходами ШИМ ESP32 (в Arduino)
Выводы ШИМ ESP32 можно использовать для управления многими устройствами, от небольших светодиодов до мощных двигателей с использованием драйверов MOSFET и тому подобного. В этом разделе я дам вам пошаговый подход к тому, что нужно делать для настройки и управления выходным контактом ШИМ.
Step1 - Выберите канал ШИМ, который вы собираетесь использовать [0–15].
Step2 - Выберите вывод GPIO для направления этого сигнала PWM Ch.
Step3 - Назначьте этот канал ШИМ выбранному выводу GPIO, используя эту функцию.
ledcAttachPin (GPIO_pin, PWM_Ch); |
Step4 - Определите необходимое разрешение ШИМ для выбранного канала [1 бит - 16 бит].Установка разрешения на 8 бит дает вам диапазон рабочего цикла [0 - 255]. При установке на 10 бит дает вам диапазон [0 - 1023]. И так далее!
Step5 - Определите требуемую частоту ШИМ для выбранного канала. Это может быть что угодно, но для нашего примера с затемнением светодиода давайте установим его на 1 кГц или (1000 Гц).
Step6 - Настройте этот канал PWM с выбранной частотой и разрешением, используя эту функцию.
ledcSetup (PWM_Ch, PWM_Freq, PWM_Res); |
Step7 - Теперь вы можете управлять этим выводом ШИМ, изменяя рабочий цикл, используя эту функцию ниже.
ledcWrite (PWM_Ch, DutyCycle); |
И все!
Все выводы ESP32 GPIO могут работать в режимах ввода или вывода. За исключением контактов (с 34 по 39), это контакты только для ввода. Вы просто не можете заставить их ВЫСОКО или НИЗКОЕ. Они используются только в режиме ввода. На нашей плате их всего 4 (GPIO34 - GPIO35 - GPIO36 - GPIO39). Они также не поддерживают функцию ШИМ. |
Компоненты для лабораторий этого учебного пособия
* Раскрытие информации для аффилированных лиц: когда вы нажимаете на ссылки в этом разделе и совершаете покупку, это может привести к тому, что этот сайт получит комиссию.Партнерские программы и аффилированные лица включают, помимо прочего, партнерскую сеть eBay (EPN) и Amazon.com, Banggood.com. Это может быть одним из способов поддержки этой бесплатной платформы при получении ваших обычных заказов на электронные компоненты, как обычно, без каких-либо дополнительных затрат для вас.