Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Разработка киберфизических систем на основе микроконтроллеров. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Лекция 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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]