Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование микропроцессорных систем управления подвижного состава железных дорог. Учебное пособие по дисциплинам «Автоматизированные и микропроц.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
// Составное битовое И. Эквивалентно x = x & y; x |= y; // Составное битовое ИЛИ. Эквивалентно x = x|y;
Параметры x, y должны быть целочисленного (int или long)
или символьного (char) типа.

Математические функции

В среде разработки Arduino IDE реализованы следующие мате- матические функции, существенно облегчающие процесс разра­ботки приложений для микроконтроллеров:
– выбор минимального из двух чисел: min(); – выбор максимального из двух чисел: max(); – вычисление модуля числа: abs(); – ограничение числа заданным диапазоном: constrain(); – пропорциональный перенос переменной из одного диапа-
зона в другой: map();
– возведение числа в степень: pow(); – вычисление квадратного корня числа: sqrt();
Рассмотрим данные функции более подробно.
2.9.1 Выбор минимального или максимального из
двух чисел
Функция min(x, y) возвращает значение, равное минималь- ному значению из двух аргументов x и y. Функция max(x, y)возвращает значение, равное максимальному значению из двух аргументов x и y.
Пример
z=min (x, y); /* Присваивает переменной z минимальное значение из двух аргументов, x и y. */ z=max (x, y); /* Присваивает переменной z максимальное значение из двух аргументов, x и y.*/
41

2.9.2 Вычисление модуля числа

Функция abs (x) возвращает абсолютное значение аргу- мента.
Пример
y=abs(x);

2.9.3 Ограничение числа заданным диапазоном

Функция constrain(x, a, b) возвращает ограниченное заданным диапазоном значение переменной x, нижняя граница которого определена аргументом a, а верхняя граница – аргумен- том b функции. Иными словами, функция constrain(x, a, b) реализует следующий математический оператор:
,  < ;
,  
=
,  > .
Пример
x=constrain(x, 10, 120); //Ограничивает значение x диапазоном 10, 120

2.9.4 Масштабирование переменной

;
Функция map(value, fromLow, fromHigh, toLow, toHigh) пропорционально переносит значение (value) из теку­щего диапазона значений (fromLow .. fromHigh) в новый диа­пазон (toLow .. toHigh). Функция map() не ограничивает зна­чение рамками диапазона, как это делает функция constrain(). Contrain() может быть использован до или после вызова map(), если необходимо ограничить допустимые значения заданным диа­пазоном.
Следует отметить, что «нижняя граница» может быть как меньше, так и больше «верхней границы». Это может быть исполь­зовано для того чтобы «перевернуть» диапазон:
y = map(x, 1, 50, 50, 1);
Возможно использование отрицательных значений:
42
y = map(x, 1, 50, 50, -100);
Функция map() оперирует целыми числами. При пропорцио­нальном переносе дробная часть не округляется по известным пра­вилами, а просто отбрасывается.
Параметры
• value: значение для переноса
• fromLow: нижняя граница текущего диапазона
• fromHigh: верхняя граница текущего диапазона
• toLow: нижняя граница нового диапазона, в который пе-
реноситься значение
• toHigh: верхняя граница нового диапазона
Возвращаемое значение
Значение в новом диапазоне
Пример
/*Масштабирование переменной из 10-ти битового пред- ставления [0..1023] в 8-ми битовое [0..255]*/
void setup() {} void loop() { int val = analogRead(0); /* Получение значения переменной val с выхода 10-ти битового аналого-цифрового преобразователя */ val = map(val, 0, 1023, 0, 255); analogWrite(9, val);
/* Использование нового значения val в качестве управляющего для 8-ми битового генератора ШИМ */
}

2.9.5 Возведение числа в степень

Функция pow (base, exponent) возведения в произволь- ную степень exponent произвольного числа base. Переменная, предназначенная для записи возвращаемого функцией результата, должна иметь тип double.
Пример
y=pow (x, 3);
43
/* Значение переменной x возводится в третью сте­пень, результат помещается в переменную y. */

2.9.6 Вычисление квадратного корня числа

Функция sqrt (x) возвращает значение, равное квадрат- ному корню аргумента x. Переменная, предназначенная для записи возвращаемого функцией результата, должна иметь тип double.
Пример
y=sqrt (x);

3. Ввод-вывод сигналов

Конфигурирование портов микроконтроллера
для выполнения операций ввода-вывода.
Устанавливает режим работы заданного вход/выхода(pin)
как входа или как выхода.
Синтаксис
pinMode(pin, mode);
Параметры
• pin: номер вход/выхода(pin), режим работы которого необходимо установить
• mode: режим одно из значение – INPUT, OUTPUTили IN- PUT_PULLUP устанавливает на вход или выход. Последний
параметр устанавливает режим работы на вход, при этом к соответствующему выводу подключается внутренний под­тягивающий резистор (см. раздел 3.2).
Пример
int ledPin = 13; // Светодиод, подключенный к входу/выходу 13 void setup() { pinMode(ledPin, OUTPUT);
44
// устанавливает режим работы – выход } void loop() { digitalWrite(ledPin, HIGH); // включает светодиод delay(1000); // ждет секунду digitalWrite(ledPin, LOW); // выключает светодиод delay(1000); // ждет секунду }
Примечание
Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для анало­гового входа 5).

Вывод дискретных сигналов digitalWrite()

