Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Разработка киберфизических систем на основе микроконтроллеров. Учебное пособие
.pdf
Лекция 7. Аналого-цифровой преобразователь микроконтроллера AVR
51
сто также называют последовательным портом. Для организации передачи
данных используется последовательный код определённого формата, содержащего кроме самих данных дополнительные служебные сигналы.
Служебные сигналы формируются аппаратно в зависимости от настроек
модуля USART, поэтому передача, с программной точки зрения, сводится к
загрузке передаваемого байта в буфер USART, что автоматически инициирует передачу. Главные достоинства последовательного порта состоят в
простоте организации обмена, в высокой функциональности модуля в
плане выбора скоростей передачи и различных режимов работы.
Обмен данными по последовательному интерфейсу. Известно, что
любая передача данных связана с воздействием внешних паразитных факторов, что существенно влияет на качество канала данных и ухудшает его
физические характеристики. Модуль UART спроектирован с учётом возникновения сбоев передачи и позволяет аппаратно отслеживать ошибки
формата и переполнения буфера. Для обеспечения взаимодействия с программой микроконтроллера, модуль UART вырабатывает прерывания при
возникновении определённых событий:
- прием завершен с адресом вектора 009h в таблице векторов прерыва-
ний;
- регистр данных передатчика пуст с адресом вектора 00Аh;
- передача завершена с адресом вектора 00Вh.
Модуль UART использует в качестве выводов альтернативные функции линий порта PD. Входом приёмника (RXD) служит линия PD0, а выходом передатчика (TXD) – PD1.
Буфером UART как при приёме, так и при передаче данных с программной точки зрения является единый регистр UDR. Аппаратно UDR
представляет собой два раздельных регистра, которые в зависимости от
направления передачи данных подключаются к шине процессорного ядра.
Скорость приёма/передачи USART. Скорость передачи определяется
содержимым специального регистра ввода-вывода UBRR (Usart Boud Rate
Register).
В этот регистр при настройке UART помещается коэффициент предделителя основной тактовой частоты микроконтроллера. Кроме того, на
скорость влияет также бит U2X регистра UCSRA, управление которым
позволяет удваивать скорость передачи. При расчёте скорости работы

1. Основы проектирования киберфизических систем
52
UART, следует учитывать возможность управления этим битом. Установка
в единицу бита U2X увеличит скорость передачи в два раза. Для реализации синхронного обмена бит U2X должен содержать логический 0.
Регистр UBRR содержит 12 разрядов, а размещается в двух вось-
миразрядных регистрах UBRRH:UBRRL.
Для расчёта и настройки скорости обмена следует использовать сле-
дующие формулы:
‒ асинхронный режим (обычный, U2Xn = «0»)
BAUD = fCK/16(UBRR + 1);
‒ асинхронный режим (ускоренный, U2Xn = «1»)
BAUD = fCK/8(UBRR + 1);
‒ синхронный режим ведущего
BAUD = fCK/2(UBRR + 1),
где BAUD – скорость передачи в бодах, fCK – тактовая частота микроконтроллера; UBRR – содержимое регистра управления скоростью передачи (0…4095) [9].
Контрольные вопросы
1. Каковы функции аналого-цифрового преобразователя микро-
контроллера AVR?
2. Что представляют собой регистры управления АЦП?
3. Опишите интерфейс USART микроконтроллеров AVR.
4. Как осуществляется обмен данными по последовательному интер-
фейсу?
5. Что такое апертура АЦП?
6. Чем определяется разрешающая способность АЦП?
7. Как связана разрядность АЦП и динамический диапазон сигнала?
8. По какому интерфейсу обычно связываются АЦП с микроконтрол-
лером?
9. Каков принцип действия АЦП поразрядного уравновешивания?
10. Какова достигнутая разрядность АЦП поразрядного уравновеши-
вания?
11. Какова достигнутая скорость преобразования АЦП поразрядного
уравновешивания?

