Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микропроцессорных систем управления подвижного состава железных дорог. Учебное пособие по дисциплинам «Автоматизированные и микропроц.pdf
X
- •ВВЕДЕНИЕ
- •1. Платформа Arduino UNO
- •1.1 Описание аппаратной части
- •2.1 Основы языка программирования С/С++
- •2.2 Арифметические операторы
- •2.2.1 Оператор присваивания
- •2.2.2 Сложение, вычитание, умножение и деление
- •2.2.3 Вычисление остатка от деления
- •2.3 Логические операторы
- •2.6.1 Условные операторы
- •2.6.1.1 Условный оператор if
- •2.6.1.2 Условный оператор if..else
- •2.6.1.3 Оператор switch…case
- •2.6.2 Операторы реализации циклических вычислений
- •2.6.2.1 Оператор цикла for
- •2.6.2.2 Оператор цикла while
- •2.6.2.3 Оператор цикла do...while
- •2.6.3 Оператор break
- •2.6.4 Оператор continue
- •2.6.5 Оператор return
- •2.6.6 Оператор перехода goto
- •2.7 Операции над битами
- •2.8 Составные операторы
- •2.8.1 Операторы ++ (инкремент) и – – (декремент)
- •2.8.2 Операторы += , –= , *= , /= , %=
- •2.8.3 Оператор &= и |=
- •2.9 Математические функции
- •2.9.2 Вычисление модуля числа
- •2.9.3 Ограничение числа заданным диапазоном
- •2.9.4 Масштабирование переменной
- •2.9.5 Возведение числа в степень
- •2.9.6 Вычисление квадратного корня числа
- •3. Ввод-вывод сигналов
- •3.2 Вывод дискретных сигналов digitalWrite()
- •3.3 Ввод дискретных сигналов digitalRead().
- •3.4 Ввод аналоговых сигналов analogRead()
- •3.5 Вывод аналоговых сигналов analogWrite()
- •4. Практические задания
- •5. Основы алгоритмизации
- •6. Элементы математической логики
- •7.1 Макетная плата
- •7.2 Постоянный резистор
- •7.3 Переменный резистор
- •7.4 Тактовая кнопка DTS-61N
- •7.5 Светодиод видимого спектра свечения
- •7.6 Четыре компаратора LM239N
- •7.7 Шесть логических элементов НЕ SN74HC04N
- •7.8 Приоритетный шифратор 8 в 3 SN74HC148N
- •7.9 Датчик угла поворота EXW1J-C24-AC0024L
- •7.11 Полевой транзистор IRF530NPBF
- •7.12 Дроссель Д25
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •ИСПОЛЬЗОВАННЫЕ ИСТОЧНИКИ
- •СОДЕРЖАНИЕ

// Составное битовое И. Эквивалентно 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
