07.10.2017 18:35 Количество просмотров материала 3271 Время на чтение ~3 мин
Увеличить | Уменьшить Распечатать страницу

Программирование Arduino урок 16 — управление аналоговыми сигналами

Программирование Arduino урок 16 —  управление аналоговыми сигналами

День ото дня мы продвигаемся в плане освоения платформы Ардуино. Мы узнали, как можно научить контроллер общаться с пользователем (отправлять и получать необходимую для работы информацию). Выучили, как управлять работой «камушка» при помощи различных типов циклов (for и while).

Программирование Arduino урок 16 —  управление аналоговыми сигналами

В сегодняшней статье речь пойдёт о следующем. До сих пор все наши команды имели чисто дискретную составляющую. Своими действиями (командой DigitalWrite) мы задавали на выводах контроллера или высокий (5В) или низкий (0В) уровень сигнала, иными словами: мы то включали, то выключали подсоединенную к плате нагрузку. Однако, правда жизни в том, что в большинстве случаев нужно задавать какие-то промежуточные значения, а не метаться из крайности в крайность. Возможно, нам понадобится напряжение в 1,2 или 2,3 В…

Не все выводы платы Ардуино УНО имеют возможность задавать значения «по аналоговому принципу». Только выводы, напротив которых расположена волнистая линия: 3, 5, 6, 9, 10, 11.

Как бы быстро технический процесс не двигался в направлении цифровых (дискретных) сигналов, в мире техники и электроники, всегда будет необходимость в применении аналоговых напряжений. Для задания, на сконфигурированным выводе, значения напряжения в пределах от 0 до 5В применяется команда analogWrite.

К сожалению, в аргументах функции analogWrite, нельзя записать просто значение напряжения, которое мы хотим получить. Мы должны указывать целое число в пределах от 0 до 255.

Например.

Команда analogWrite (pinLed, 0) сделает следующее: установит на выводе pinLed 0В (иными словами выключит питание). Если же записать analogWrite (pinLed, 255), то на выводе pinLed будет установлен высокий уровень сигнала (5В). В случае же, если мы напишем analogWrite (pinLed, 127), то установим на выводе значение напряжения, что равно около 2,5В.

Примечание: значение 255 – это 2 в 8 степени. Значение степени определяется разрядность ЦАП (цифро-аналогового преобразователя).

Это всего лишь несколько примеров, для более точного соответствия значений-напряжений выполним ряд математических расчётов.

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

Для выведения уравнения будем использовать две точки, полученные из приведённого графика.

Программирование Arduino урок 16 —  управление аналоговыми сигналами

По оси Х откладываем напряжения, по оси Y откладываем аналоговое значение.

Первая точка имеет координаты (0,0) – напряжение на выводе равно 0, аналоговое значение 0. Вторая точка (5, 255) – напряжение на выводе равно 5В, аналоговое значение 255. Между этими двумя точками проводим прямую линию. Использую данных график, можно приблизительно определять необходимые для функции analogWrite аргументы.

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

K = (value2-value1)/(voltage2- voltage 1) = (255-0)/(5-0) = 51

(value - value1)=K*(voltage - voltage1)

Как вы помните, первая точка имеет координаты: (value1, voltage1) = (0,0).

Подставляем значения: (value -0) = 51*(voltage – 0) => value = 51*voltage

Где, voltage - это напряжение, которое мы хотим получить, а value - это значение, которое необходимо задать.

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

Например, мы хотим получить ровно 2В на выводе pinLED => 2*51 = 102 => analogWrite (pinLED, 102).

Практическую часть будем «откатывать» на схеме из двух светодиодов.

Программирование Arduino урок 16 —  управление аналоговыми сигналами

Продолжаем работать с кодом, написанным в предыдущем уроке. Я немного видоизменил программу, составленную нами в 15 уроке, а именно:

  • запрос на ввод данных от пользователя теперь выполняется всего один раз;
  • зелёный светодиод работает с циклом for, а красный – с циклом while.

Нам нужно заменить четыре команды digitalWrite на команды analogWrite. Допустим, что вместо 5В мы хотим подать на светодиод 1В (светодиоды будут слегка мерцать) Для этого напряжение*коэффициент = значение аргумента => 1*51 = 51. Команда включения светодиода будет иметь следующий вид:

analogWrite (greenLed, 51) или analogWrite (redLed, 51).

Обратите внимание на следующее: команды digitalWrite (greenLed, LOW) и digitalWrite (redLed, LOW) по-прежнему будут выключать светодиоды, но лучше пускай все будет выполнено в одном стиле.

Программирование Arduino урок 16 —  управление аналоговыми сигналами

Изменим программу, присвоив переменным, что отвечают за количество миганий определённые значения (теперь пользователь не будет их задавать). Поменяем сообщения, которые контроллер отправляет пользователю перед запуском основной программы. Затем объявим 2 новые переменные, которые будут хранить аналоговые значения напряжений. Заменим «аналоговые значения» на переменные

analogWrite (greenLed, 51);

analogWrite(redLed,51);

на

analogWrite (greenLed, anologValueGreenVoltage);

analogWrite(redLed,anologValueRedVoltage);

Программирование Arduino урок 16 —  управление аналоговыми сигналами

Продолжение следует…

lesson_16

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]


Вверх