Функция digitalWrite() подает HIGH или LOW значение на цифровой вывод (pin). Если вывод был сконфигурирован в режим выход (OUTPUT) функцией pinMode(), то для значения HIGH напряжение на соответствующем выводе будет равно 5В (3,3В для
3.3V плат), и 0В (земля) для LOW. Если вывод был установлен в ре­жим вход (INPUT), то функция digitalWrite с аргументом HIGH будет активировать внутренний подтягивающий резистор. Подача LOW в свою очередь отключает этот резистор
Синтаксис
digitalWrite(pin, value)
7
.
Параметры
• pin: номер вывода (pin)
7
Тем не менее, для активации внутреннего подтягивающего резистора рекомендуется использовать функцию pinMode() с аргументом INPUT_PULLUP.
45
• value: значение HIGH или LOW

Ввод дискретных сигналов digitalRead().

Функция digitalRead() считывает значение с заданного
входа – HIGH или LOW.
Синтаксис
digitalRead(pin)
Параметры
• pin: номер опрашиваемого вывода (pin).
Возвращаемое значение
HIGH, если на опрашиваемом входе напряжение
соответствует уровню логической единицы;
LOW, если напряжение на входе соответствует уровню логи-
ческого нуля.
Пример
int ledPin = 13; // Светодиод подключён к выводу 13 int inPin = 7; // кнопка на входе 7 int val = 0;
// переменная val для хранения промежуточного // значения
void setup() { pinMode(ledPin, OUTPUT); // устанавливает режим работы - выход // для 13-го вывода pinMode(inPin, INPUT); // устанавливает режим работы - вход // для 7-го вывода } void loop() { val = digitalRead(inPin); // считываем значение со входа в переменную val digitalWrite(ledPin, val);
46
// устанавливаем значение на выводе, // подключённом к светодиоду, равным значению, // полученному в результате опроса входа
// с кнопкой. }
Примечание
Если опрашиваемый вход не имеет подключённого источника входного сигнала, то digitalRead будет возвращать значения HIGH или LOW случайным образом.

Ввод аналоговых сигналов analogRead()

Функция считывает значение с указанного аналогового входа. Считывание значение с аналогового входа занимает примерно 100 микросекунд, т.е. максимальная частота дискретизации приблизи­тельно равна 10 кГц.
Синтаксис
analogRead(pin)
Параметры
• pin: номер порта аналогового входа с которого будет про- изводиться считывание.
Возвращаемое значение
int (0 to 1023)
Примечание
Если опрашиваемый аналоговый вход не подключён к источ­нику сигнала, то значения, возвращаемые функцией analogRead(), будут принимать случайные значения.
Пример
int analogPin = 3; /* номер порта, к которому подключён источник сигнала */ int val = 0; // переменная для хранения считываемого значения
void setup() { }
47
void loop() { val = analogRead(analogPin); // считываем значение в переменную val }

Вывод аналоговых сигналов analogWrite()

Для реализации возможности плавного изменения выход­ного напряжения при отсутствии встроенного в микроконтроллер цифро-аналогового преобразователя, используют генератор сиг­нала с широтно-импульсной модуляцией «аналогового» напряжения достигается изменением коэффици­ента заполнения импульсного цикла. На рисунке 3.1 приведены диаграммы, иллюстрирующие работу генератора с ШИМ при раз­личных величинах коэффициента заполнения импульсного цикла.
Генератор ШИМ микроконтроллера ATMega328P платформы Arduino UNO имеет шесть независимых каналов, работающих с ми­нимальной, фиксированной частотой. Управление ими осуществ­ляется в предположении, что счётчики каналов, а также управляю­щие регистры являются 8-ми разрядными.
Вывод аналогового сигнала осуществляется при помощи ко­манды analogWrite().
Синтаксис
analogWrite(pin, value)
8
. Изменение величины
Параметры
• pin: выходной порт, на который подаётся ШИМ сигнал.
• value: значение параметра ширины импульса, допускае-
мый диапазон для которого от 0 (полностью выключен) до 255 (включен постоянно).
Возвращаемое значение
нет
8
Некоторые платы Arduino, например Arduino DUE, имеют
встроенные цифро-аналоговые преобразователи.
48
Рисунок 3.1 – Иллюстрация работы генератора с ШИМ для
различных величин коэффициента заполнения
импульсного цикла
Пример
int ledPin = 9; // Светодиод подключен к выходу 9 int analogPin = 3; // Потенциометр подключен ко входу 3 int val = 0; // Переменная для хранения значения
void setup() { pinMode(ledPin, OUTPUT); // Конфигурирование порта в качестве // выходного pinMode(analogPin, INPUT); // Конфигурирование порта в качестве // выходного }
void loop()
49
{
На макетной плате собрать схему устройства в соотве
val = analogRead(analogPin); // В переменную val считываем значение с // порта, подключенного к потенциометру analogWrite(ledPin, val/4); // Устанавливаем режим работы генератора // ШИМ, для чего используем масштабированное // значение переменной val }

4. Практические задания

Знакомство с платформой Arduino. Вывод
цифровых сигналов.
Цель работы
Ознакомление с конструкцией платформы Arduino Uno и функ­циями интегрированной среды разработки Arduino IDE. Получение навыков сбора схем, разработки управляющих программ, их от­ладки и исполнения.
Содержание работы
Для схемы, приведённой на рисунке 4.1, необходимо разрабо­тать программу, реализующую управление двумя светодиодами таким образом, чтобы на выходе формировался сигнал, изображён­ный на диаграмме (рисунок 4.2).
Порядок выполнения работы
1. Изучить сведения, приведённые в разделе 7 о компонентах,
используемых в работе.
2. ствии с принципиальной схемой ( схемы приведён на рисунке 4.3.
3. Изучить текст программы, проанализировав текст опреде-
лить, чему равны интервалы времени t
void setup() { pinMode(12, OUTPUT);
// Конфигурирование канала 12 микроконтроллера // для вывода сигнала (красный светодиод)
рисунок 4.1). Пример собранной
, t2 и T (рисунок 4.2).
1
т-
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]