MicroPython:Платы/ESP8266/Руководство по MicroPython для ESP8266/Широтно-импульсная модуляция: различия между версиями

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

(Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} <syntaxhighlight lang="python" enclose="div"> =С...»)
 
 
Строка 2: Строка 2:
 
{{Перевод от Сubewriter}}
 
{{Перевод от Сubewriter}}
 
{{Myagkij-редактор}}
 
{{Myagkij-редактор}}
 +
 +
=Широтно-импульсная модуляция<ref>[http://docs.micropython.org/en/latest/esp8266/tutorial/pwm.html docs.micropython.org - Pulse Width Modulation]</ref>=
 +
 +
[[Широтно-импульсная модуляция]] ([[ШИМ]]) – это способ искусственного имитирования аналоговых данных на цифровом контакте. Это достигается быстрым переключением состояния контакта между значениями ''«0»'' и ''«1»''. С [[ШИМ]] связаны два параметра: частота переключения и коэффициент заполнения. Коэффициент заполнения – это то, как долго контакт находится в состоянии ''«1»'' по сравнению с тем, как долго он находится в состоянии ''«0»'' в течение одного периода времени (время в состоянии ''«0»'' + время в состоянии ''«1»''). Максимальный коэффициент заполнения – это когда контакт все время находится в состоянии ''«1»'', а минимальный – когда он все время находится в состоянии ''«0»''.
 +
 +
На [[ESP8266]] широтно-импульсную модуляцию поддерживают контакты ''0, 2, 4, 5, 12, 13, 14 и 15''. Но есть ограничение – они все должны работать на одной частоте ''в диапазоне между 1 Гц и 1 КГц''.
 +
 +
Чтобы воспользоваться [[ШИМ]] на контакте, надо сначала создать объект контакта. Например:
  
 
<syntaxhighlight lang="python" enclose="div">
 
<syntaxhighlight lang="python" enclose="div">
 +
>>> import machine
 +
>>> p12 = machine.Pin(12)
 +
</syntaxhighlight>
 +
 +
Затем создайте объект [[ШИМ]] при помощи:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> pwm12 = machine.PWM(p12)
 +
</syntaxhighlight>
 +
 +
Далее можно задать частоту и коэффициент заполнения:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> pwm12.freq(500)
 +
>>> pwm12.duty(512)
 +
</syntaxhighlight>
 +
 +
Значение коэффициента заполнения варьируется между ''«0»'' (все время ''«0»'') и ''«1023»'' (все время ''«1»''), т.е. значение ''«512»'' будет означать коэффициент заполнения ''50%''. Значения за пределами этих минимума/максимума будут обрезаны. Чтобы узнать текущую конфигурацию [[ШИМ]], распечатайте ШИМ-объект:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> pwm12
 +
PWM(12, freq=500, duty=512)
 +
</syntaxhighlight>
 +
 +
Чтобы узнать текущие значения частоты и коэффициента заполнения отдельно друг от друга, используйте методы freq() и duty() без аргументов.
 +
 +
Контакт продолжит работать в ШИМ-режиме, пока вы не деинициализируете его:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> pwm12.deinit()
 +
</syntaxhighlight>
 +
 +
==Плавное изменение ШИМ==
 +
 +
Теперь давайте при помощи [[ШИМ]] выполним плавное изменение яркости светодиода. Если на вашей плате есть светодиод, подключенный ко 2 контакту (как у модулей [[ESP-12]]), вы можете создать ШИМ-объект для управления этим светодиодом при помощи:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> led = machine.PWM(machine.Pin(2), freq=1000)
 +
</syntaxhighlight>
 +
 +
Обратите внимание, что в конструкторе ШИМ-объекта можно задать частоту [[ШИМ]].
 +
 +
Дальше нам понадобятся расчет времени и некоторые математические вычисления, так что импортируем модули time и math:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> import time, math
 +
</syntaxhighlight>
 +
 +
Затем создаем функцию, которая заставит светодиод пульсировать:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> def pulse(l, t):
 +
...    for i in range(20):
 +
...        l.duty(int(math.sin(i / 10 * math.pi) * 500 + 500))
 +
...        time.sleep_ms(t)
 +
</syntaxhighlight>
 +
 +
Теперь можем попробовать эту функцию:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> pulse(led, 50)
 +
</syntaxhighlight>
 +
 +
Также можно создать красивый эффект повторяющейся пульсации:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> for i in range(10):
 +
...    pulse(led, 20)
 +
</syntaxhighlight>
 +
 +
Помните, что вы можете прервать работу этого (и любого другого) кода с помощью {{клавиша|Ctrl}}+{{клавиша|C}}.
 +
 +
==Управление сервомотором==
 +
 +
При помощи [[ШИМ]] также можно управлять [[сервомотор]]ами. Им нужна частота в 50 Гц и коэффициент заполнения ''между 40 и 115'' (где ''77'' будет центральным значением). Если подключить [[сервомотор]] к питанию и заземлению, а затем подсоединить сигнальную линию к ''12 контакту'' (но подойдут и другие контакты), вы сможете управлять этим мотором при помощи:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> servo = machine.PWM(machine.Pin(12), freq=50)
 +
>>> servo.duty(40)
 +
>>> servo.duty(115)
 +
>>> servo.duty(77)
 +
</syntaxhighlight>
  
 
=См.также=
 
=См.также=

Текущая версия на 12:30, 1 июля 2020

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Широтно-импульсная модуляция[1]

Широтно-импульсная модуляция (ШИМ) – это способ искусственного имитирования аналоговых данных на цифровом контакте. Это достигается быстрым переключением состояния контакта между значениями «0» и «1». С ШИМ связаны два параметра: частота переключения и коэффициент заполнения. Коэффициент заполнения – это то, как долго контакт находится в состоянии «1» по сравнению с тем, как долго он находится в состоянии «0» в течение одного периода времени (время в состоянии «0» + время в состоянии «1»). Максимальный коэффициент заполнения – это когда контакт все время находится в состоянии «1», а минимальный – когда он все время находится в состоянии «0».

На ESP8266 широтно-импульсную модуляцию поддерживают контакты 0, 2, 4, 5, 12, 13, 14 и 15. Но есть ограничение – они все должны работать на одной частоте в диапазоне между 1 Гц и 1 КГц.

Чтобы воспользоваться ШИМ на контакте, надо сначала создать объект контакта. Например:

>>> import machine
>>> p12 = machine.Pin(12)

Затем создайте объект ШИМ при помощи:

>>> pwm12 = machine.PWM(p12)

Далее можно задать частоту и коэффициент заполнения:

>>> pwm12.freq(500)
>>> pwm12.duty(512)

Значение коэффициента заполнения варьируется между «0» (все время «0») и «1023» (все время «1»), т.е. значение «512» будет означать коэффициент заполнения 50%. Значения за пределами этих минимума/максимума будут обрезаны. Чтобы узнать текущую конфигурацию ШИМ, распечатайте ШИМ-объект:

>>> pwm12
PWM(12, freq=500, duty=512)

Чтобы узнать текущие значения частоты и коэффициента заполнения отдельно друг от друга, используйте методы freq() и duty() без аргументов.

Контакт продолжит работать в ШИМ-режиме, пока вы не деинициализируете его:

>>> pwm12.deinit()

Плавное изменение ШИМ

Теперь давайте при помощи ШИМ выполним плавное изменение яркости светодиода. Если на вашей плате есть светодиод, подключенный ко 2 контакту (как у модулей ESP-12), вы можете создать ШИМ-объект для управления этим светодиодом при помощи:

>>> led = machine.PWM(machine.Pin(2), freq=1000)

Обратите внимание, что в конструкторе ШИМ-объекта можно задать частоту ШИМ.

Дальше нам понадобятся расчет времени и некоторые математические вычисления, так что импортируем модули time и math:

>>> import time, math

Затем создаем функцию, которая заставит светодиод пульсировать:

>>> def pulse(l, t):
...     for i in range(20):
...         l.duty(int(math.sin(i / 10 * math.pi) * 500 + 500))
...         time.sleep_ms(t)

Теперь можем попробовать эту функцию:

>>> pulse(led, 50)

Также можно создать красивый эффект повторяющейся пульсации:

>>> for i in range(10):
...     pulse(led, 20)

Помните, что вы можете прервать работу этого (и любого другого) кода с помощью  Ctrl + C .

Управление сервомотором

При помощи ШИМ также можно управлять сервомоторами. Им нужна частота в 50 Гц и коэффициент заполнения между 40 и 115 (где 77 будет центральным значением). Если подключить сервомотор к питанию и заземлению, а затем подсоединить сигнальную линию к 12 контакту (но подойдут и другие контакты), вы сможете управлять этим мотором при помощи:

>>> servo = machine.PWM(machine.Pin(12), freq=50)
>>> servo.duty(40)
>>> servo.duty(115)
>>> servo.duty(77)

См.также

Внешние ссылки