Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:aruno:exp7 [2020/05/27 14:16] alexnikproducts:aruno:exp7 [2020/08/28 11:46] (текущий) alexnik
Строка 1: Строка 1:
-===== Эксперимент 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(LedPinPin.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 с задержками по секунде. В результате наш светодиод одну секунду горит тусклопотом одну секунду горит ярко.+
  
-Осталось разобраться что это за цифры 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>