Лекция 8. Обработка прерывания
53
Лекция 8. Обработка прерывания
Прерывание можно описать таким образом: микроконтроллер “всё
бросает”, переключается на выполнение блока функций в обработчике прерывания, выполняет их, а затем возвращается ровно к тому месту основного кода, в котором остановился. Прерывания бывают разные, точнее их
причины: прерывание может вызвать АЦП, таймер или буквально пин
микроконтроллера (например, нажатие кнопки). Такие прерывания называются внешними аппаратными (External hardware interrupt ), и именно о них пойдет речь в данной лекции.
External hardware interrupt – это прерывание, вызванное изменением
напряжения на пине микроконтроллер, при этом системное ядро микроконтроллера не занимается опросом пина и не тратит на это время. Но
как только напряжение на пине меняется (цифровой сигнал) – микроконтроллер получает сигнал, прекращает выполнение основной программы, обрабатывает прерывание, и затем вновь возвращается к работе.
Прерывания используются для регистрации или подсчета коротких событий – импульсов без нагрузки на основной код. Аппаратное прерывание
может возникать по короткому нажатию кнопки или срабатыванию датчика во время сложных длительных вычислений или задержек в коде, т.е.
условно пин опрашивается параллельно основному коду.
У микроконтроллера есть возможность получать прерывания с любого
пина, такие прерывания называются PCINT и работать с ними можно
только при помощи сторонних библиотек, либо вручную. В этой лекции
рассмотрим обычные прерывания, которые называются INT, для того чтобы мы могли поработать с ними в среде разработки Ардуино IDE, но таких
прерываний и соответствующих им пинов достаточно мало. Все они указаны в табл. 6.
Таблица 6
Прерывания в среде разработки Ардуино IDE
МК / номер прерывания
INT 0
INT 1
INT 2
INT 3
INT 4
INT 5
ATmega 328/168 (Nano, UNO, Mini)
D2
D3 – – – –
ATmega 32U4 (Leonardo, Micro)
D2
D3
D0
D1
D7
–
ATmega 2560 (Mega)
D2
D3
D21
D20
D19
D18

1. Основы проектирования киберфизических систем
54
В табл. 6, прерывания имеют свой номер (INT 0, INT 1 и т.д.), кото-
рый отличается от номера пина (D2, D3). В функциях, связанных с обра-
боткой прерывания, важен именно номер прерывания. Соответствие номера прерывания и номера ножки отличается для различных кристаллов, как
это видно из табл. 6. Это соответствие можно узнать, прочитав документацию. Но есть специальная функция digitalPinToInterrupt(pin), которая автоматически преобразует номер ножки в номер прерывания. Задавая этой
функции цифру 3 на Arduino Nano, мы получим 1. Всё по табл. 6 выше.
Условий возникновения прерывания мы программируем и их мо-
жет быть несколько.
1. Прерывание все время генерируется, пока на ножке присутствует
низкийуровень напряжения.
2. В момент перехода с высокого на низкий.
3. В момент перехода с низкого на высокий.
Алгоритм работы с прерываниями выглядит следующим образом:
1. Правильно выбрать ножку, т.е. D2 или D3. № 1 прерывание = D2;
№ 2 прерывание = D3.
Контакты D2 и D3 позволяют организовать прерывания по изменению
сигнала на ножках.
2. Необходимо подключить к ножке (физически) источник (аппарат-
ный) прерывания, т.е. нечто, что создает само физическое прерывание,
например, кнопка.
3. Необходимо заготовить специальную подпрограмму обработки
прерывания. Это будет ISR (Interrupt Service Routine). С точки зрения языка
С, это обычная функция и в ней мы пишем, что нужно сделать, когда возникнет прерывание (например, зажечь светодиод).
4. В функции SETUP нужно один раз вызвать специальную функцию
attachInterrupt (pin, handler, mode).
Функция attachInterrupt(pin, handler, mode) или attachInterrupt (но-
мер прерывания, имя процедуры обработки прерывания, условие возникновения прерывания):
Pin – пин прерывания. Для AVR Arduino это номер прерывания (см.
табл. 6), для ESP8266 это номер GPIO или D-пин на плате;
handler – имя функции-обработчика прерывания, которую мы созда-
ли, в нашем примере это будет функция ISR.
mode – режим работы прерывания:

Лекция 8. Обработка прерывания
55
1. RISING (рост) – срабатывает при изменении сигнала с LOW на
HIGH;
2. FALLING (падение) – срабатывает при изменении сигнала
с HIGH на LOW;
3. CHANGE (изменение) – срабатывает при изменении сигнала
(с LOW на HIGH и наоборот);
4. LOW (низкий) – срабатывает постоянно при сигнале LOW (не под-
держивается на ESP8266).
Прерывание можно отключить при помощи функции
detachInterrupt(pin) или глобально запретить прерывания функци-
ей noInterrupts() и снова разрешить их при помощи interrupts(). Однако
нужно быть аккуратнее, так как функция noInterrupts() остановит также
прерывания таймеров, и у вас “сломаются” все функции времени и генерация ШИМ.
Задача 1.
По нажатию одной кнопки – зажечь светодиод, по нажатию другой
кнопки – погасить светодиод. При этом процессор НЕ должен отвлекаться на отслеживание состояния кнопок.
4-13
2
3
Рис. 14. Схема подключения кнопок к МК
#define setBtn 2 // источник прерывания (кнопка) между ножкой D2 и
землей
#define resetBtn 3 // источник прерывания (кнопка) между ножкой D3
и землей
#define LED 13 // светодиод на 13 пин

