Рубрики
Схемы на Arduino

Использование широтно-импульсной модуляции (ШИМ) в Arduino Due

Arduino Due представляет собой плату ARM контроллера, спроектированную для энтузиастов в мире электроники. Архитектура ARM играет очень важную роль в современном мире электроники, контроллеры ARM используются в большом числе электронных устройств по всему миру, к примеру, в мобильных телефонах и портативных компьютерах. Столь высокая популярность архитектуры ARM обусловлена ее гибкостью и высокой производительностью.

В предыдущей статье мы рассмотрели основы работы с платой Arduino Due, а в этом проекте мы рассмотрим управление яркостью светодиода с помощью сигнала широтно-импульсной модуляции (ШИМ, в англ. PWM — Pulse Width Modulation), формируемым платой Arduino Due.

Принцип работы широтно-импульсной модуляции

Принцип ШИМ модуляции показан на следующем рисунке.

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

Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)
Duty Cycle = (0.5/ (0.5+0.5)) = 50%

То есть при коэффициенте заполнения ШИМ 50% выходное напряжение ШИМ будет составлять 50% от напряжения батареи.

Если мы будем включать/выключать выключатель каждые полсекунды, то мы будем видеть как светодиод горит каждые первые полсекунды, а потом выключается на вторые полсекунды. Если мы увеличим частоту мигания (переключения) светодиода, то человеческий глаз уже не будет замечать моменты включения/выключения светодиода – он будет выглядеть для него постоянно горящим. То есть в данном случае при коэффициенте заполнения ШИМ 50% человеческому глазу будет казаться что светодиод горит на 50% яркости. При дальнейшем уменьшении коэффициента заполнения ШИМ яркость свечения светодиода будет снижаться.

В этом проекте мы будем программировать плату Arduino Due на формирование сигнала ШИМ, с помощью которого будет происходить управление яркостью свечения светодиода.

Плата Arduino Due имеет 12 контактов (с Pin 2 по Pin 13), на которых возможно формирование сигнала ШИМ, показанных на рисунке. Мы можем использовать любой из этих контактов – в этом проекте мы используем контакт PIN2.

Необходимые компоненты

  1. Плата Arduino Due (купить на AliExpress).
  2. Светодиод.
  3. Кнопки (2 шт.).
  4. Резистор 1 кОм (2 шт.).
  5. Резистор 220 Ом.
  6. Источник питания.

Работа схемы

Схема устройства представлена на следующем рисунке.

Следует помнить о том, что для кнопок характерен эффект дребезга контактов, но в данном случае нам не стоит об нем беспокоиться – он не окажет влияния на работу схемы.

Формирование ШИМ сигнала с помощью платы Arduino Due достаточно просто – программная среда Arduino IDE обеспечивает нас для этого удобными функциями. Для более лучшего понимания этой статьи можно прочитать на нашем сайте статьи о формировании ШИМ сигнала с помощью микроконтроллера AVR и с помощью платы Arduino Uno.

Исходный код программы

По умолчанию все необходимые заголовочные файлы и регистры уже заранее сконфигурированы в Arduino IDE, нам просто нужно вызвать их чтобы сформировать ШИМ сигнал на нужном нам контакте.

pinMode(2, OUTPUT)
analogWrite(pin, value)

Сначала нам необходимо выбрать из 12 контактов платы Arduino Due, на которых возможно формирование ШИМ сигнала, нужный нам контакт. Затем этот контакт необходимо сконфигурировать в режим работы на вывод данных — pinMode(2, OUTPUT).

Далее мы формируем ШИМ сигнал на контакте PIN2 с помощью функции “analogWrite(pin, value)”. Здесь ‘pin’ обозначает номер контакта, на котором нам нужно сформировать ШИМ сигнал, в данном случае это будет контакт PIN2. “Value” в этой функции обозначает коэффициент заполнения ШИМ и может принимать значения от 0 (светодиод всегда выключен) до 255 (светодиод всегда включен). При помощи этого значения мы можем управлять яркостью свечения светодиода.

В схеме мы использовали две кнопки для того чтобы изменять значение “Value” в функции “analogWrite(pin, value)”. Одна кнопка будет инкрементировать это значение (увеличивать яркость свечения светодиода), а другая декрементировать (уменьшать яркость свечения светодиода).

volatile int brightness = 0; // инициализируем переменную целого типа для инкрементирования и декрементирования коэффициента заполнения ШИМ
void setup()
{
pinMode(2, OUTPUT); // pin 2 конфигурируем на вывод данных
pinMode(14, INPUT);
pinMode(15, INPUT);
}
// the loop routine runs over and over again forever:
void loop()
{
if(digitalRead(14)==HIGH)
{
if(brightness<255)
{
brightness++; // если кнопка, подключенная к pin14, нажата, и коэффициент заполнения ШИМ меньше 255, то увеличиваем "яркость"
}
delay(20);
}
if(digitalRead(15)==HIGH)
{
if(brightness>0)
{
brightness--; // если кнопка, подключенная к pin15, нажата, и коэффициент заполнения ШИМ больше 0, то уменьшаем "яркость"
}
delay(20);
}
analogWrite(2, brightness);
}

Видео, демонстрирующее работу схемы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *