Arduino регулировка напряжения на выходе

Аналоговые входы Arduino

В прошлом уроке мы разобрали измерение и вывод цифрового сигнала с микроконтроллера, а в этом разберём аналоговый сигнал. Как мы уже не раз говорили ранее, у микроконтроллера есть аналоговые входы, т.е. входы, подключенные к АЦП – аналогово-цифровому преобразователю (ADC). На платах Ардуино это пины, маркированные буквой А. Я не просто так написал название в кавычках, потому что не все пины являются только аналоговыми: например на плате Nano пины A0-A5 являются также обычными цифровыми, и у них есть возможность измерять аналоговый сигнал как доп. функция. Пины A6 и A7 являются чисто аналоговыми.

Зачем нужно читать аналоговый сигнал? Микроконтроллер может выступать в роли вольтметра, измерять собственное напряжение питания, например от аккумулятора, может измерять ток через шунт (если вы знаете закон Ома), можно измерять сопротивление, а также работать с потенциометрами (крутильными, линейными, джойстиками), которые являются очень удобными органами управления.

Чтение сигнала

Вот пример, опрашивающий пин А0.

Хранить полученное значение разумно в переменной типа int, потому что значение варьируется от 0 до 1023.

Потенциометры

Аналоговые пины и АЦП в целом очень часто используются при работе с потенциометрами (он же переменный резистор или реостат). 10 бит АЦП позволяют дать возможность задавать в программу значения от 0 до 1023 (или кратные им), то есть влиять на ход работы программы, менять какие-то настройки и тому подобное. У потенциометра всегда три ноги: две крайние и одна центральная. Всё вместе это представляет собой делитель напряжения, который и позволяет менять напряжение в диапазоне 0-VCC:

К Arduino потенциометр подключается вот так, средний вывод на любые A-пины, крайние – на GND и питание. От порядка подключения GND и питания зависит направление изменения значения. Что касается сопротивления, то читай заметку по делителям напряжения ниже в этом уроке. Чаще всего для микроконтроллеров ставят потенциометры с сопротивлением 10 кОм, но диапазон в принципе очень широк: от 1 кОм до 100 кОм. Чем больше, тем более шумным будет приходить сигнал, а если брать меньше – пойдут потери тока в нагрев потенциометра, а это никому не нужно.

Опорное напряжение

После изменения источника опорного напряжения (вызова analogReference() ) первые несколько измерений могут быть нестабильными (сильно шумными).

Значение 1023 функции analogRead() будет соответствовать выбранному опорному напряжению или напряжению выше его, но не выше 5.5V, что спалит плату. То есть при режиме DEFAULT мы можем оцифровать напряжение от 0 до напряжения питания. Если напряжение питания 4.5 Вольта, и мы подаём 4.5 Вольт – получим оцифрованное значение 1023. Если подаём 5 Вольт – опять же получим 1023, т.к. выше опорного. Это правило работает и дальше, главное не превышать 5.5 Вольт. Как измерять более высокое напряжение (12 Вольт например) я расскажу в отдельном уроке.

Что касается точности: при питании от 5V и режиме DEFAULT мы получим точность измерения напряжения (5 / 1024)

4.9 милливольт. Поставив INTERNAL мы можем измерять напряжение от 0V до 1.1V с точностью (1.1 / 1024)

0.98 милливольт. Весьма неплохо, особенно если баловаться с делителем напряжения.

5 кОм, но так как вход AREF имеет собственное сопротивление в 32 кОм, реальное опорное будет например 2.5 * 32 / (32 + 5) =

Читайте также:  Регулировка кулачкового зажигания ява 350

Измерение напряжения

0-5 Вольт

Простой пример, как измерить напряжение на аналоговом пине и перевести его в Вольты. Плата питается от 5V.

Таким образом переменная voltage получает значение в Вольтах, от 0 до 5. Чуть позже мы поговорим о более точных измерениях при помощи некоторых хаков.

Сильно больше 5 Вольт

Для измерения постоянного напряжения больше 5 Вольт нужно использовать делитель напряжения на резисторах (Википедия). Схема подключения, при которой плата питается от 12V в пин Vin и может измерять напряжение источника (например, аккумулятора):

Код для перевода значения с analogRead в вольты с учётом делителя напряжения:

Как выбрать/рассчитать делитель напряжения?

1 мкА, что в тысячу раз меньше! На самом деле можно взять делитель с гораздо бОльшим суммарным сопротивлением (но не больше 20 МОм, внутреннего сопротивления самого АЦП), но обязательно поставить конденсатор на

Сильно меньше 5 Вольт

