MicroPython:Платы/ESP8266/Руководство по MicroPython для ESP8266/Широтно-импульсная модуляция: различия между версиями
Myagkij (обсуждение | вклад) |
Нет описания правки |
||
Строка 11: | Строка 11: | ||
Чтобы воспользоваться [[ШИМ]] на контакте, надо сначала создать объект контакта. Например: | Чтобы воспользоваться [[ШИМ]] на контакте, надо сначала создать объект контакта. Например: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> import machine | >>> import machine | ||
>>> p12 = machine.Pin(12) | >>> p12 = machine.Pin(12) | ||
Строка 18: | Строка 18: | ||
Затем создайте объект [[ШИМ]] при помощи: | Затем создайте объект [[ШИМ]] при помощи: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> pwm12 = machine.PWM(p12) | >>> pwm12 = machine.PWM(p12) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 24: | Строка 24: | ||
Далее можно задать частоту и коэффициент заполнения: | Далее можно задать частоту и коэффициент заполнения: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> pwm12.freq(500) | >>> pwm12.freq(500) | ||
>>> pwm12.duty(512) | >>> pwm12.duty(512) | ||
Строка 31: | Строка 31: | ||
Значение коэффициента заполнения варьируется между ''«0»'' (все время ''«0»'') и ''«1023»'' (все время ''«1»''), т.е. значение ''«512»'' будет означать коэффициент заполнения ''50%''. Значения за пределами этих минимума/максимума будут обрезаны. Чтобы узнать текущую конфигурацию [[ШИМ]], распечатайте ШИМ-объект: | Значение коэффициента заполнения варьируется между ''«0»'' (все время ''«0»'') и ''«1023»'' (все время ''«1»''), т.е. значение ''«512»'' будет означать коэффициент заполнения ''50%''. Значения за пределами этих минимума/максимума будут обрезаны. Чтобы узнать текущую конфигурацию [[ШИМ]], распечатайте ШИМ-объект: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> pwm12 | >>> pwm12 | ||
PWM(12, freq=500, duty=512) | PWM(12, freq=500, duty=512) | ||
Строка 40: | Строка 40: | ||
Контакт продолжит работать в ШИМ-режиме, пока вы не деинициализируете его: | Контакт продолжит работать в ШИМ-режиме, пока вы не деинициализируете его: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> pwm12.deinit() | >>> pwm12.deinit() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 48: | Строка 48: | ||
Теперь давайте при помощи [[ШИМ]] выполним плавное изменение яркости светодиода. Если на вашей плате есть светодиод, подключенный ко 2 контакту (как у модулей [[ESP-12]]), вы можете создать ШИМ-объект для управления этим светодиодом при помощи: | Теперь давайте при помощи [[ШИМ]] выполним плавное изменение яркости светодиода. Если на вашей плате есть светодиод, подключенный ко 2 контакту (как у модулей [[ESP-12]]), вы можете создать ШИМ-объект для управления этим светодиодом при помощи: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> led = machine.PWM(machine.Pin(2), freq=1000) | >>> led = machine.PWM(machine.Pin(2), freq=1000) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 56: | Строка 56: | ||
Дальше нам понадобятся расчет времени и некоторые математические вычисления, так что импортируем модули time и math: | Дальше нам понадобятся расчет времени и некоторые математические вычисления, так что импортируем модули time и math: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> import time, math | >>> import time, math | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 62: | Строка 62: | ||
Затем создаем функцию, которая заставит светодиод пульсировать: | Затем создаем функцию, которая заставит светодиод пульсировать: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> def pulse(l, t): | >>> def pulse(l, t): | ||
... for i in range(20): | ... for i in range(20): | ||
Строка 71: | Строка 71: | ||
Теперь можем попробовать эту функцию: | Теперь можем попробовать эту функцию: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> pulse(led, 50) | >>> pulse(led, 50) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 77: | Строка 77: | ||
Также можно создать красивый эффект повторяющейся пульсации: | Также можно создать красивый эффект повторяющейся пульсации: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> for i in range(10): | >>> for i in range(10): | ||
... pulse(led, 20) | ... pulse(led, 20) | ||
Строка 88: | Строка 88: | ||
При помощи [[ШИМ]] также можно управлять [[сервомотор]]ами. Им нужна частота в 50 Гц и коэффициент заполнения ''между 40 и 115'' (где ''77'' будет центральным значением). Если подключить [[сервомотор]] к питанию и заземлению, а затем подсоединить сигнальную линию к ''12 контакту'' (но подойдут и другие контакты), вы сможете управлять этим мотором при помощи: | При помощи [[ШИМ]] также можно управлять [[сервомотор]]ами. Им нужна частота в 50 Гц и коэффициент заполнения ''между 40 и 115'' (где ''77'' будет центральным значением). Если подключить [[сервомотор]] к питанию и заземлению, а затем подсоединить сигнальную линию к ''12 контакту'' (но подойдут и другие контакты), вы сможете управлять этим мотором при помощи: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
>>> servo = machine.PWM(machine.Pin(12), freq=50) | >>> servo = machine.PWM(machine.Pin(12), freq=50) | ||
>>> servo.duty(40) | >>> servo.duty(40) |
Текущая версия от 20:05, 23 мая 2023
Широтно-импульсная модуляция[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)