Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
products:aruno:exp7 [2020/05/27 14:16] – alexnik | products:aruno:exp7 [2020/08/28 11:46] (текущий) – alexnik |
---|
===== Эксперимент 7. Аппаратный ШИМ ===== | ===== Эксперимент 7. Регулирование яркости светодиода ===== |
| |
| Для вывода данных традиционно применяется двоичная система с применением логических значений 0 и 1. Но не всегда схемотехнику необходимо значение нуля или единицы.\\ |
| Среди цифровых пинов контроллера выделяются несколько со знаком ''~'', данные пины поддерживают сигнал ШИМ (PWM), то есть можно создать сигнал который имеет определенное напряжение и продолжительность.\\ |
| Контроллер поддерживает восьмибитную ШИМ, что позволяет выбрать переменную в диапазоне значений от 0 до 256.\\ |
| Давайте посмотрим это на практике, на примере плавного включения и выключения светодиода, подключенному к 3 пину. |
| |
| ==== Схема эксперимента ==== |
| |
| {{ :products:ardu:exp07.1.png?nolink&400 |}} |
| |
==== Схема эксперимента ==== | |
| |
{{ :products:esp-iot:hwpwmschematic.png?nolink |}} | |
//Рисунок 1. Электрическая принципиальная схема эксперимента// | //Рисунок 1. Электрическая принципиальная схема эксперимента// |
| |
{{ :products:esp-iot:hwpwm.png?direct&600 |}} | {{ :products:ardu:exp07.png?direct&600 |}} |
//Рисунок 2. Монтажная схема эксперимента// | //Рисунок 2. Монтажная схема эксперимента// |
| |
Единственным отличием этой схемы, от предыдущей, является то, что светодиод мы подключили к другому выводу микроконтроллера, к выводу 15. Дело в том, что периферийные устройства подключаются только к определенным ножкам из-за аппаратных особенностей реализации микросхемы. И на 16 выводе аппаратный ШИМ не возможен. | |
| |
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== |
| |
<file python Exp8.py[enable_line_numbers="2", start_line_numbers_at="1"]> | <file cpp Exp7[enable_line_numbers="2", start_line_numbers_at="1"]> |
from machine import Pin, PWM | //объявляем константу с номером пина для светодиода |
import time | const int Led = 3; |
_init() | |
| |
LedPin = 15 | void setup() { |
| pinMode(Led, OUTPUT); // инициализируем пин как выход |
led = Pin(LedPin, Pin.OUT) | } |
pwmLed = PWM(led) | |
pwmLed.freq(200) | void loop() { |
| // создаем цикл, где яркость (brightness) изначально равна 0, и с каждым шагом увеличивается на 1 единицу |
while True: | for (int brightness = 0; brightness < 255; brightness ++) { |
pwmLed.duty(200) | analogWrite(Led, brightness); // формируем сигнал ШИМ на пине |
time.sleep(1) | delay(5); // создаем задержку 5 миллисекунд |
pwmLed.duty(1023) | } |
time.sleep(1) | // теперь производим уменьшение значения переменной (уменьшаем яркость) |
| for (int brightness = 255; brightness >= 0; brightness --) { |
| analogWrite(Led, brightness); |
| delay(5); |
| } |
| } |
</file> | </file> |
| |
В первой строке мы указываем интерпретатору Python, что из системной библиотеки ''machine'' мы хотим импортировать не только ''Pin'', но и ''PWM'' | Как мы уже знаем, у сигнала с широтно- импульсной модуляцией есть два параметра- частота и коэффициент заполнения(скважность). Частота сигнала ШИМ в контроллере около 500 герц, а коэффициент заполнения сигнала будем задавать с помощью функции ''analogWrite(Led, brightness)'', где:\\ |
| * Led – номер вывода для генерации ШИМ сигнала. |
<code python [enable_line_numbers="2", start_line_numbers_at="1"]> | * brightness – коэффициент заполнения ШИМ. |
from machine import Pin, PWM | Для плавного изменения яркости светодиода необходимо изменять коэффициент заполнения, для этого мы будем использовать оператор цикла **for()**\\ |
</code> | |
| |
Далее мы, как обычно, создаем объект ''Pin'', настроенный как выход. Но на этом настройка не заканчивается. Мы создаем объект ''PWM'', передавая в качестве параметра только что созданный ''Pin'' | |
<code python [enable_line_numbers="2", start_line_numbers_at="7"]> | |
led = Pin(LedPin, Pin.OUT) | |
pwmLed = PWM(led) | |
</code> | |
| |
Теперь мы получили объект для управления аппаратным генератором ШИМ, подключенным к 15 выводу микроконтроллера. Теперь нужно настроить и его. Как мы уже знаем, у сигнала с широтно- импульсной модуляцией есть два параметра- частота и коэффициент заполнения или скважность. Выберем частоту достаточно большую, чтобы глаз не замечал мерцания, например, 200 герц | |
| |
<code python [enable_line_numbers="2", start_line_numbers_at="9"]> | |
pwmLed.freq(200) | |
</code> | |
| |
Настройки закончили, теперь будем управлять яркостью светодиода: | |
| |
<code python [enable_line_numbers="2", start_line_numbers_at="9"]> | |
while True: | |
pwmLed.duty(200) | |
time.sleep(1) | |
pwmLed.duty(1023) | |
time.sleep(1) | |
</code> | |
| |
В бесконечном цикле мы устанавливаем значение ШИМ равное 200, а потом 1023 с задержками по 1 секунде. В результате наш светодиод одну секунду горит тускло, потом одну секунду горит ярко. | |
| |
Осталось разобраться что это за цифры 200 и 1023, которые мы передали в качестве параметров в функцию ''duty()''. Это и есть коэффициент заполнения, только здесь он он выражен не в процентах, а числом от 0 до 1023, где 0 — это 0%, а 1023 — это 100%. | <WRAP center round info 60%> |
| Операторы цикла используется для повторения блока операторов, заключенных в фигурные скобки.\\ |
| [[http://arduino.ru/Reference/For.html|Подробнее о цикле For ]] |
| </WRAP> |
| |
Когда тебе надоест смотреть на результат работы этой программы, то, как обычно, останови ее через кнопку остановки. Программа завершится, а работа ШИМ генератора— нет, ведь он не привязан к нашей программе, это отдельное устройство, которое мы лишь настроили и запустили, но работает оно само. | В условии цикла **for** мы записали, чтобы значение нашей переменной **brightness** увеличивалась от **0** до **255**, с шагом 1, то есть выражения в теле цикла (заключенные в фигурные скобки) будут повторяться пока значение переменной не достигнет 255, после этого выполнение цикла завершиться.\\ |
| И поскольку переменная **brightness** записана в качестве аргумента функции ''analogWrite(Led, brightness)'', то с каждым шагом выполнения цикла будет увеличиваться коэффициент заполнения ШИМ, чтобы это происходило плавно в теле цикла присутствует небольшая задержка в 5 мс.\\ |
| В результате выполнения этого блока программы светодиод будет плавно набирать яркость.\\ |
| Во втором блоке с оператором **for** в условии записано уменьшение значения переменной **brightness**, и соответственно уменьшению коэффициента заполнения ШИМ в процессе выполнения цикла, в результате чего светодиод плавно гаснет.\\ |
| После завершения работы второго цикла, выполнение передается на первый и далее по кругу. |
| |
<WRAP center round tip 60%> | <WRAP center round tip 60%> |
Попробуй изменить программу так, чтобы светодиод имел не два, а 3 или более вариантов яркости, которые переключались бы по- очереди. | Попробуй изменить программу так, чтобы светодиод набирал не полную яркость либо затухал не полностью |
</WRAP> | </WRAP> |
| |