ШИМ. Урок 9. Ардуино | ArcadePub | Яндекс Дзен

Arduino Nano для DIY проектов. Схема, описание пинов и советы как подключить плату к внешним устройствам, описание популярных шилдов

В чём проблема?

Как мы уже говорили в уроке про функции времени и про ШИМ сигнал, у микроконтроллера есть несколько таймеров, которые могут выполнять разные функции, в частности – генерировать ШИМ сигнал. Чтобы таймер генерировал ШИМ, его нужно предварительно настроить при помощи редактирования регистра таймера. Когда мы работаем в Arduino IDE, таймеры настраиваются без нашего ведома в библиотеке Arduino.h, и собственно получают настройки, которые пожелали разработчики. И вот настройки эти не очень хорошие: частота ШИМ по умолчанию низкая, возможности таймеров не используются в полной мере. Посмотрим на стандартный ШИМ у ATmega328 (Arduino UNO/Nano/Pro Mini):

Таймер Пины Частота Разрешение
Timer 0 D5 и D6 976 Гц 8 бит (0-255)
Timer 1 D9 и D10 488 Гц 8 бит (0-255)
Timer 2 D3 и D11 488 Гц 8 бит (0-255)

На самом деле все таймеры спокойно могут выдавать 64 кГц ШИМ сигнал, а таймер 1 – он вообще 16 битный, и на той частоте, которую ему дали Arduino, мог бы работать с разрешением 15 бит вместо 8, а это, на минуточку, 32768 градаций заполнения вместо 256!!! Так к чему такая несправедливость? Таймер 0 занимается отсчётом времени, и настроен так, чтобы миллисекунды тикали точно. А остальные таймеры просто причёсаны к нулевому под одну гребёнку, чтобы у ардуинщика не возникло лишних проблем. Такой подход в целом можно понять, но сделали бы хоть пару стандартных функций для более высокой частоты, ну серьёзно! Ладно, если они не сделали, то сделаем мы.

Расшифровка и определение ШИМ

Модуляция ширины импульса означает, что ширина импульса возникает строго в прямоугольной волне.

Это улучшает управление двигателем. Вместо чистого сигнала постоянного тока к двигателю используется серия импульсов. Они могут находиться на максимальном напряжении, но только на долю секунды. Выполнение повторных действий приведет к тому, что двигатель начнет вращаться. Это позволит более комфортно управлять скоростью. Простое применение сигнала постоянного тока не приведет к преодолению трения двигателя и передач, наоборот, запуск будет обрывистый с низкой скоростью.

Увеличивая частоту импульсов ШИМа на Ардуино, можно выполнять операции на высокой скорости.

Декодер создает этот сигнал для управления двигателем. Это та же концепция, что и функции мощности импульса, находящиеся на блоках питания постоянного тока.

Рассмотрим основные преимущества использования ШИМ Ардуино:

  1. Эффективность электропитания: индукция обмоток ротора будет усреднять ток (индукторы сопротивляются изменению тока). Транзисторы имеют низкий импеданс при низком падении напряжения и рассеивании мощности. Резистор рассеивает большую мощность (I2R) в виде тепла.
  2. Управление скоростью: двигатель будет видеть источник с низким импедансом, даже если он постоянно переключается между высоким и низким напряжением. Результат очевиден – двигатель ускоряется. Серийное сопротивление приведет к тому, что двигатель будет испытывать малое напряжение, поэтому легко остановится в нужный момент.
  3. Цепь управления: для цифровой электроники (например, микроконтроллера ) очень легко включать или выключать напряжение с помощью транзисторов. Аналоговый выход (с электронным или механическим управлением) требует большего количества компонентов и увеличивает рассеивание мощности. Это будет более дорогостоящим вариантом, с точки зрения электроники и требований к электропитанию.

Создать широтно-импульсный модулятор можно на esp8266 шим, на Ардуино УНО и Ардуино Нано шим. То есть для конструирования подойдет любая модель описываемого микроконтроллера.

Элементы платы

Микроконтроллер ATmega328P

Сердцем платформы Arduino Nano является 8-битный микроконтроллер семейства AVR — ATmega328P с тактовой частотой 16 МГц. Контроллер предоставляет 32 КБ Flash-памяти для хранения прошивки, 2 КБ оперативной памяти SRAM и 1 КБ энергонезависимой памяти EEPROM для хранения данных.

Микросхема FT232R

Микросхема FTDI FT232R обеспечивает связь микроконтроллера ATmega328P с USB-портом компьютера. При подключении к ПК Arduino Nano определяется как виртуальный COM-порт.

USB-UART преобразователь общается с микроконтроллером ATmega328P по интерфейсу UART через пины 0(RX) и 1(TX). Рекомендуем не использовать эти контакты в своём проекте.

Светодиодная индикация

Имя светодиода Назначение
RX и TX Мигают при обмене данными между Arduino Nano и ПК.
L Пользовательский светодиод подключённый к 13 пину микроконтроллера. При высоком уровне светодиод включается, при низком – выключается.
ON Наличие питания на Arduino Nano.

Разъём Mini-USB

Разъём Mini-USB предназначен для прошивки платформы Arduino Nano с помощью компьютера.

Регулятор напряжения 5 В

Линейный понижающий регулятор напряжения LM1117MPX-5.0 с выходом 5 вольт обеспечивает питание микроконтроллера ATmega328P и другой логики платформы. Максимальный выходной ток составляет 800 мА.

ICSP-разъём для ATmega328

ICSP-разъём предназначен для загрузки прошивки в микроконтроллер ATmega328 через программатор.

Через контакты ICSP Arduino Nano общается с платами расширения по интерфейсу SPI.

Формирование аналогового сигнала

AnalogRead – это функция, которая используется для считывания аналоговых значений из аналоговых контактов ШИМа на Ардуино. Плата Arduino UNO имеет 6-канальный 10-битный аналого-цифровой преобразователь (АЦП). Это означает, что АЦП в Arduino UNO будет отображать входные напряжения от 0 до 5 В в целое значение от 0 до 1023.

Следовательно, функция analogRead возвращает любое значение от 0 до 1023. Синтаксис функции analogRead – analogRead (аналоговый вывод no).

Поскольку мы считываем аналоговые напряжения от потенциометра на выводе A0, нам нужно написать analogRead (A0) в эскизе. Когда он возвращает целочисленное значение, с ним создается временная переменная целочисленного типа данных. Следующая функция – analogWrite. Это функция, которая используется для установки рабочего цикла сигнала ШИМ для любого заданного штыря ШИМ.

Синтаксис функции analogWrite – analogWrite (вывод PWM no, value).

Значение указывает рабочий цикл и должно быть значением от 0 (0 В) до 255 (5 В).

Перейдем к фактическому эскизу схемы управления яркостью светодиода. Окончательный эскиз показан на следующем рисунке.

Из приведенного выше эскиза мы можем легко понять, что значение, возвращаемое функцией analogRead, сохраняется в переменной temp. Это значение будет использоваться для управления рабочим циклом сигнала ШИМ с помощью функции analogWrite.

Но диапазон значений, принимаемых функцией analogWrite, находится в диапазоне от 0 до 255. Следовательно, нам нужно выполнить некоторые математические вычисления, чтобы поместить подходящее значение в функцию analogWrite.

Наконец, вычисленное значение помещается в функцию analogWrite вместе с выводом PWM для получения сигнала PWM.

Когда схема построена, и эскиз загружен в Arduino, мы видим, что, изменяя положение потенциометра, яркость светодиода мы также можем изменить.

Еще  один вариант скетча для Ардуино:

int ledPin = 3; // объявляем пин, управляющий светодиодомint brightness = 0; // переменная для задания яркостиint fadeAmount = 5; // шаг изменения яркостиvoid setup() { pinMode(ledPin, OUTPUT);}void loop() { analogWrite(ledPin, brightness); // устанавливаем яркость brightness на выводе ledPin brightness += fadeAmount; // изменяем значение яркости /* при достижении границ 0 или 255 меняем направление изменения яркости */ if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount; // изменяем знак шага } delay(30); // задержка для большей видимости эффекта}

Где купить Arduino Nano