1. Основы проектирования киберфизических систем
56
void setup() {
pinMode (setBtn,INPUT_PULLUP); // подключаем кнопку D2 через
подтягивающий резистор
pinMode (resetBtn,INPUT_PULLUP); //подключаем кнопку D3 через
подтягивающий резистор
pinMode (LED,OUTPUT); // подключаем светодиод
digitalWrite (LED, LOW); // подаем низкий уровень, светодиод не го-
рит
attachInterrupt(digitalPinToInterrupt(setBtn),setISR,FALLING);
//связываем процедуру setISR с источником прерывания setBtn.
//Условие возникновения прерывания – перепад с высокого на низкий
уровень
attachInterrupt(digitalPinToInterrupt(resetBtn),resetISR,FALLING);//связы
ваем процедуру resetISR с источником прерывания resetBtn.
//Условие возникновения прерывания – перепад с высокого на низкий
уровень
}
void setISR(){ // процедура обработки прерывания от источника
setBtn
digitalWrite (LED, HIGH); // при возникновения прерывания на ножке
D2 – выполнить программу – зажечь светодиод
}
void resetISR(){ // процедура обработки прерывания от источника
resetBtn
digitalWrite (LED, LOW);
}
void loop() { // в цикле ничего не делаем, процессор НЕ занят
}
Задача 2.
Пусть процессор в цикле loop выполняет независимую фоновую зада-
чу, например, индицирует текущее время в секундах и выводит его в последовательный порт. Используем функцию millis(). Функция millis() воз-
вращает время в миллисекундах, прошедшее с начала выполнения программы на плате Arduino. Это число будет переполнено и сброситься до 0
примерно через 50 дней выполнения.

Лекция 8. Обработка прерывания
57
#define setBtn 2 // источник прерывания (кнопка) между ножкой D2 и
землей
#define resetBtn 3 // источник прерывания (кнопка) между ножкой D3
и землей
#define LED 13 // светодиод на 13 пин
void setup() {
Serial.begin(9600);// инициализация последовательного порта
pinMode (setBtn,INPUT_PULLUP); // подключаем кнопку D2 через
подтягивающий резистор
pinMode (resetBtn,INPUT_PULLUP); //подключаем кнопку D3 через
подтягивающий резистор
pinMode (LED,OUTPUT); // подключаем светодиод
digitalWrite (LED, LOW); // подаем низкий уровень – светодиод не го-
рит
attachInterrupt(digitalPinToInterrupt(setBtn),setISR,FALLING);
//связываем процедуру setISR с источником прерывания setBtn.
//Условие возникновения прерывания – перепад с высокого на низкий
уровень
attachInterrupt(digitalPinToInterrupt(resetBtn),resetISR,FALLING);//связы
ваем процедуру resetISR с источником прерывания resetBtn.
//Условие возникновения прерывания – перепад с высокого на низкий
уровень
}
void setISR(){ // процедура обработки прерывания от источника
setBtn
digitalWrite (LED, HIGH); // при возникновения прерывания на ножке
D2 – выполнить программу зажечь светодиод
}
void resetISR(){ // процедура обработки прерывания от источника
setBtn
digitalWrite (LED, LOW);
}
void loop() { // будет выполняться фоновая задача - индикация си-
стемного времени в секундах, при этом прерывания не влияют на выполнение программы, пользователь не замечает этого

1. Основы проектирования киберфизических систем
58
Serial.println(millis()/1000); // функция вывода - отправляем строку в
последовательный порт
delay (200);// ждем 1/5 секунды
}
Результат работы процессора посмотреть на мониторе порта.
Контрольные вопросы
1. Что такое прерывание в микроконтроллерах и как оно работает в
Arduino?
2. Какие бывают причины возникновения прерываний в микро-
контроллерах AVR?
3. Чем отличаются внешние аппаратные прерывания от других видов
прерываний?
4. Для чего обычно используются прерывания в микроконтроллерах
AVR?
5. Как работать с аппаратными прерываниями в среде Arduino IDE?
6. Какие функции и методы позволяют работать с прерываниями в
Arduino IDE?
7. Какие условия возникновения прерывания можно задать для пина на
Arduino?
8. Что такое ISR (Interrupt Service Routine), как использовать для обра-
ботки прерываний?
9. Как правильно настроить прерывание с помощью функции
attachInterrupt в функции setup() на Arduino?