Для более точных измерений маленького напряжения можно подключить пин AREF к источнику низкого опорного напряжения (об этом было выше), чтобы “сузить” диапазон работы АЦП. Источник может быть как внешний, так и внутренний, например изменив опорное на внутреннее 1.1V ( analogReference(INTERNAL) ) можно измерять напряжение от 0 до 1.1 Вольта с точностью 1.1/1024

Видео

Источник

Регулятор напряжения питания на Arduino Uno

В этой статье мы рассмотрим проектирование источника изменяющегося напряжения (регулятор) питания с максимальным напряжением 5 В на основе платы Arduino Uno. Для этой цели мы воспользуемся АЦП (аналого-цифровым преобразованием) и ШИМ (широтно-импульсной модуляцией).

Эта схема будет обеспечивать рабочий ток до 100 мА, поэтому ее можно будет использовать для питания большинства используемых в настоящее время датчиков различного назначения. Также эту схему можно применить для зарядки аккумуляторов форматов AA и AAA. С помощью ЖК дисплея можно будет наглядно контролировать величину напряжения и его изменения. Уменьшение и увеличение выходного напряжения в схеме осуществляется с помощью кнопок.

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

Работа схемы

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

Напряжение на выходе устройства не будет полностью линейным – оно будет подвержено влиянию шумов. Для нейтрализации этого эффекта параллельно выходу включены конденсаторы. Две кнопки на схеме служат для увеличения и уменьшения напряжения на выходе схемы. ЖК дисплей служит для отображения текущего значения выходного напряжения.

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

Прежде чем приступим к рассмотрению программы кратко повторим принципы использования АЦП и ШИМ в плате Arduino Uno.

Напряжение с выхода схемы мы будем подавать на один из каналов АЦП платы Arduino Uno. После осуществления преобразования (АЦП) мы полученное цифровое значение будем преобразовывать в соответствующее ему значение напряжения и показывать его на экране ЖК дисплея.

Плата Arduino имеет шесть каналов АЦП. Мы можем использовать любой из них. Разрешение АЦП Arduino составляет 10 бит – то есть мы сможем работать с диапазоном целых чисел (0-(2^10) 1023)). Это означает что данный АЦП преобразует входное напряжение от 0 до 5 Вольт в целое число от 0 до 1023. То есть имеем точность АЦП 5/1024= 4.9 мВ. То есть один шаг приращения целого числа на выходе АЦП равен изменению в 4.9 мВ на его входе.

В нашей схеме для АЦП мы будем использовать канал A0. Для осуществления функций АЦП мы должны в программе сделать следующие вещи:

1. analogRead(pin);
2. analogReference();
3. analogReadResolution(bits);

Все каналы АЦП платы Arduino Uno имеют опорное напряжение 5В – то есть это максимальное значение входного напряжения, которое способны обрабатывать данные каналы. Поскольку, к примеру, некоторые датчики обеспечивают на своем выходе диапазон напряжений 0-2.5В, то использование опорного напряжения 5В в данном случае приведет к уменьшению точности измерений. Поэтому в подобных случаях для изменения опорного напряжения целесообразно использовать функцию “ analogReference() ;”. Мы в рассматриваемом случае оставим значение опорного напряжения без изменений.

Читайте также:  Регулировка насосно смесительного узла валтек комбимикс

По умолчанию разрешающая способность каналов АЦП платы Arduino Uno составляет 10 бит. Однако в некоторых случаях (например, для увеличения скорости преобразования) можно уменьшить эту разрешающую способность с помощью команды “ analogReadResolution(bits); ”. Мы в нашем примере не будем изменять разрешающую способность каналов АЦП.

Если все необходимые настройки канала АЦП сделаны (или оставлены по умолчанию), то для чтения значения с выхода АЦП можно воспользоваться функцией “ analogRead(pin); ”, где pin обозначает контакт платы Arduino, который мы будем использовать для аналого-цифрового преобразования, в нашем случае это будет контакт “A0”. Для того чтобы сразу сохранить значение с выхода АЦП в переменной можно использовать команду вида ” float VOLTAGEVALUE = analogRead(A0); ”, в результате этой команды значение с выхода АЦП будет сохранено в переменной “VOLTAGEVALUE”.

Контакты платы Arduino Uno, на которых возможно формирование ШИМ сигнала, обозначены символом “

”. Всего таких каналов на плате Arduino Uno шесть. Мы в рассматриваемом примере для формирования ШИМ сигнала будем использовать контакт PIN3.

Как использовать ШИМ сигнал в Arduino? Это можно сделать, к примеру, с помощью функции analogWrite(3,VALUE) – эта функция на 3-м контакте сформирует ШИМ сигнала со значением (коэффициентом заполнения), определяемым параметром VALUE. Параметр VALUE может изменяться в диапазоне от 0 до 255. 0 соответствует самому низшему значению, а 255 – самому высшему. При VALUE=255 в результате приведенной команды мы получим 5В на контакте PIN3. Если VALUE=125, то на PIN3 мы получим среднее значение напряжения равное 2,5 В.