Традиционно самые низкие цены предлагают зарубежные интернет-магазины. В России цены почти всегда будут выше на 20-200 процентов, но не придется ждать заказа около месяца.

Приведем ссылки на надежных поставщиков Aliexpress:

Настройка частоты ШИМ через регистры

Как мы обсуждали в предыдущем уроке, микроконтроллер настраивается на низком уровне через регистры, так вот генерация ШИМ настраивается через регистры таймеров. Далее вы найдёте несколько готовых “кусков” кода, которые достаточно вставить в setup(), и частота ШИМ будет перенастроена (меняется предделитель и режим работы таймера). Работать с ШИМ сигналом можно будет всё так же при помощи функции analogWrite(), управляя заполнением ШИМ на стандартных пинах.

Меняем частоту ШИМ на ATmega328 (Arduino UNO/Nano/Pro Mini)

// Пины D5 и D6 – 62.5 кГцTCCR0B = 0b00000001; // x1TCCR0A = 0b00000011; // fast pwm// Пины D5 и D6 – 31.4 кГцTCCR0B = 0b00000001; // x1TCCR0A = 0b00000001; // phase correct// Пины D5 и D6 – 7.8 кГцTCCR0B = 0b00000010; // x8TCCR0A = 0b00000011; // fast pwm// Пины D5 и D6 – 4 кГцTCCR0B = 0b00000010; // x8TCCR0A = 0b00000001; // phase correct// Пины D5 и D6 – 976 Гц – по умолчаниюTCCR0B = 0b00000011; // x64TCCR0A = 0b00000011; // fast pwm// Пины D5 и D6 – 490 ГцTCCR0B = 0b00000011; // x64TCCR0A = 0b00000001; // phase correct// Пины D5 и D6 – 244 ГцTCCR0B = 0b00000100; // x256TCCR0A = 0b00000011; // fast pwm// Пины D5 и D6 – 122 ГцTCCR0B = 0b00000100; // x256TCCR0A = 0b00000001; // phase correct// Пины D5 и D6 – 61 ГцTCCR0B = 0b00000101; // x1024TCCR0A = 0b00000011; // fast pwm// Пины D5 и D6 – 30 ГцTCCR0B = 0b00000101; // x1024TCCR0A = 0b00000001; // phase correct
// Пины D9 и D10 – 62.5 кГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00001001; // x1 fast pwm// Пины D9 и D10 – 31.4 кГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00000001; // x1 phase correct// Пины D9 и D10 – 7.8 кГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00001010; // x8 fast pwm// Пины D9 и D10 – 4 кГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00000010; // x8 phase correct// Пины D9 и D10 – 976 ГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00001011; // x64 fast pwm// Пины D9 и D10 – 490 Гц – по умолчаниюTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00000011; // x64 phase correct// Пины D9 и D10 – 244 ГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00001100; // x256 fast pwm// Пины D9 и D10 – 122 ГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00000100; // x256 phase correct// Пины D9 и D10 – 61 ГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00001101; // x1024 fast pwm// Пины D9 и D10 – 30 ГцTCCR1A = 0b00000001; // 8bitTCCR1B = 0b00000101; // x1024 phase correct
// Пины D9 и D10 – 15.6 кГц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00001001; // x1 fast pwm// Пины D9 и D10 – 7.8 кГц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00000001; // x1 phase correct// Пины D9 и D10 – 2 кГц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00001010; // x8 fast pwm// Пины D9 и D10 – 977 Гц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00000010; // x8 phase correct// Пины D9 и D10 – 244 Гц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00001011; // x64 fast pwm// Пины D9 и D10 – 122 Гц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00000011; // x64 phase correct// Пины D9 и D10 – 61 Гц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00001100; // x256 fast pwm// Пины D9 и D10 – 30 Гц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00000100; // x256 phase correct// Пины D9 и D10 – 15 Гц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00001101; // x1024 fast pwm// Пины D9 и D10 – 7.5 Гц 10bitTCCR1A = 0b00000011; // 10bitTCCR1B = 0b00000101; // x1024 phase correct
// Пины D3 и D11 – 62.5 кГцTCCR2B = 0b00000001; // x1TCCR2A = 0b00000011; // fast pwm// Пины D3 и D11 – 31.4 кГцTCCR2B = 0b00000001; // x1TCCR2A = 0b00000001; // phase correct// Пины D3 и D11 – 8 кГцTCCR2B = 0b00000010; // x8TCCR2A = 0b00000011; // fast pwm// Пины D3 и D11 – 4 кГцTCCR2B = 0b00000010; // x8TCCR2A = 0b00000001; // phase correct// Пины D3 и D11 – 2 кГцTCCR2B = 0b00000011; // x32TCCR2A = 0b00000011; // fast pwm// Пины D3 и D11 – 980 ГцTCCR2B = 0b00000011; // x32TCCR2A = 0b00000001; // phase correct// Пины D3 и D11 – 980 ГцTCCR2B = 0b00000100; // x64TCCR2A = 0b00000011; // fast pwm// Пины D3 и D11 – 490 Гц – по умолчаниюTCCR2B = 0b00000100; // x64TCCR2A = 0b00000001; // phase correct// Пины D3 и D11 – 490 ГцTCCR2B = 0b00000101; // x128TCCR2A = 0b00000011; // fast pwm// Пины D3 и D11 – 245 ГцTCCR2B = 0b00000101; // x128TCCR2A = 0b00000001; // phase correct// Пины D3 и D11 – 245 ГцTCCR2B = 0b00000110; // x256TCCR2A = 0b00000011; // fast pwm// Пины D3 и D11 – 122 ГцTCCR2B = 0b00000110; // x256TCCR2A = 0b00000001; // phase correct// Пины D3 и D11 – 60 ГцTCCR2B = 0b00000111; // x1024TCCR2A = 0b00000011; // fast pwm// Пины D3 и D11 – 30 ГцTCCR2B = 0b00000111; // x1024TCCR2A = 0b00000001; // phase correct
void setup() { // Пины D5 и D6 – 7.8 кГц TCCR0B = 0b00000010; // x8 TCCR0A = 0b00000011; // fast pwm // Пины D3 и D11 – 62.5 кГц TCCR2B = 0b00000001; // x1 TCCR2A = 0b00000011; // fast pwm // Пины D9 и D10 – 7.8 кГц 10bit TCCR1A = 0b00000011; // 10bit TCCR1B = 0b00000001; // x1 phase correct analogWrite(3, 15); analogWrite(5, 167); analogWrite(6, 241); analogWrite(9, 745); // да, диапазон 0-1023 analogWrite(10, 345); // да, диапазон 0-1023 analogWrite(11, 78);}void loop() {}

Важно! При изменении частоты на пинах D5 и D6 вы потеряете функции времени (millis(), delay(), pulseIn(), setTimeout() и прочие), они будут работать некорректно. Также перестанут работать библиотеки, которые их используют!

Если очень хочется

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

#define micros() (micros() >> CORRECT_CLOCK)#define millis() (millis() >> CORRECT_CLOCK)void fixDelay(uint32_t ms) { delay(ms << CORRECT_CLOCK);}

Дефайны нужно размещать перед подключением библиотек, чтобы они залезли в код и подменили функции. Единственное, скорректировать delay внутри другой библиотеки таким образом не получится, для себя можно использовать fixDelay() как написано выше.

Самое главное – CORRECT_CLOCK. Это целое число, равное отношению делителя таймера по умолчанию и нового установленного (для разгона ШИМ). Например ставим ШИМ 8 кГц. Из списка выше видим, что по умолчанию делитель 64, а 7.8 кГц будет 8, то есть в 8 раз меньше. CORRECT_CLOCK ставим соответствующий.

#define CORRECT_CLOCK 8void fixDelay(uint32_t ms) { delay(ms << CORRECT_CLOCK);}void setup() { pinMode(13, 1); // Пины D5 и D6 – 4 кГц TCCR0B = 0b00000010; // x8 TCCR0A = 0b00000001; // phase correct}void loop() { digitalWrite(13, !digitalRead(13)); fixDelay(1000);}

Распиновка

Пины питания

  • VIN: Входной пин для подключения внешнего источника питания с напряжением в диапазоне от 7 до 12 вольт.

  • 5V: Выходной пин от регулятора напряжения на плате с выходом 5 вольт и максимальных током 800 мА. Питать устройство через вывод 5V не рекомендуется — вы рискуете спалить плату.

  • 3.3V: Выходной пин от стабилизатора микросхемы FT232R с выходом 3,3 вольта и максимальных током 50 мА. Питать устройство через вывод 3V3 не рекомендуется — вы рискуете спалить плату.

  • GND: Выводы земли.

  • AREF:

    Пин для подключения внешнего опорного напряжения АЦП относительно которого происходят аналоговые измерения при использовании функции

    analogReference()

    с параметром «EXTERNAL».

Порты ввода/вывода

  • Цифровые входы/выходы: пины 0–13
    Логический уровень единицы — 5 В, нуля — 0 В. Максимальный ток выхода — 40 мА. К контактам подключены подтягивающие резисторы, которые по умолчанию выключены, но могут быть включены программно.

  • ШИМ: пины 3,5,6,9,10 и 11
    Позволяет выводить аналоговые значения в виде ШИМ-сигнала. Разрядность ШИМ не меняется и установлена в 8 бит.

  • АЦП: пины A0–A7
    Позволяет представить аналоговое напряжение в цифровом виде. Разрядность АЦП не меняется и установлена в 10 бит. Диапазон входного напряжения от 0 до 5 В. При подаче большего напряжения — вы убьёте микроконтроллер.

  • TWI/I²C:

    пины

    A4(SDA)

    и

    A5(SCL)

    Для общения с периферией по интерфейсу I²C. Для работы используйте библиотеку

    Wire

    .

  • SPI:

    пины

    11(MOSI)

    ,

    12(MISO)

    ,

    13(SCK)

    и

    10(SS)

    Для общения с периферией по интерфейсу SPI. Для работы — используйте библиотеку

    SPI

    .

  • UART:

    пины

    0(RX)

    и

    1(TX)

    Используется для коммуникации платы Arduino с компьютером или другими устройствами по последовательному интерфейсу. Выводы

    0(RX)

    и

    1(TX)

    соединены с соответствующими USB-UART преобразователя

    FT232R

    . Для работы с последовательным интерфейсом — используйте методы библиотеки

    Serial

    .

Широтно-импульсные модуляторы в Ардуино

Чтобы использовать частотный ШИМ на Arduino Uno, нужно всего лишь установить один из ШИМ-выводов в качестве выхода, затем вызывать команду analogWrite и установить уровень. Частота установлена ​​примерно на 500 Гц, поэтому не нужно беспокоиться об этой части.

Мы выбираем контакт под номером 3, устанавливаем его, как output, и analogWrite значение для него. При выборе выхода у нас есть 256 уровней на выбор. Уровень рабочего цикла можно установить между номерами 0 и 255, где 0 – рабочий цикл 0 %, а 255 – 100 % рабочего цикла.

Последний вывод микроконтроллера на плате Arduino Uno составляет 5 В. Чтобы установить светодиод, который мы выбрали для полной яркости, нам необходимо подать напряжение 3,3 В и 15 мА тока. Для этого мы понижаем напряжение на резисторе 100 Ом.

Физические характеристики

Arduino Nano имеет следующие размеры: длина 42 мм и ширина 19 мм. Однако разъем USB немного выпирает за пределы печатной платы. Arduino Nano весит всего около 12 грамм. Плата имеет 4 отверстия для возможности ее закрепления на поверхности. Расстояние между выводами равняется 2,54 мм.

Важные страницы

  • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
  • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
  • Полная документация по языку Ардуино, все встроенные функции и макро, все доступные типы данных
  • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
  • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
  • Поддержать автора за работу над уроками
  • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту (alex@alexgyver.ru)

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

(1 голосов, оценка: 5,00 из 5)

loading.gif

Загрузка…

448 просмотров

Связь с устройствами

Связь с устройствами в Arduino Nano осуществляется через:

  • SPI-интерфейс;
  • UART-интерфейс;
  • TWI-интерфейс (I2C-аналог от Atmel с линиями SCL и SDA).

Также пины микроконтроллера выведены на края платы, из-за чего к ним удобно подключать устройства с помощью проводов или контактных разъемов.

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...