59
2. ПРОЕКТИРОВАНИЕ КИБЕРФИЗИЧЕСКИХ СИСТЕМ
Лекция 1. Этапы проектирования киберфизических систем
Приведем основные этапы, которые так или иначе всегда присутствуют при проектировании киберфизических систем.
Цель. Четко сформулированная цель проекта уже дает половину его
успеха. Необходимо понимание конечного результата, что в итоге требуется от киберфизической системы. Для этого необходимо ответить на такие
вопросы: Какие именно задачи она создана решать? Какова область применения? Какие особенности по сравнению с аналогичными системами?
Определение технических характеристик и их увязка с требованиями
объекта, а с другой стороны – возможностями ПО и элементной базы (по
требованию заказчика в диалоге с ним: чем меньше технического риска,
тем меньше его ценности – нужен баланс. Здесь влияют компетенции разработчика, существующий уровень технической базы.
Разработка вариантов решения задачи и выбор наилучшего варианта
на уровне структурных схем (основной метод инженерного творчества –
сравнительный. У неопытных инженеров только один вариант. Это не верно, так как к проблеме нужно подходить с разных сторон. Метод узлового
проектирования, в случае если одна из частей занимает 90 % в самой системе).
Моделирование выбранного варианта и уточнение его характеристик и
параметров (важно знать, как устройство будет взаимодействовать с внешней средой, т.е. должны промоделировать на уровне алгоритма, программы, электронные схемы и др. Здесь появляются ошибки, например, вариант
КБС ничего сам по себе, но в среду не встраивается).
Детальная разработка выбранного варианта: конкретная элементная
база, библиотеки алгоритмов – рабочее проектирование. (Проблемы могут
возникнуть в ограниченности элементной базы. Тогда возможно опять вернуться к предыдущему этапу или даже к уточнению параметров.)
Программирование встраиваемой вычислительной системы и отладка
программы на моделях внешней среды, не в реальном времени.
Отладка в реальном времени с реальными датчиками и исполнительными механизмами.
Конструкторская проработка: печатная плата, корпус и т.д.

2. Проектирование киберфизических систем
60
Лекция 2. Примеры решения типовых задач, решаемых
при проектировании киберфизических систем
на основе микроконтроллеров
Все типовые задачи в основном относятся к двум классам: наблюдения
и управления. В свою очередь, управление всегда производится на основе
наблюдения. Поэтому первая типовая задача – это ввод и преобразование в цифровую форму сигналов из внешнего мира. Вторая типовая зада-
ча – на основе цифровой обработки сигналов из внешнего мира формирование управляющих сигналов во внешний мир. Обе задачи требуют активного применения внутренних аппаратных периферийных устройств вводавывода: АЦП, таймером, модемов, компараторов и др. Кроме того, основной режим работы – это обработка прерываний, прямой доступ к памяти.
То есть режимы максимально разгружающие процессор. Этим программирование киберфизических систем отличается от линейного программирования, чисто вычислительных задач или, например, программирования
изображений. То есть активно используем сигналы из внешнего мира, организуем быструю реакцию на них (буквально в мкс, если так быстро не
реагировать, то могут быть аварии в киберфизической системе). Поэтому и
используются МК, где организация такой быстрой реакцией существенно
облегчается по сравнению с большими компьютерами, использующими
офисные операционные системы, такие как Windows, Linux. Иногда для
программирования КБС на МК используются операционные системы реального времени, которые позволяют достаточно быстро организовать реакцию на внешние события и поддерживают мультизадачность. Например,
freeRTOS.
Задача 1.
Рассмотрим следующую классическую задачу – дискретизация анало-
гового сигнала с частотой дискретизации 10 000 Герц.
В качестве источника сигнала выбираем вывод А4 АЦП микро-
контроллера. Используем две библиотеки: GyverTimers для настройки и
управления таймером 1 и directADC для запуска АЦП, обработки прерывания от него и считывания оцифрованных данных.
Функции библиотеки DirectADC скачиваем, подключаем по ссылке
[10] https://github.com/GyverLibs/directADC.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