Кнопки в схеме подключены к контактам PIN4 и PIN5 платы Arduino Uno. При нажатии одной кнопки мы будем увеличивать коэффициент заполнения ШИМ, а при нажатии другой – уменьшать. Таким образом, мы будем изменять коэффициент заполнения ШИМ на контакте PIN3.

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

С выхода схемы напряжение подается на канал АЦП платы Arduino Uno чтобы визуализировать его потом на экране ЖК дисплея.

Источник

ШИМ сигнал на Arduino

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

Можно ли добиться плавного управления цифровым сигналом? Оказывается можно! Представьте себе вентилятор, вращающийся на полной мощности, напряжение постоянно. Представим теперь, что секунду напряжение подаётся, и секунду – нет, и так продолжается “по кругу”. Вентилятор начнёт крутиться в два раза медленнее, но мы скорее всего будем замечать моменты включения и выключения, особенно если вентилятор маленький. Большой вентилятор более инертен и там можно даже не заметить изменений скорости в пределах двух секунд. Можно теперь включать напряжение на 0.5 секунды, а на остальные 1.5 секунды – выключать. Вентилятор будет крутиться со скоростью 25% от максимальной. Мы с вами смогли представить так называемый ШИМ сигнал, широтно-импульсную модуляцию

Читайте также:  Регулировка тросика печки нексия

С лампочкой накаливания оно тоже будет работать, она ведь весьма инертна, но вот со светодиодом мы будем видеть, как он включается и выключается, потому что он практически не имеет задержки включения/выключения. Что же делать? Всё очень просто, поднять частоту. В мысленном эксперименте у нас был период 2 секунды, что есть 0.5 Гц. А теперь представьте себе такой сигнал с частотой скажем 1000 Гц. Или 25’000 Гц (25 кГц). Теперь роль играет инертность глаза, он не заметит вспышек на такой частоте, для него это будет просто уменьшение яркости. Задача решена!

Изменяя так называемое “заполнение” ШИМ сигнала можно менять “суммарное” напряжение (интегрированное) за некоторый период. Чем больше заполнение ШИМ, тем выше напряжение, но не выше напряжения, которое мы “ШИМим”:

При помощи ШИМ сигнала можно даже модулировать сложные аналоговые сигналы, например – синусоиду. На картинке ниже показан ШИМ (снизу) и этот же ШИМ после фильтров:

Вот таким образом кстати и работают инвертеры DC-AC. Возвращаясь к свойствам ШИМ сигнала, их всего два: частота (frequency) и заполнение (duty), с ними мы разобрались. Давайте перейдём к генерации ШИМ при помощи Arduino.

Arduino и ШИМ

В уроке про функции времени я рассказывал, что у микроконтроллера есть так называемые счётчики, которые считают “пинки” от тактового генератора (кварца). Данные счётчики как раз и генерируют ШИМ сигнал, т.е. само вычислительное ядро микроконтроллера в этом не участвует. Помимо расчётов, даже вывод сигнала с ноги МК ложится на плечи счётчика. Это очень важно понимать, потому что ШИМ сигнал не тормозит выполнение кода, так как его генерацией занимается буквально “другая железка”.

На платах UNO/Nano/Pro Mini у нас есть три таймера-счётчика, у каждого таймера есть по два выхода на пины МК, то есть у нас есть 2*3=6 пинов, способных генерировать ШИМ сигнал. Для генерации ШИМ у нас есть готовая функция analogWrite(pin, duty)

Совместим эти знания с прошлым уроком и попробуем менять яркость светодиода, подключенного через резистор к пину D3. Потенциометр подключен к пину A0

Рассмотренный пример меняет яркость светодиода в зависимости от положения рукоятки потенциометра.

Пару слов о “стандартном” ШИМ сигнале – мы получаем его с такими настройками, какие нам даёт библиотека Arduino.h, а настройки эти сильно занижены по сравнению с возможностями Arduino. Про “улучшение” ШИМ мы поговорим позже, а сейчас давайте глянем на характеристики ШИМ “из коробки”:

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

Это весьма плачевные цифры, особенно по частоте. Все таймеры приведены под одну гребёнку, чтобы пользователь не думал не гадал и лишнюю документацию не изучал. К изменению частоты и разрядности ШИМ мы вернёмся в отдельном уроке, а пока что можете посмотреть данный урок в видео варианте.

Видео

Источник

Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Настройки и регулировки