Вы находитесь на странице: 1из 67

МИНОБРНАУКИ РОССИИ

__________________________________________________________________

Санкт-Петербургский государственный электротехнический

университет «ЛЭТИ» им. В. И. Ульянова (Ленина)

__________________________________________________________________

МИКРОПРОЦЕССОРНАЯ ТЕХНИКА В МЕХАТРОНИКЕ


И РОБОТОТЕХНИКЕ

Учебное пособие

Санкт-Петербург
Издательство СПбГЭТЭУ «ЛЭТИ»
2015
УДК 517.977.1(075)
ББК 00000000
И00

Путов В. В., Путов А. В., Игнатьев К. В., Копычев М. М., Казаков В. П., Друян
Е. В., Русяева Т. Л.

И00 Микропроцессорная техника в мехатронике и робототехнике: учеб. пособие. СПб.:


Изд-во СПбГЭТУ «ЛЭТИ», 2015. 67 с.

ISBN 5-7629-0462-8

Содержит программы и методики выполнения лабораторных работ, посвященных


изучению основ: программирования на языках высокого уровня; микроконтроллерного
управления электрическими приводами основных типов; построения систем автоматиче-
ского управления исполнительными механизмами, применяемыми в робототехнике и ме-
хатронике.

УДК 517.977.1(075)
ББК 00000000

Рецензенты:

Утверждено
редакционно-издательским советом университета
в качестве учебного пособия

ISBN 5-7629-0462-8 © СПбГЭТУ «ЛЭТИ», 2015


ВВЕДЕНИЕ
В СПбГЭТУ «ЛЭТИ» создана учебно-научная лаборатория «Управле-
ние и автоматизация мехатронных комплексов подвижных объектов и
транспортных систем» для изучения основ программирования микрокон-
троллерной и компьютерной техники применительно к задачам робототехни-
ки и мехатроники.
Основными задачами, решаемыми в рамках данных лабораторных работ,
являются следующие:
 изучение основ программирования на языках высокого уровня;
 работа с основными типами современных датчиков и внешних уст-
ройств, используемых в робототехнике;
 микроконтроллерное управление электрическими приводами основ-
ных типов;
 изучение основ построения систем автоматического управления ис-
полнительными механизмами;
 изучение алгоритмов искусственного интеллекта и компьютерного
зрения.
Настоящее учебное пособие предназначено для подготовки бакалавров
по направлению 220400.62 – «Управление в технических системах» по про-
филю 220406.62 – «Системы и технические средства автоматизации и управ-
ления» и выполняющими лабораторный практикум по дисциплине «Микро-
процессорная техника в мехатронике и робототехнике».
Учебное пособие содержит необходимые сведения об уникальном обо-
рудовании, представленном в лаборатории, а само оборудование, оснащенное
компьютерными информационно-управляющими комплексами с развитым
программным обеспечением, предоставляет возможность углубленного и
разностороннего изучения его функций, далеко выходящего за рамки содер-
жания настоящего пособия и программ представленных в нем лабораторных
работ.

3
1. ОПИСАНИЕ МИКРОКОНТРОЛЛЕРНОГО ЛАБО-
РАТОРНОГО СТЕНДА И ИНСТРУМЕНТАЛЬНЫХ
СРЕДСТВ РАЗРАБОТКИ ПРИКЛАДНЫХ ПРОГРАММ
1.1. Описание микроконтроллерного лабораторного стенда
Микроконтроллерный лабораторный стенд представляет собой аппарат-
но-программный комплекс с совокупностью объектов управления, датчиков
и средств индикации, управляемых микроконтроллером ATmega128A. На
рис. 1.1 приведена схема передней панели лабораторного стенда.

Рис. 1.1. Лабораторный стенд

В состав лабораторного стенда включены следующие компоненты:


1. шаговый двигатель с силовым драйвером на базе микросхемы тран-
зисторных ключей ULN2003A;
2. двигатель постоянного тока с силовым широтно-имульсным преоб-
разователем на микросхеме L298N;
3. пятиразрядный цифровой дисплей на семисегментных индикаторах;
4. светодиодная шкала из 16 светодиодов, разделенная на две авто-
номные части по 8 светодиодов в каждой;
5. динамик, предназначенный для формирования звуковых сигналов;
4
6. светодиодная матрица 16х16 точек, состоящая из четырех квадрат-
ных матриц размера 8х8;
7. миниманипулятор «серворука», состоящая из двух суставов с сер-
вомашиной в каждом суставе;
8. слот для SD карты памяти;
9. тумблеры конфигурации стенда;
10. графический монохромный жидкокристаллический индикатор раз-
решением 128х64 точки WG12864A;
11. ультразвуковой датчик расстояния;
12. многоцветный светодиод RGB (Red, Blue, Green);
13. ползунковый потенциометр, подключенный к АЦП;
14. механический энкодер;
15. символьный монохромный жидкокристаллический индикатор раз-
мером 2 строки по 16 символов точки WH1602C;
16. магнитный подвес с катушкой, формирующей силовое магнитное
поле;
17. датчик Холла магнитного подвеса;
18. тензометрический датчик для измерения момента;
19. цифровой температурный датчик DS1631S в связке с мощным рези-
стором, используемым для изменения температуры;
20. мембранная клавиатура 4х3 клавиши.
Большая часть перечисленных компонентов стенда используются в опи-
сываемых ниже лабораторных работах в качестве подключенных к микро-
контроллеру ATmega128A объектов управления, датчиков и средств индика-
ции.

1.2. Введение в интегрированную среду разработки


CodeVisionAVR
1.2.1. Общие сведения
IDE CodeVisionAVR – интегрированная среда разработки (IDE – Inte-
grated Development Environment) прикладного программного обеспечения для
широкой номенклатуры 8-разрядных микроконтроллеров (МК) семейства
AVR фирмы Atmel.
Процедура разработки кода прикладной программы для микропроцес-
сорных систем в IDE CodeVisionAVR состоит из нескольких этапов.

5
На первом этапе разработки производится запись исходного текста про-
граммы на ассемблере или языке C. Эта операция осуществляется с помощью
редактора текста – входящей в состав интегрированной среды системной
программы, предназначенной для создания и модификации текста исходных
программ и его записи в файл на внешнем носителе.
Любой МК в процессе работы воспринимает лишь двоичные коды сво-
его машинного языка, поэтому для преобразования записанной программы в
машинный код необходимы дополнительные средства. Трансляция (перевод)
программы с языка C в машинные коды МК производится с помощью транс-
лятора – программного модуля, который переводит (транслирует) исходный
текст программы на языке программирования в машинные коды. В процессе
работы транслятор не только переводит команды языка в машинные инст-
рукции, но и обнаруживает синтаксические ошибки в исходной программе с
указанием места их расположения.
На следующем этапе – компоновке, объединяются (компонуются) не-
сколько автономно оттранслированных объектных модулей в единый, при-
годный для загрузки в МК абсолютный модуль. Необходимость выполнения
этой функции объясняется наличием в объектных модулях ссылок на другие,
в том числе и стандартные библиотечные объектные модули. Кроме того, по
информации, помещаемой транслятором в объектный модуль, компоновщик
перемещает адреса этого модуля в соответствии с фактическим расположе-
нием программы в памяти программ МК. В процессе своей работы компо-
новщик отслеживает ошибки построения объектного модуля и выдает ин-
формацию о характере этих ошибок.
Принципы модульного программирования предоставляют пользователю
большие удобства при разработке программ. Часто применяемые подпро-
граммы могут транслироваться отдельно и храниться в виде объектных мо-
дулей, компонуемых по мере необходимости с разрабатываемой программой.
Эти процедуры еще более упрощаются при объединении подпрограмм в биб-
лиотеки объектных модулей с помощью библиотекаря – системной програм-
мы, предназначенной для создания библиотек и их пополнения.
IDE CodeVisionAVR объединяет все описанные выше этапы разработки
прикладной программы в единый рекурсивный процесс, в котором в любое
время возможен быстрый возврат к любому предыдущему этапу для исправ-
ления ошибок или изменении алгоритма.

6
1.2.2. Основные компоненты IDE CodeVisionAVR
Менеджер проектов. Программный проект в IDE CodeVisionAVR со-
стоит из большого числа связанных друг с другом исходных файлов, которые
часто требуют индивидуальной обработки. Включенный в состав IDE
CodeVisionAVR менеджер проектов дает разработчику возможность созда-
ния проекта из исходных файлов с заданием различных опций разработки.
Редактор текста. Интегрированный в IDE CodeVisionAVR редактор
значительно облегчает подготовку исходного текста за счет использования
нескольких окон, выделения синтаксических элементов программы цветом и
возможности исправления ошибок в режиме диалога. Редактор настраивается
на конкретный проект в соответствии с предпочтениями пользователя.
Оптимизирующий транслятор. Язык C – универсальный, широко рас-
пространенный язык программирования, который обладает богатым набором
операторов и позволяет осуществлять разработку программ с применением
принципов структурного программирования. Это делает его эффективным
средством не только для решения вычислительных задач, но и для реализа-
ции задач управления.
В IDE CodeVisionAVR используется язык программирования С, который
является расширением стандарта ANSI C и предназначен для написания про-
грамм для МК семейства AVR. С этой целью в язык программирования
включен ряд дополнений, отображающих особенности построения этого се-
мейства МК. Транслятор с языка программирования предназначен для полу-
чения быстрых и компактных кодов для МК семейства AVR и сочетает гиб-
кость программирования на языке высокого уровня с эффективностью и ско-
ростью работы программ, написанных на ассемблере.
Компоновщик. Компоновщик создает абсолютный модуль, компонуя
его из полученных в результате трансляции объектных модулей и модулей,
извлекаемых из стандартных или пользовательских объектных библиотек. Он
автоматически выбирает соответствующие библиотеки поддержки и связы-
вает только требуемые модули из библиотек. Компоновщик размещает
внешние и общие ссылки, назначает абсолютные адреса перемещаемым сег-
ментам программы. Полученный в результате компоновки абсолютный модуль
привязан к физическим адресам МК и предназначен для загрузки в его память
программ.
Библиотекарь. Это системное программное средство предназначено
для создания библиотек объектных модулей, создаваемых транслятором.
7
Библиотека – это упорядоченный набор объектных модулей, который ис-
пользуется компоновщиком в процессе компоновки. При этом компоновщик
включает в создаваемый абсолютный модуль только те компоненты из биб-
лиотеки, на которые имеются ссылки в исходной программе.
База данных устройств. База данных содержит детальную информацию
обо всех МК, поддерживаемых инструментальными средствами среды
CodeVisionAVR. При выборе типа МК из базы данных все требуемые опции
в созданном под управлением CodeVisionAVR проекте устанавливаются ав-
томатически.
Программатор. Среда разработки CodeVisionAVR имеет встроенный
виртуальный программатор. Это программное приложение, позволяющее
пользователю управлять передачей информации на каналы физического про-
грамматора (в данном случае AVRSTK500).
1.2.3. Краткое описание CodeVisionAVR
IDE CodeVisionAVR запускается с помощью ярлыка на рабочем столе
или из стартового меню, как и любое другое приложение операционной сис-
темы Windows. Внешний вид стартового окна IDE CodeVisionAVR при ис-
пользовании минимально необходимых открытых окон показан на рис. 1.2.
Это окно проекта (2), в котором отображается структура проекта и входящие
в нее компоненты, окно редактора текста (3), окно шаблонов (4) и окно со-
общений (5), предназначенное для вывода сообщений об ошибках и преду-
преждениях.
В верхней части окна находится главная панель, включающая следую-
щие выпадающие меню:
 File – меню команд работы с файлами;
 Edit – меню команд редактора текста;
 Search – меню процедур поиска;
 View – меню управления отображением рабочих окон;
 Project – меню настройки параметров и управления проектом;
 Tools – меню использования дополнительных программ;
 Setting – меню установок IDE и дополнительных программ;
 Help – меню получения справочной информации.

8
Рис. 1.2. Стартовое окно IDECodeVisionAVR
Помимо главного меню в верхней части окна расположены инструмен-
тальные панели (1): работы с файлами, редактора текста, поиска, управления
окнами и инструментальными панелями, режимов построения проекта, инст-
рументов, настроек компонентов среды и помощи. Любая инструментальная
панель состоит из набора иконок, каждая из которых связана с выполнением
определенной операции. Вид иконок и описание связанных с ними операций
представлены в таблице 1.1. Следует отметить, что многие из операций могут
быть также выполнены с помощью вызова пунктов главного меню или нажа-
тия комбинации горячих клавиш, поэтому в таблице наряду с иконками
представлена и эта информация.
Таблица 1.1. Пункты меню среды CodeVisionAVR
Икон- Горячие
Пункт меню Описание
ка клавиши
Инструментальная панель File
New… Ctrl+N Создать новый файл или проект
Open… Ctrl+O Открыть существующий файл или проект
Reopen История открываемых файлов или проектов
Save Ctrl+S Сохранить открытый исходный файл
Save as… Сохранить файл как…
Save All Ctrl+Shift+S Сохранить все открытые файлы
Close Ctrl+W Закрыть файл
Close Multiple Закрыть несколько файлов
Close All Закрыть все файлы
Convert to Li-
Преобразовать в библиотеку
brary
Page Setup Параметры страницы
Print Preview Просмотр перед печатью

9
Продолжение табл. 1.1
Икон- Горячие
Пункт меню Описание
ка клавиши
Print Ctrl+P Печать
Инструментальная панель Edit
Undo Ctrl+Z Отменить последнюю операцию
Redo Ctrl+Shift+Z Восстановить последнюю операцию
Cut Ctrl+X Вырезать выделенный текст в буфер обмена
Копировать выделенный текст в буфер
Copy Ctrl+C
обмена
Paste Ctrl+V Вставить текст из буфера обмена
Delete Selection Ctrl+Delete Удалить выделение
Select All Ctrl+A Выделить все
Print Selection Печатать выделение
Сдвинуть выделенный текст на один шаг
Indent Selection Ctrl+I
табуляции вправо
Unindent Сдвинуть выделенный текст на один шаг
Ctrl+U
Selection табуляции влево
Comment
Ctrl+[ Закомментировать выделенный текст
Selection
Uncomment
Ctrl+] Раскомментировать выделенный текст
Selection
Insert Special
Вставить специальный символ
Character
Toggle Bookmark Ctrl+F2 Установить закладку в текущей строке
Jump to
Ctrl+F2 Перейти к закладке
Bookmark
Jump to Next
F2 Переместить курсор к следующей закладке
Bookmark
Jump to Previous
Shift+F2 Переместить курсор к предыдущей закладке
Bookmark
Go Back
Go Forward
Go to Definition/
F12
Declaration
Go to Line Ctrl+G Перейти к строке
Go to Matching
Ctrl+M Выделение парных скобок
Brace
Инструментальная панель Search
Find… Ctrl+F Найти текст в активном файле
Find Next F3 Найти текст в активном файле
Find Previous Ctrl+F3 Найти текст в активном файле
Find in Files… Ctrl+Shift+F Поиск текста в нескольких файлах
Replace Ctrl+H Поиск и замена текста в активном файле

10
Продолжение табл. 1.1

Икон- Горячие
Пункт меню Описание
ка клавиши
Replace in Files Ctrl+Shift+H Поиск и замена текста в файлах
Инструментальная панель View
Toggle Fold Показать/скрыть блок текста
Expand All Folds Показать все блоки текста
Collapse All
Скрыть все блоки текста
Folds
Visible Non-
Printable Отобразить непечатаемые символы
Characters
Code Navigator Показать или скрыть окно проекта
Code Information Показать или скрыть окно информации
Function Call
Показать или скрыть окно вызова функций
Tree
Code Template Показать или скрыть окно шаблонов
Clipboard History Показать или скрыть окно Clipboard
Messages Показать или скрыть окно сообщений
Find In Files Показать или скрыть окно поиска в файлах
Single Pane Одна панель в окне
Dual Pane
Две вертикальные панели в окне
Vertical
Dual Pane
Две горизонтальные панели в окне
Horizontal
Инструментальная панель Project
Check Syntax Проверка на синтаксические ошибки
Compile F9 Транслировать текущий файл
Построить приложение, транслируя только
Build Shift+F9
измененные исходные файлы
Построить приложение, транслируя заново
Rebuild All Ctrl+F9
все исходные файлы
Остановить текущий процесс построения
Stop Compilation
приложения
Clean Up Очистка проекта
Вывод информации о процессе построения
Information
Go to Next Error F8 Перейти к следующей ошибке
Go to Previous
Ctrl+F8 Перейти к предыдущей ошибке
Error
Go to Next
F4 Перейти к следующему предупреждению
Warning
Go to Previous
Ctrl+F4 Перейти к предыдущему предупреждению
Warning
Notes Внести заметку в файл Notes
11
Окончание табл. 1.1
Икон- Горячие
Пункт меню Описание
ка клавиши
Configure Конфигурация проекта
Инструментальная панель Tools
CodeWizardAVR Shift+F2 Запустить мастер CodeWizardAVR
Debugger Shift+F3 Запустить отладчик
Chip Programmer Shift+F4 Запустить процедуру программирования
Terminal Shift+F5 Запустить терминальную программу
Инструментальная панель Settings
IDE Настройка установок IDE
Editor Настройка установок редактора текста
Debugger Настройка установок отладчика
Chip Programmer Настройка установок программатора
Terminal Настройка установок терминала

Во всех примерах программ в данном учебном пособии для краткости


будут использоваться следующие макросы:

1. Макрос выбора бита:


#define _BV(b) (1 << (b))
Пример использования: настройка ножек 3 и 4 порта PA на выход
DDRA = _BV(3) | _BV(4); // DDRA = (1 << 3) | (1 << 4);
2. Макрос проверки бита b в регистре Reg на равенство нулю:
#define BIT_IS_CLEAR(Reg, b) ((Reg & _BV(b)) == 0)
Пример использования: проверка ножки 3 порта PA
if(BIT_IS_CLEAR(PINA, 3)) // if((PINA & (1 << 3)) == 0)
3. Макрос проверки бита b в регистре Reg на равенство единице:
#define BIT_IS_SET(Reg, b) ((Reg & _BV(b)) != 0)
Пример использования: проверка ножки 3 порта PA
if(BIT_IS_SET(PINA, 3)) // if((PINA & (1 << 3)) != 0)

12
2. ЛАБОРАТОРНЫЕ РАБОТЫ

Лабораторная работа 1. Работа с механическим энкодером


Цель работы  освоить использование внешних прерываний в работе с
механическим энкодером.
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.1.1.

Рис. Л.1.1. Состояние тумблеров конфигурации стенда для работы 1

Л.1.1. Основные сведения


Прерывания микроконтроллера. В общем случае запрос на прерыва-
ние во время работы МК приводит к временной остановке выполнения ос-
новной программы и передаче управления специальной подпрограмме об-
служивания прерывания (ПОП), в которой реализуется реакция на событие,
вызвавшее запрос прерывания. По окончании работы ПОП выполнение ос-
новной программы должно возобновляться с того момента, в который она
была прервана по запросу прерывания. Любой запрос на прерывание вызыва-
ет установку флага прерывания, соответствующего источнику прерывания,
вызвавшего запрос.
В разных средах программирования объявление функций обработчиков
прерываний сделано по-разному. В CVAVR объявление функции обработчи-
ка прерывания осуществляется следующим образом:
interrupt [TIM2_OVF] void timer2OvfIsr(void)
{
// Тело функции обработчика
}
где TIM2_OVF – тип прерывания, в данном случае прерывание по пере-
полнению таймера №2, список обозначений основных типов прерываний
приведён ниже; timer2OvfIsr – имя функции обработчика прерывания, зада-
ётся программистом по тем же правилам что и имена обычных функций.
Список основных типов прерываний в порядке уменьшения их приори-
тета:
13
1) EXT_INT0 – 0-е внешнее прерывание;
2) EXT_INT1 – 1-е внешнее прерывание;
3) EXT_INT2 – 2-е внешнее прерывание;
4) EXT_INT3 – 3-е внешнее прерывание;
5) EXT_INT4 – 4-е внешнее прерывание;
6) EXT_INT5 – 5-е внешнее прерывание;
7) EXT_INT6 – 6-е внешнее прерывание;
8) EXT_INT7 – 7-е внешнее прерывание;
9) TIM2_COMP – прерывание по совпадению значения таймера №2;
10) TIM2_OVF – прерывание по переполнению таймера №2;
11) TIM1_COMPA – прерывание по совпадению значения канала А тай-
мера №1;
12) TIM1_COMPB – прерывание по совпадению значения канала B тай-
мера №1;
13) TIM1_OVF – прерывание по переполнению таймера №1;
14) TIM0_COMP – прерывание по совпадению значения таймера №0;
15) TIM0_OVF – прерывание по переполнению таймера №0;
16) TIM1_COMPC – прерывание по совпадению значения канала С тай-
мера №1;
17) TIM3_COMPA – прерывание по совпадению значения канала А тай-
мера №3;
18) TIM3_COMPB – прерывание по совпадению значения канала B тай-
мера №3;
19) TIM3_COMPC – прерывание по совпадению значения канала С тай-
мера №3;
20) TIM3_OVF – прерывание по переполнению таймера №3.
Все эти обозначения являются макросами и заданы в заголовочном фай-
ле mega128a.h.
Для того чтобы функция обработчик прерывания была вызвана необхо-
димо выполнение трёх условий:
1) Прерывания должны быть разрешены глобально, делается это уста-
новкой в «1» бита I регистра SREG. Для этого выделена специальная
машинная команда контроллера – sei. Для сброса этого бита также
выделена отдельная команда – cli. Для использования ассемблерных
команд в CVAVR используется директива #asm. Таким образом, для
глобального разрешения прерываний необходимо добавить строчку
14
#asm(“sei”) в одну из функций программы, например в функцию
main.
2) Должно быть разрешено соответствующее прерывание, делается это
с помощью конфигурации соответствующих регистров.
3) Должно произойти событие вызывающее соответствующее прерыва-
ние, например переполнение таймера или изменение сигнала на вхо-
де внешнего прерывания.
По умолчанию при входе в обработчик прерывания контроллер глобаль-
но запрещает прерывания и разрешает их при выходе из функции обработчи-
ка. Делается это с целью недопущения «зависания» контроллера в процессе
обработки прерывания.
При работе с прерываниями необходимо помнить некоторые важные
моменты:
1) Во время выполнения функции обработчика прерывания основная
программа не выполняется, поэтому при большой частоте прерыва-
ний основная программа может вообще остановить своё выполнение.
2) При обращениях в основной программе к переменным, изменяемым
в обработчике прерываний и имеющим размер больше одного байта,
должны быть запрещены прерывания изменяющие её. При работе с
такими переменными прерывание может случиться между команда-
ми, считывающими разные байты переменной, что приведёт к непра-
вильному чтению или записи.
3) Каждый источник прерываний имеет только один флаг, указываю-
щий на то, что произошло событие вызывающее это прерывание. По-
этому если до вызова обработчика прерывания случиться два и более
таких событий, обработчик всё равно будет вызван только один раз.
Внешние прерывания. Внешние прерывания осуществляются через
выводы INT7…INT0. Внешние прерывания могут генерироваться по падаю-
щему (1-в-0), нарастающему (0-в-1) фронту, по низкому логическому уров-
ню, а также по любому изменению уровня на входе (последнее только для
INT4-7). Одна из этих установок задаётся в регистрах управления внешними
прерываниями EICRA (INT3…INT0) и EICRB (INT7…INT4). Если внешнее
прерывание разрешено и настроено на срабатывание при низком уровне сиг-
нала, то прерывание будет инициализироваться постоянно, пока на выводе
будет оставаться низкий логический уровень.

15
На рисунке Л.1.2 приведено графическое представление регистра управ-
ления внешними прерываниями – EICRA.
Бит 7 6 5 4 3 2 1 0

ISC31 ISC30 ISC21 ISC20 ISC11 ISC10 ISC01 ISC00 EICRA

Чт./Зап. Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З

Нач. зн. 0 0 0 0 0 0 0 0

Рис. Л.1.2. Регистр управления внешними прерываниями – EICRA

Дубли разрядов ISC0n, ISC1n, ISC2n и ISC3n данного регистра, являют-


ся условиями генерации внешнего прерывания 3 – 0. Последние внешние
прерывания активизируются через внешние выводы INT3…INT0. В таблице
Л.1.1 приведено соответствие задания уровня или фронта управляющего сиг-
нала для активации прерывания в зависимости от значения битов регистра
EICRA.
Таблица Л.1.1. Задание условий генерации запроса на прерывание
ISCn1 ISCn0 Описание
0 0 Низкий уровень на INTn генерирует запрос
0 1 Зарезервировано
1 0 Падающий фронт на INTn генерирует запрос
1 1 Нарастающий фронт на INTn генерирует запрос
После разрешения прерывания по уровню, оно будет генерироваться не-
прерывно до тех пор, пока на входе присутствует низкий уровень. На рисун-
ке Л.1.3 приведено графическое представление регистра управления внеш-
ними прерываниями – EICRB.
Бит 7 6 5 4 3 2 1 0

ISC71 ISC70 ISC61 ISC61 ISC51 ISC50 ISC41 ISC40 EICRB

Чт./Зап. Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З

Нач. зн. 0 0 0 0 0 0 0 0

Рис. Л.1.3. Регистр управления внешними прерываниями – EICRB

Дубли разрядов ISC4n, ISC5n, ISC6n и ISC7n данного регистра, являют-


ся условиями генерации внешнего прерывания 7 – 4. Последние внешние
прерывания активизируются через внешние выводы INT7…INT4. В таблице

16
2.1.2 приведено соответствие задания уровня или фронта для активации пре-
рывания в зависимости от значения битов регистра EICRB.
Таблица 2.1.2. Задание условий генерации запроса на прерывание
ISCn1 ISCn0 Описание
0 0 Низкий уровень на INTn генерирует запрос
0 1 Любое изменение логического состояния на INTn генерирует запрос
Падающий фронт, выявленный по двум выборкам на INTn, генерирует
1 0
запрос
Нарастающий фронт, выявленный по двум выборкам на INTn, генери-
1 1
рует запрос
Как правило, из всех потенциально возможных источников прерывания
используются только те, которые необходимы для реализации алгоритма ре-
шения прикладной задачи. Поэтому в МК Atmega128A имеется возможность
программного запрета (маскирования) прерываний от конкретного источника
прерывания в том случае, когда их обработка по каким либо причинам не
требуется. Прерывания от каждого из указанных выше источников могут
быть независимо разрешены или запрещены с использованием специального
регистра EIMSK, структура которого приведена на рис. Л.1.4.
Бит 7 6 5 4 3 2 1 0

INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0 EIMSK

Чт./Зап. Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З

Нач. зн. 0 0 0 0 0 0 0 0

Рис. Л.1.4. Регистр управления внешними прерываниями – EIMSK

Если бит INT7…INT0 регистра EIMSK записать логическую единицу, то


работа прерываний по данному выводу разрешается. Биты выбора условия
генерации прерывания в регистрах управления внешними прерываниями
EICRA и EICRB определяют, по какому условию генерируется прерывание
Флаги внешних прерываний записываются в регистре EIFR.
Если фронт, срез или изменение логического состояния на INT7…INT0
вызывает прерывание, то соответствующий флаг INTF7…INTF0 регистра
EIFR принимает состояние логической единицы. В случае настройки на пре-
рывание по низкому уровню, соответствующий флаг из регистра EIFR всегда
сброшен. Флаг сбрасывается аппаратно при переходе к процедуре обработки

17
прерывания. Альтернативно, флаг может быть сброшен программно путём
записи логической единицы в соответствующий бит.
Для установки битов регистров микроконтроллера можно использовать
имена самих битов соответствующих регистров. Например, для установки
битов ISC20 и ISC21 в регистре EICRA, можно использовать макросы из
mega128.h:
EICRA |= (1 << ISC20) | (1 << ISC21);
Или с использованием введённых выше макросов:
EICRA |= _BV(ISC20) | _BV(ISC21);
Устройство механического энкодера. Механический энкодер предна-
значен для ввода информации (например, для плавного изменения парамет-
ров), как более надежная и удобная замена потенциометру. В отличие от по-
тенциометра энкодер не имеет ограничения угла поворота.
Схема подключения энкодера к контроллеру приведена на рисунке
Л.1.5.

Рис. Л.1.5. Схема включения механического энкодера

Принцип работы энкодера представлен на рисунке Л.1.6. При вращении


энкодера на его выходах A и B (PD0(INT0) и PD1(INT1) контроллера) фор-
мируются импульсы. Если вращать энкодер вправо, то импульс А будет не-
18
значительно опережать импульс В, если вращать влево, то - наоборот. Таким
образом, считая импульсы на любом из выходов можно определить на какой
угол повернули энкодер, а по последовательности выходов можно опреде-
лить направление вращения.

Рис. Л.1.6. Принцип работы механического энкодера

Для определения угла поворота энкодера удобно использовать одно


внешнее прерывание. В этом случае необходимо в обработчике прерывания
по изменению уровня на одном из выходов энкодера проверять второй выход
энкодера и по его значению увеличивать или уменьшать переменную, хра-
нящую текущий угол поворота. В нашем случае задача усложняется ввиду
того что внешние прерывания 0 и 1 невозможно настроить на изменение по
любому изменению уровня, поэтому в самом обработчике прерывания необ-
ходимо определять текущее состояние ножки и настраивать прерывание на
срабатывание по изменению состояния на противоположное, например, если
на ножке прерывания высокий сигнал, то в обработчике его необходимо пе-
ренастроить на срабатывание по срезу. Пример процедуры обработчика пре-
рывания представлен ниже.
interrupt [EXT_INT0] void int0Isr(void)
{
// Если прерывание по фронту
if(BIT_IS_SET(PIND, 0))
{
// Настраиваем прерывание на срез
19
EICRA = _BV(ISC01);
// Если на второй ножке высокий уровень
if(BIT_IS_SET(PIND, 1))
{
angle++;
}
else
{
angle--;
}
}
else
{
// Если прерывание по срезу
// Настраиваем прерывание на фронт
EICRA = _BV(ISC01) | _BV(ISC00);
// Если на второй ножке высокий уровень
if(BIT_IS_SET(PIND, 1))
{
angle--;
}
else
{
angle++;
}
}
}
где angle - это глобальная переменная типа unsigned char, хранящая те-
кущий угол поворота энкодера.
Задание на лабораторную работу. Написать программу вывода угла
поворота энкодера на семисегментные индикаторы, используя внешнее пре-
рывание №1 для определения угла поворота энкодера. Для работы с семисег-
ментными индикаторами можно использовать следующие функции:
// Массив кодов цифр
const unsigned char segments[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D,0x7D, 0x07, 0x7F, 0x6F};

unsigned char Digit (unsigned int d, unsigned char m){


//[]-----------------------------------------------------[]
//| Назначение: выделение цифр из разрядов пятиразрядного |
//| десятичного положительного числа |
//| Входные параметры: |
//| d - целое десятичное положительное число |
//| m - номер разряда (от 1 до 5, слева направо) |
//| Функция возвращает значение цифры в разряде m числа d |
//[]-----------------------------------------------------[]
unsigned char i = 5, a;
while(i){ // цикл по разрядам числа

20
a = d%10; // выделяем очередной разряд
if(i-- == m) break; // выделен заданный разряд - уходим
d /= 10; // уменьшаем число в 10 раз
}
return(a);
}
Схема подключения семисегментных индикаторов представлена на рис.
Л.1.7.

Рис. Л.1.7. Схема подключения семисегментных индикаторов


Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке Cи с обязательными комментариями.
 Выводы.

21
Лабораторная работа 2. Работа с трёхцветным светодиодом
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.2.1.

Рис. Л.2.1. Состояние тумблеров конфигурации стенда для работы 1

Л.2.1. Основные сведения


Описание таймер-счетчиков. Таймеры-счётчики предназначены для
точного задания временных интервалов, генерации прямоугольных импуль-
сов и измерения временных характеристик импульсных сигналов.
Микроконтроллер ATmega128A имеет четыре таймера-счётчика, два 8-
ми битных (Таймеры №0 и №2) и два 16-ти битных (Таймеры №1 и №3). Ка-
ждый из таймеров имеет счётный регистр TCNTX (где X – номер таймера),
соответствующего размера, значение в котором автоматически увеличивает-
ся с определённой, заранее заданной скоростью. Причём это увеличение про-
исходит не зависимо от работы основной программы. Регистр 8-и битного
таймера может хранить число из диапазона 0-255, а 16-и битного из диапазо-
на 0-65535. При переполнении регистра его значение становиться равным
нулю, а также генерируется запрос на прерывание по переполнению, в виде
установки флага. Таймер также может генерировать запрос на прерывание по
совпадению значения его счётного регистра с заранее заданным числом, хра-
нимым в регистре сравнения OCRX, 16-и битные таймеры имеют три незави-
симых регистра сравнения (OCRXA, OCRXB, OCRXC, где X – номер тайме-
ра).
Каждый таймер имеет встроенный предделитель. Предделитель делит
тактовую частоту микроконтроллера (в нашем случае )
для получения тактовой частоты таймера.
В данной лабораторной работе мы рассмотрим режим генерации быст-
рого ШИМ-сигнала с фиксированной частотой 16-и битного таймера.
В данном режиме значение счётного регистра TCNTX возрастает от ну-
ля до определённого фиксированного значения, после чего резко сбрасывает-
ся обратно на ноль. В момент совпадения значения регистра TCNTX со зна-
22
чением, хранимым в регистре OCRX, а также в момент сброса таймера про-
исходит изменение выходного напряжения на ножке OCX микроконтролле-
ра.
Регистры 16-ти разрядных таймеров. На рисунке Л.2.2 приведены би-
ты регистра управления таймером-счётчиком 1 TCCR1A. На рисунке Л.2.3
приведены биты регистра A управления таймером-счётчиком 3 TCCR3A.
Бит 7 6 5 4 3 2 1 0

COM1 COM1 COM1 COM1 COM1 COM1 WGM WGM TCCR


A1 A0 B1 B0 C1 C0 11 10 1A

Чт./Зап Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З

Нач.
0 0 0 0 0 0 0 0
зн.

Рис. Л.2.2. Регистр управления таймером-счётчиком 1 TCCR1A

Бит 7 6 5 4 3 2 1 0

COM3 COM3 COM3 COM3 COM3 COM3 WGM WGM TCCR


A1 A0 B1 B0 C1 C0 31 30 3A

Чт./Зап Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З

Нач.
0 0 0 0 0 0 0 0
зн.

Рис. Л.2.3. Регистр управления таймером-счётчиком 3 TCCR3A

Разряды 7 и 6 - COMnA1:0 (Режим формирования выходного сигнала


канала A), 5 и 4 - COMnB1:0 (Режим формирования выходного сигнала кана-
ла B), 3 и 2 - COMnС1:0 (Режим формирования выходного сигнала канала С)
влияют на работу выводов OCnA, OCnB и OCnC, соответственно.
Если один или оба бита COMnA1:0 равны единице, то вывод OCnA пе-
реходит к выполнению альтернативной функции, запрещая его работу как
обычного порта ввода/вывода. Аналогичные изменения происходят с выво-
дами OCnB и OCnC во время записи единицы в один из битов COMnB1:0 и
COMnC1:0, соответственно. Однако необходимо учитывать, что остаётся
влияние на работу данных выводов со стороны регистра направления данных
(DDR) и в соответствующих разрядах этого регистра должно быть задано
выходное направление для выводов OCnA, OCnB или OCnC.
В таблице Л.2.1 показано назначение бит COMnx1:0.
23
Таблица Л.2.1. Режимы формирования выходного сигнала

COMnA1 COMnA0
COMnB1 COMnB0 Описание
COMnC1 COMnC0
0 0 Нормальная работа порта, сигналы OCnX отключены
0 1 Инвертирование OCnX при совпадении
1 0 Сброс OCnX при совпадении (установка 0)
1 1 Установка OCnX при совпадении (установка 1)
Разряды 1 и 0 - WGMn1:0 (Режим работы таймера счётчика) - в сочета-
нии с битами WGMn3:2 из регистра TCCRnB - определяют алгоритм счёта,
источник для задания вершины счёта и тип генерируемой формы сигнала.
Режимы работы таймера счётчика в зависимости от значения битов регистров
приведено в таблице Л.2.2.
Таблица Л.2.2. Режимы работы таймера-счётчика
(PWMn1)

(PWMn0)
WGMn3

WGMn2

WGMn1

WGMn0
(CTCn)

Верхний
Режим работы таймера счётчика
предел

0 0 0 0 Нормальный 0xFFFF
0 0 0 1 8-ми разр. ШИМ с ФК 0x00FF
0 0 1 0 9-ти разр. ШИМ с ФК 0x01FF
0 0 1 1 10-ти разр. ШИМ с ФК 0x03FF
0 1 0 0 Сброс по совпадению (CTC) OCRnA
0 1 0 1 8-ми разр. быстрая ШИМ 0x00FF
0 1 1 0 9-ти разр. быстрая ШИМ 0x01FF
0 1 1 1 10-ти разр. быстрая ШИМ 0x03FF
1 0 0 0 ШИМ ФЧК ICRn
1 0 0 1 ШИМ ФЧК OCRnA
1 0 1 0 ШИМ ФК ICRn
1 0 1 1 ШИМ ФК OCRnA
1 1 0 0 CTC ICRn
1 1 0 1 Резерв -
1 1 1 0 Быстрая ШИМ ICRn
1 1 1 1 Быстрая ШИМ OCRnA
На рисунке Л.2.4 приведён регистр управления B таймером-счётчиком 1
TCCR1B. На рисунке Л.2.5 приведены биты регистра B управления тайме-
ром-счётчиком 3 TCCR3B.

24
Бит 7 6 5 4 3 2 1 0

ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10 TCCR1B

Чт./Зап. Ч/З Ч/З Ч Ч/З Ч/З Ч/З Ч/З Ч/З

Нач.
0 0 0 0 0 0 0 0
зн.
Рис. Л.2.4. Регистр управления B таймером-счётчиком 1

Бит 7 6 5 4 3 2 1 0

ICNC3 ICES3 – WGM33 WGM32 CS32 CS31 CS30 TCCR3B

Чт./Зап. Ч/З Ч/З Ч Ч/З Ч/З Ч/З Ч/З Ч/З

Нач.
0 0 0 0 0 0 0 0
зн.

Рис. Л.2.5. Регистр управления B таймером-счётчиком 3

Разряды 2, 1 и 0 - CSn2:0 (Выбор тактового источника) позволяют вы-


брать тактовый источник для соответствующего таймера-счётчика. Соотно-
шения значений разрядов и тактовой частоты таймера представлены в табли-
це Л.2.3.
Таблица Л.2.3. Предделители таймера

CSn2 CSn1 CSn0 Описание

0 0 0 Таймер остановлен
0 0 1 Без предделителя
0 1 0 С предделителем
0 1 1 С предделителем
1 0 0 С предделителем
1 0 1 С предделителем
Описание ШИМ-Сигнала. ШИМ (в англ. - Pulse Width Modulation
(PWM)) - это способ кодирования аналогового сигнала путём изменения ши-
рины (длительности) прямоугольных импульсов несущей частоты. Скваж-
ность импульсов - это отношение длительности импульса t1 к периоду сигна-
ла T. Например, на рисунке Л.2.6 приведён сигнал, скважность которого рав-
на 80%. Соответственно, отношение .

25
Рис. Л.2.6. Бинарный сигнал со скважностью 0.8

Микроконтроллер может генерировать ШИМ-сигнал с помощью встро-


енных таймеров-счётчиков, выдавая на выход один уровень, пока значение
регистра таймера TCNTx меньше значения хранимого в регистре OCRx, и
другой уровень, если - больше.
Схема включения RGB светодиода с подписью соответствующих кана-
лов ШИМ таймера 3 приведена на рисунке Л.2.7.

Рис. Л.2.7. Схема включения RGB светодиода

Пример зажигания синего светодиода с постоянной яркостью представ-


лен ниже:
void main(void)
{
// Инициализация портов ввода/вывода
DDRE = _BV(3) | _BV(4) | _BV(5);
26
// Инициализация таймера №3
// 8-и битная ШИМ
TCCR3A = _BV(COM3A1) | _BV(COM3B1) | _BV(COM3C1) | _BV(WGM30);
TCCR3B = _BV(WGM32) | _BV(CS30);
OCR3AH = 0;
OCR3AL = 0x40;
while(1);
}
Задание на лабораторную работу. Написать программу управления
цветом и яркостью светодиода с помощью механического энкодера. В табли-
це заданий 0....255 означает, что при вращении энкодера почасовой стрелке
яркость данного цвета увеличивается, а в левую – уменьшается.

Таблица Л.2.4. Варианты заданий на лабораторную работу

Описание исполняемого цикла: плавно изменять цвета


№№
Вар. Красный цвет Синий цвет Зелёный цвет

1 0...255 0 0

2 0 0...255 0

3 0 0 255...0

4 0...255 0...255 0...255

5 0...255 0...255 0

6 0 255...0 0...255

7 255...0 0 255...0

8 255...0 0 0...255

9 0...255 0 0...255

10 0 255...0 255...0
Содержание отчета.
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке C с обязательными комментариями.
 Выводы.

27
Лабораторная работа 3. Работа с аналого-цифровым преобразователем
Цель работы. Освоение работы с аналого-цифровым преобразователем
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.3.1.

Рис. Л.3.1. Состояние тумблеров конфигурации стенда для работы 3

Основные сведения. Аналого-цифровой преобразователь (АЦП) —


устройство, преобразующее входной аналоговый сигнал в дискретный код
(цифровой сигнал). АЦП имеет ряд характеристик:
Разрешение АЦП — минимальное изменение величины аналогового
сигнала, которое может быть преобразовано данным АЦП — связано с его
разрядностью. В случае единичного измерения без учёта шумов разрешение
напрямую определяется разрядностью АЦП.
Разрядность АЦП характеризует количество дискретных значений, ко-
торые преобразователь может выдать на выходе. В двоичных АЦП измеряет-
ся в битах. Например, двоичный 8-ми разрядный АЦП, способен выдать 256
дискретных значений (0…255).
Частота дискретизации характеризует частоту выборки цифровых зна-
чений из непрерывного аналогового сигнала.
АЦП в микроконтроллере ATmega128A. ATmega128A имеет встроен-
ный 10-и разрядный АЦП последовательного приближения. К АЦП подклю-
чается 8-и канальный аналоговый мультиплексор, позволяющий производить
измерения напряжения с 8-и однополярных каналов, а также с 16-и диффе-
ренциальных каналов.
АЦП имеет отдельную ножку питания AVCC, напряжение на которой
недолжно отличаться от напряжения питания микроконтроллера больше чем
на 0.3 В. В качестве источника опорного напряжения АЦП может использо-
ваться либо напряжение с ножки AVCC, либо внешний источник опорного
напряжения, подключённый к ножке AREF, либо встроенный источник
опорного напряжения на 2.56 В. АЦП преобразует аналоговое напряжение в
10-и битный код, минимальное значение которого соответствует уровню

28
GND, а максимальное уровню используемого опорного напряжения минус 1
разряд.
АЦП включается при записи логической единицы в бит ADEN (ADC
Enable) в регистре ADCSRA. Для запуска преобразования необходимо запи-
сать логическую единицу в бит ADSC (ADC Start Conversion) регистра
ADCSRA. После выполнения преобразования блок АЦП установит флаг за-
проса прерывания ADIF (ADC Interrupt Flag) в регистре ADCSRA, сбросить
который можно записью в него логической единицы. Результат преобразова-
ния записывается в два регистра ADCH и ADCL, в которых хранятся старшая
и младшая части результата соответственно.
Регистры АЦП Микроконтроллера. На рисунке Л.3.2 приведён ре-
гистр ADMUX
Бит 7 6 5 4 3 2 1 0

REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ADMUX

Чт./Зап. Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З

Нач. зн. 0 0 0 0 0 0 0 0

Рис. Л.3.2. Регистр ADMUX

Разряды REFS1:0 определяют используемое опорное напряжение АЦП.


Соотношение значений этих разрядов с выбранным опорным напряжением
представлено в таблице Л.3.1.
Таблица Л.3.1. Опорное напряжение АЦП
REFS1 REFS0 Используемое опорное напряжение
0 0 AREF
0 1 AVCC
REFS1 REFS0 Используемое опорное напряжение
1 0 Зарезервировано
1 1 Внутренний ИОН на 2.56 В
Разряд ADLAR (ADC Left Adjust Result) определяет выравнивание ре-
зультата преобразования в регистрах ADCH и ADCL. В случае записи логи-
ческого нуля в бит ADLAR, используется правое выравнивание, представ-
ленное на рис. Л.3.3.

29
Бит 15 14 13 12 11 10 9 8

– – – – – – ADC9 ADC8 ADCH

ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADCL

7 6 5 4 3 2 1 0

Рис. Л.3.3. Правое выравнивание

А в случае записи логической единицы в бит ADLAR, используется ле-


вое выравнивание, представленное на рис. Л.3.4.
Бит 15 14 13 12 11 10 9 8

ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH

ADC1 ADC0 ADCL

7 6 5 4 3 2 1 0

Рис. Л.3.4. Левое выравнивание

Левое выравнивание удобно в том случае, когда достаточно 8-и битного


результата, который можно получить, просто прочитав регистр ADCH. Для
10-и битного результата удобнее использовать правое выравнивание. В этом
случае необходимо сначала прочитать регистр ADCL, а затем регистр ADCH.
Разряды MUX4:0 выбирают канал АЦП. Рассмотрим их комбинации
только для однополярных каналов. Они представлены в таблице Л.3.2.
Таблица Л.3.2. Выбор каналов АЦП
MUX4:0 Используемый однополярный канал
0000 ADC0
0001 ADC1
0010 ADC2
0011 ADC3
0100 ADC4
0101 ADC5
0110 ADC6
0111 ADC7
Нетрудно заметить, что в случае однополярных каналов комбинация би-
тов MUX соответствует двоичному коду номера канала.
30
На рис. Л.3.5. представлен регистр ADCSRA
Бит 7 6 5 4 3 2 1 0

ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA

Чт./Зап. Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З Ч/З

Нач. зн. 0 0 0 0 0 0 0 0

Рис. Л.3.5. Регистр ADCSRA

Разряд ADEN. В случае записи в него логической единицы происходит


включение модуля АЦП.
Разряд ADSC. В случае записи в него логической единицы начинается
процесс преобразования аналогового сигнала в цифровой код.
Разряд ADFR. В случае записи в него логической единицы, АЦП пере-
ходит в режим автоматического перезапуска. В этом режиме АЦП после за-
вершения одного преобразования автоматически запускает следующее.
Разряд ADIF - это флаг прерывания АЦП. Данный флаг устанавливается
после завершения преобразования АЦП и обновления регистров данных. Ес-
ли разрешены прерывание, то происходит вызов обработчика прерывания
АЦП. Для сброса этого флага необходимо записать в него логическую еди-
ницу.
Разряд ADIE. Запись логической единицы в этот бит разрешает преры-
вания от АЦП.
Разряды ADPS2:0 определяют частоту тактирования модуля АЦП, опре-
деляющую частоту дискретизации АЦП. Соотношение между значениями
разрядов ADPS2:0 и тактовой частотой АЦП представлено в таблице Л.3.3.
Таблица Л.3.3. Частота тактирования АЦП
ADPS2 ADPS1 ADPS0 Частота тактирования модуля АЦП
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Ниже представлен пример функции запуска процесса преобразования
АЦП и чтения 8-и битного результата.
#define MUX (_BV(REFS0) | _BV(ADLAR))
31
unsigned char readAdc(unsigned char channel)
{
// Выбор канала
ADMUX = MUX | channel;
// Запуск преобразования
ADCSRA |= _BV(ADSC);
// Ожидание завершения преобразования
while(BIT_IS_CLEAR(ADCSRA, ADIF));
// Сброс флага прерывания АЦП
ADCSRA |= _BV(ADIF);

return ADCH;
}
Задание на лабораторную работу. Написать программу управления
цветом и яркостью светодиода с помощью ползункового потенциометра,
подключённого к 3-му каналу АЦП, используя 10-и битный результат преоб-
разования.

Таблица Л.3.4. Варианты заданий на лабораторную работу

Описание исполняемого цикла: плавно изменять цвета


№№
Вар.
Красный цвет Синий цвет Зелёный цвет

1 0...1023 0 0

2 0 0... 1023 0

3 0 0 1023...0

4 0... 1023 0... 1023 0... 1023

5 0... 1023 0... 1023 0

6 0 1023...0 0... 1023

7 1023...0 0 1023...0

8 1023...0 0 0... 1023

9 0... 1023 0 0... 1023

10 0 1023...0 1023...0

32
Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке C с обязательными комментариями.
 Выводы.

Лабораторная работа 4. Работа с сервомашинками


Цель работы. Освоение работы с сервомашинками.
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.4.1.

Рис. Л.4.1. Состояние тумблеров конфигурации стенда для работы 4

Л.4.1 Основные сведения


Сервомашинки или сервоприводы нашли широкое применение в облас-
ти роботостроения и моделизме. Большинство сервомашинок используют три
провода для работы. Первый провод – для питания, обычно 4.8 В или 6 В,
второй – общий провод или – земля и третий – сигнальный провод. Управ-
ляющий сигнал передаёт информацию о требуемом положении выходного
вала. Вал связан с потенциометром, который определяет его положение.
Контроллер в сервоприводе по сопротивлению потенциометра и значению
управляющего сигнала определяет, в какую сторону требуется вращать ро-
тор, чтобы получить нужное положение выходного вала. На рисунке Л.4.2
приведена схема внутреннего устройства сервомашинки.
Управляющий сигнал представляет собой импульсы переменной шири-
ны постоянной частоты равной 50 Гц. Положение сервомашинки определяет-
ся шириной импульса. Для типичного сервопривода, используемого в радио-
управляемых моделях, длительность импульса в 1.5 мс означает, что серво-
привод должен занять среднее положение. Увеличение или уменьшение дли-

33
ны импульса заставит сервопривод повернуться по часовой или против часо-
вой стрелке, соответственно.

Рис. Л.4.2. Устройство сервомашинки


Таки образом, для управления сервоприводом потребуется формировать
ШИМ с частотой 50 Гц. При этом для одного крайнего положения длитель-
ность импульса должна составлять 1 мс, а для другого положения – 2 мс. На
рисунке Л.4.3 приведено графическое представление управляющего сигнала.

Рис. Л.4.3. Временная диаграмма управляющего сигнала


Крайним положениям сервомашинки соответствуют углы +45о и -45о от-
носительно нулевого положения.
На рисунке Л.4.4 приведена схема подключения сервомашинок. На ри-
сунке Л.4.4 условное обозначение Servo 1 соответствует большому суставу
«серворуки», а Servo 2 – малому. Они подключены к выводам каналов A и B
таймера №1 соответственно.

34
Рис. Л.4.4. Схема подключения сервомашинок
Для формирования ШИМ-сигнала с частотой 50 Гц воспользуемся ре-
жимом быстрой ШИМ с переменным верхним пределом, задаваемым с по-
мощью регистра ICRx. Для того чтобы рассчитать требуемое значение для
регистра ICRx нужно разделить частоту тактирования таймера на необходи-
мую частоту. В случае работы таймера №1 без предделителя мы получим
требуемое значения для регистра ICR1 = 11059200 / 50 = 221184, что превы-
шает максимально возможное значение для 16-и битного регистра ICR1 рав-
ное 65535. Поэтому уменьшим частоту тактирования таймера с помощью
предделителя с коэффициентом деления 8. В этом случае требуемое значение
для регистра ICR1 = (11059200 / 8) / 50 = 1382400 / 50 = 27648, что нас пол-
ностью устраивает. Это число соответствует частоте 50 Гц и периоду 20 мс.
Для получения двух значений регистра OCR1n соответствующих крайним
положениям сервомашинок необходимо разделить число из регистра ICR1 на
10 и на 20. В процессе работу менять значение регистра OCR1n в пределах
этих двух значений. Для настройки таймера №1 нужно воспользоваться таб-
лицами из лабораторной работы №2. Рассмотрим пример кода для установки
двух сервомашинок в разные крайние положения:
// Макроопределение значения регистра ICR1
#define ICR_VALUE 1382400 / 50
// Макроопределения значений регистров OCR1A и OCR1B
// Соответствующих крайним положениям
#define MAX_POS ICR_VALUE / 10
#define MIN_POS ICR_VALUE / 20
void main(void)
{
// Инициализация портов ввода/вывода
DDRB |= _BV(5) | _BV(6);
// Инициализация таймера №1
35
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);
TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS11);
// Установка верхнего предела для таймера №1
ICR1 = ICR_VALUE;
// Поворот машинок
OCR1A = MAX_POS;
OCR1B = MIN_POS;
while(1);
}
Задание на лабораторную работу. Написать программу управления
сервомашинкой с помощью ползункового потенциометра.
Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке C с обязательными комментариями.
 Выводы.

Лабораторная работа 5. Работа с ультразвуковым дальномером


Цель работы. Освоение работы с ультразвуковым дальномером.
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.5.1.

Рис. Л.5.1. Состояние тумблеров конфигурации стенда для работы 5

Л.5.1 Основные сведения


Датчик расстояния на основе отражения ультразвуковой волны выпол-
нен в виде самостоятельной платы с питанием от источника +5 В. Его схема
включения представлена на рис. Л.5.2. Для измерения расстояния необходи-
мо подать импульс длиной 10 мкс на вход датчика (6 бит порта PORTE в
нашем случае) и измерить ширину импульса на выходе датчика (7 бит порта
PORTE в нашем случае (INT7)), ширина этого импульса равна времени, за
которое ультразвуковая волна, произведенная датчиком, дошла до препятст-

36
вия, отразилась и попала обратно. Таким образом, зная скорость звука в воз-
духе (340 м/с), можно вычислить расстояние от датчика до объекта.

Рис. Л.5.2. Схема включения ультразвукового датчика расстояния

В нашей схеме выход ультразвукового датчика подключён к ножке


внешних прерываний (INT7), поэтому для расчёта ширины импульсов вос-
пользуемся внешними прерываниями и одним из таймеров. Т.к. нужно ло-
вить как начало импульса (фронт), так и его конец (срез), то удобно настро-
ить внешнее прерывание на любое изменение входного сигнала. Таймер
включается в нормальном режиме. В обработчике прерывания в случае нача-
ла импульса нужно обнулить счётный регистр используемого таймера, а в
случае конца импульса сохранить значение из его счётного регистра. Рас-
смотрим пример функции обработчика внешнего прерывания расчёта шири-
ны импульса с использованием 16-и битного таймера №3:
interrupt [EXT_INT7] void extIntIsr(void)
{
// Если высокий уровень на ножке, то
// это начало импульса
if(BIT_IS_SET(PINE, 7))
{
// Обнуляем счётный регистр таймера №3
TCNT3H = 0;
TCNT3L = 0;
}
else
{
// Если низкий уровень на ножке, то
// это конец импульса
// Сохраняем текущее значение счётного регистра
// таймера №3
impulseWidth = TCNT3L;
impulseWidth += (TCNT3H) << 8;
}
}

37
Доступ к 16-и битным регистрам TCNTn, OCRnA/B/C и ICRn происхо-
дит через 8-и битный регистр временного хранения. Чтение/запись младшего
байта инициирует 16-и разрядную операцию чтения/записи за один такт. По-
этому для того чтобы записать значение в 16-и битный регистр таймера, сна-
чала нужно записать его старшую часть (она записывается в регистр времен-
ного хранения), а потом его младшую часть (в месте с ней запишется и стар-
шая часть из регистра временного хранения). Для того чтобы прочитать зна-
чение из 16-и битного регистра таймера необходимо сначала прочитать его
младшую часть (в этот момент текущее значение старшей части запишется в
регистр временного хранения), а затем старшую.
Задание на лабораторную работу. Написать программу вывода рас-
стояния от ультразвукового дальномера в сантиметрах на семисегментные
индикаторы.
Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке C с обязательными комментариями.
 Выводы.

Лабораторная работа 6. Работа с датчиком температуры по протоколу


I2C
Цель работы. Изучение работы протокола I2C и работы с датчиком
температуры.
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.6.1.

Рис. Л.6.1. Состояние тумблеров конфигурации стенда для работы 6

38
Л.6.1 Основные сведения
Последовательная шина данных I2C. I2C — это последовательная ши-
на данных, использующая две двунаправленные линии связи (SDA и SCL).
Название представляет собой аббревиатуру слов Inter-Integrated Circuit.
I²C использует две двунаправленные линии, подтянутые к напряжению
питания — последовательная линия данных (SDA, от англ. Serial DAta) и по-
следовательная линия тактирования (SCL, от англ. Serial CLock). Классиче-
ская адресация включает 7-битное адресное пространство с 16 зарезервиро-
ванными адресами. Это означает до 112 свободных адресов для подключения
периферии на одну шину.
Процедура обмена начинается с того, что ведущее устройство (чаще все-
го микроконтроллер) формирует состояние СТАРТ: генерирует переход сиг-
нала линии SDA из ВЫСОКОГО состояния в НИЗКОЕ при ВЫСОКОМ
уровне на линии SCL. Этот переход воспринимается всеми устройствами,
подключенными к шине, как признак начала процедуры обмена. После фор-
мирования состояния СТАРТ, ведущий опускает состояние линии SCL в
НИЗКОЕ состояние и выставляет на линию SDA старший бит байта сообще-
ния. После чего опять поднимает состояние линии SCL в ВЫСОКОЕ состоя-
ние, делает небольшую паузу, а затем переводит состояние линии SCL снова
в НИЗКОЕ состояние и высылает на линию SDL следующий бит байта сооб-
щения и т.д. Количество байт в сообщении не ограничено. Спецификация
шины I²C разрешает изменения на линии SDA только при НИЗКОМ уровне
сигнала на линии SCL. Для подтверждения приема байта от ведущего-
передатчика ведомым-приемником в спецификации протокола обмена по
шине I²C вводится специальный бит подтверждения (ACK), выставляемый на
шину SDA после приема 8 бита данных. Процедура обмена завершается тем,
что ведущий формирует состояние СТОП — переход состояния линии SDA
из низкого состояния в ВЫСОКОЕ при ВЫСОКОМ состоянии линии SCL.
Процедура передачи данных представлена на рис. Л.6.2.

Рис. Л.6.2. Процедура передачи данных по протоколу I2C

39
Таким образом, передача 8 бит данных от передатчика к приемнику за-
вершаются дополнительным циклом (формированием 9-го тактового им-
пульса линии SCL), при котором приемник выставляет низкий уровень сиг-
нала на линии SDA, как признак успешного приема байта. В том случае, ко-
гда ведомому необходимо дополнительное время на обработку принятого
бита, он имеет возможность удерживать линию SCL в низком состоянии до
момента готовности к приему следующего бита.
Так как для получения низкого уровня на линии используется замыкание
линии на землю, а для получения высокого уровня используется внешняя
подтяжка к питанию, то для генерации этих уровней используется не регистр
PORTx, а регистр DDRx, который переводит ножку контроллера из состоя-
ния входа (высокого сопротивления) в состояние выхода с низким уровнем.
Датчик температуры DS1631. DS1631 является цифровым датчиком
температуры, работающим в диапазоне температур от -55о С до +125о С и
предоставляющим результат в 9, 10, 11 или 12-битном виде. Данный датчик
может работать в режиме постоянного или единичного измерения. Для на-
стройки параметров датчика, таких как режим работы и разрядность резуль-
тата в датчике есть регистр настройки (CONFIGURATION REGISTER),
имеющий следующую структуру:

Рис. Л.6.3. Структура регистра настройки


Для настройки датчика нас будут интересовать только биты R1, R0 и
1SHOT, остальные при настройке нужно оставить равными нулю.
Разряды R1:0 определяют разрядность предоставляемого результата и
время единичного измерения, соответствие их значений размерности резуль-
тата представлено в таблице Л.6.1.
Таблица Л.6.1. Выбор разрядности результата
R1 R0 Размерность Время измерения
0 0 9 93.75 мс
0 1 10 187.5 мс
1 0 11 375 мс
1 1 12 750 мс
Разряд 1SHOT определяет режим одиночного измерения. Если в этот
бит сброшен, то датчик работает в режиме постоянного измерения.
40
Для работы с датчиком после отправки стартового состояния необходи-
мо отправить байт управления (Control Byte), содержащий адрес датчика.
Структура этого байта представлена на рис. Л.6.4.

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0


1 0 0 1 A2 A1 A0 R/W
Рис. Л.6.4. Байт управления
где A2, A1 и A0 являются адресом датчика, устанавливаемым с помощью
подачи высокого или низкого уровня на его соответствующие выводы, а бит
R/W указывает на то, будет ли следующий байт записан в датчик или прочи-
тан из него.
Для настройки датчика необходимо отправить стартовое состояние, байт
управления с битом записи, команду ACCES_CONFIG, имеющую следую-
щий 16-и ричный код 0xAC, после чего отправить байт с новым значением
регистра настройки и стоповое состояние. Диаграмма передачи данных в
этом случае представлена на рис. Л.6.5.

Рис. Л.6.5. Диаграмма передачи данных при настройке датчика температуры


Для начала измерения температуры необходимо отправить стартовое со-
стояние, байт управления с битом записи, затем команду
START_CONVERT_T, имеющую следующий 16-и ричный код 0x51, после
чего отправить стоповое состояние. Диаграмма передачи данных в этом слу-
чае представлена на рис. Л.6.6.

Рис. Л.6.6. Диаграмма передачи данных для начала измерения температуры

41
Для того чтобы прочитать результат последнего измерения температуры
(2 байта) необходимо отправить стартовое состояние, байт управления с би-
том записи, затем команду READ_TEMPERATURE, имеющую следующий
16-и ричный код 0xAA, после чего повторить отправку стартового состояние,
потом отправить байт управления с битом чтения, и прочитать два байта
подряд, первый из них будет старшая часть, второй младшая, после чего не-
обходимо отправить стоповое состояние. Т.к. в данном случае микрокон-
троллер работает в режиме чтения, то он должен после приёма каждого байта
отправить бит подтверждения, после прочтения старшей части этот бит равен
0, а после прочтения младшей части равен 1. Диаграмма передачи данных в
этом случае представлена на рис. Л.6.7.

Рис. Л.6.7. Диаграмма передачи данных при чтении результата последнего измерения
Для преобразования полученной температуры в градусы Цельсия необ-
ходимо результат разделить на 256.
На лабораторном стенде установлено два датчика температуры, схема их
подключения представлена на рис. Л.6.8.

Рис. Л.6.8. Схема подключения датчиков температуры

42
Как видно из схемы один из датчиков имеет адрес 0b000, а второй
0b111.
Ниже приведён пример работы с датчиками:
// Коды команд
#define START_CONVERT_T 0x51
#define READ_TEMPERATURE 0xAA
#define ACCESS_CONFIG 0xAC
// Биты регистра конфигурации
#define R1 3
#define R0 2
#define SHOT 0

#define W 0
#define R 1

// Запуск измерения температуры


void startConvert(unsigned char address)
{
I2C_Start();
I2C_SendByte(address | W);
I2C_SendByte(START_CONVERT_T);
I2C_Stop();
}

// Функция чтения температуры с датчика


int readTemperature(unsigned char address)
{
int result;
I2C_Start();
I2C_SendByte(address | W);
I2C_SendByte(READ_TEMPERATURE);
I2C_Start();
I2C_SendByte(address | R);
result = I2C_ReadByte(1);
result <<= 8;
result += I2C_ReadByte(1);
I2C_Stop();

return result;
}

// Настройка датчика температуры на одиночное


// измерение и 9-и битный результат
void setDs1631(unsigned char address)
{
I2C_Start();
I2C_SendByte(address | W);
I2C_SendByte(ACCESS_CONFIG);
I2C_SendByte(_BV(SHOT));
I2C_Stop();
43
}
Задание на лабораторную работу. Написать программу вывода темпе-
ратуры с датчика на символьный дисплей, написав следующие функции:
void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(unsigned char data);
unsigned char I2C_ReadByte(unsigned char aсk);
И используя следующие макросы для управления уровнями на шине I2C:
#define SDA 1
#define SCL 0
#define DDRX_I2C DDRG
#define HIGH(pin) (DDRX_I2C &= (~_BV(pin)))
#define LOW(pin) (DDRX_I2C |= _BV(pin))
Для работы с символьным дисплеем можно воспользоваться следующи-
ми функциями:
#define RS 7 // выбор регистра
#define E 6 // строб передачи

void LCD_cmd(unsigned char cmd) {


//[]--------------------------------------------------[]
//| Назначение: запись кодов в регистр команд ЖКИ |
//| Входные параметры: cmd - код команды |
//[]--------------------------------------------------[]
DDRC = 0xFF; // все разряды PORTC на выход
DDRD |= ((1<<E)|(1<<RS));// разряды PORTD на выход
PORTD &= ~(1<<RS); // выбор регистра команд RS=0
PORTC = cmd; // записать команду в порт PORTC
PORTD |= (1<<E); // \ сформировать на
delay_us(5); // | выводе E строб 1-0
PORTD &= ~(1<<E); // / передачи команды
delay_ms(10); // задержка для завершения записи
}

void LCD_data(unsigned char data) {


//[]--------------------------------------------------[]
//| Назначение: запись кодов в регистр команд ЖКИ |
//| Входные параметры: cmd - код команды |
//[]--------------------------------------------------[]
DDRC = 0xFF; // все разряды PORTC на выход
DDRD |= ((1<<E)|(1<<RS));// разряды PORTD на выход
PORTD |= (1<<RS); // выбор регистра данных RS=1
PORTC = data; // записать команду в порт PORTC
PORTD |= (1<<E); // \ сформировать на
delay_us(5); // | выводе E строб 1-0
PORTD &= ~(1<<E); // / передачи команды
delay_ms(10); // задержка для завершения записи
}

void LCD_init(void) {
44
//[]--------------------------------------------------[]
//| Назначение: инициализация ЖКИ |
//[]--------------------------------------------------[]
DDRC = 0xFF; // все разряды PORTC на выход
DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход
delay_ms (100); // задержка для установления
// напряжения питания
LCD_cmd(0x30); // \ вывод
LCD_cmd(0x30); // | трех
LCD_cmd(0x30); // / команд 0x30
LCD_cmd(0x38); // 8 разр.шина, 2 строки, 5 ? 7 точек
LCD_cmd(0x0C); // включить ЖКИ и курсор, без мерцания
LCD_cmd(0x06); // инкремент курсора, без сдвига экрана
LCD_cmd(0x01); // очистить экран, курсор в начало
}
Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке C с обязательными комментариями.
 Выводы.

Лабораторная работа 7. Работа с внешним АЦП по протоколу SPI


Цель работы. Изучение работы протокола SPI и работы с внешним
АЦП AD7798.
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.7.1.

Рис. Л.7.1. Состояние тумблеров конфигурации стенда для работы 7

Л.7.1 Основные сведения


Последовательный интерфейс SPI. SPI (от англ. Serial Peripheral
Interface, SPI bus — последовательный периферийный интерфейс, шина SPI)
— последовательный синхронный стандарт передачи данных в режиме пол-
45
ного дуплекса (т.е. может в один и тот же момент времени и передавать и по-
лучать данные), предназначенный для обеспечения простого и недорогого
сопряжения микроконтроллеров и периферии. SPI также иногда называют
четырёхпроводным(от англ. four-wire) интерфейсом. SPI является синхрон-
ным интерфейсом, в котором любая передача синхронизирована с общим
тактовым сигналом, генерируемым ведущим устройством (микроконтролле-
ром). Принимающая (ведомая) периферия синхронизирует получение бито-
вой последовательности с тактовым сигналом. К одному последовательному
периферийному интерфейсу ведущего устройства-микросхемы может при-
соединяться несколько микросхем. Ведущее устройство выбирает ведомое
для передачи, активируя сигнал «выбор кристалла» (от англ. chip select) на
ведомой микросхеме. Периферия, не выбранная микроконтроллером, не при-
нимает участия в передаче по SPI. В SPI используются четыре цифровых
сигнала:
MOSI — выход ведущего, вход ведомого (от англ. Master Out Slave In).
Служит для передачи данных от ведущего устройства ведомому.
MISO — вход ведущего, выход ведомого (от англ. Master In Slave Out).
Служит для передачи данных от ведомого устройства ведущему.
SCLK — последовательный тактовый сигнал (от англ. Serial Clock).
Служит для передачи тактового сигнала для ведомых устройств.
CS или SS — выбор микросхемы, выбор ведомого (от англ. Chip Select,
Slave Select).
Передача осуществляется пакетами. Длина пакета как правило составля-
ет 1 байт (8 бит). Ведущее устройство инициирует цикл связи установкой
низкого уровня на выводе выбора подчиненного устройства (CS) того уст-
ройства, с которой необходимо установить соединение. Подлежащие переда-
че данные ведущее и ведомое устройства помещают в сдвиговые регистры.
После этого, ведущее устройство начинает генерировать импульсы синхро-
низации на линии SCK, что приводит к взаимному обмену данными. Переда-
ча данных осуществляется бит за битом от ведущего по линии MOSI и от ве-
домого по линии MISO. Передача осуществляется как правило начиная со
старших битов, но некоторые производители допускают изменение порядка
передачи битов программными методами. Механизм передачи по протоколу
SPI представлен на рис. Л.7.2.

46
Рис. Л.7.2. Механизм передачи по протоколу SPI
Внешнее АЦП AD7798. AD7798 представляет собой 16 битный АЦП,
подключаемый к микроконтроллеру по протоколу SPI. К входам АЦП под-
ключается тензодатчик, преобразующий приложенную к нему механическую
силу в аналоговый сигнал, используемый в качестве измерителя веса. АЦП
может работать как в режиме одиночного измерения, так и в режиме посто-
янного измерения, в котором новое измерение запускается сразу после за-
вершения предыдущего. Схема подключения АЦП представлена на рис.
Л.7.3.

Рис. Л.7.3. Схема подключения АЦП к микроконтроллеру


Для сброса АЦП необходимо 4 раза послать байт 0xFF, для этого можно
использовать следующую функцию:
void resetAD7798()
{
unsigned char i;

47
for(i = 0; i < 4; ++i)
{
SPI_Write(0xFF);
}
}
Для удобного программирования АЦП можно объявить все нужные ре-
гистры и разряды в виде макрасов:
#define CREAD 2
#define RS0 3
#define RS1 4
#define RW 6

// Mode Register

#define FS0 0
#define FS1 1
#define FS2 2
#define FS3 3

#define MD2 7

// Configuration Register

#define BUF 4

// 2nd part

#define G1 1
#define G2 2
#define UB 4

// Registers

#define MODE_REG _BV(RS0)


#define CONFIG_REG _BV(RS1)
Для настройки АЦП в режим постоянного измерения нужного нам кана-
ла можно использовать следующую функцию:
void setAd7798()
{
SPI_Write(CONFIG_REG);
delay_us(90);
SPI_Write(_BV(G1) | _BV(G2) | _BV(UB));
SPI_Write(_BV(BUF));
delay_us(90);

SPI_Write(MODE_REG);
delay_us(90);
SPI_Write(_BV(MD2));
SPI_Write(_BV(FS0) | _BV(FS1) | _BV(FS2) | _BV(FS3));

48
delay_us(90);

SPI_Write(MODE_REG);
delay_us(90);
SPI_Write(0x00);
SPI_Write(_BV(FS0) | _BV(FS1) | _BV(FS2) | _BV(FS3));
delay_us(90);
SPI_Write(_BV(RW) | _BV(RS1) | _BV(RS0) | _BV(CREAD));
}
Для чтения результата измерения можно использовать следующую
функцию:
unsigned long readAD7798()
{
unsigned char byte1, byte2, byte3;
unsigned long result;
while(BIT_IS_SET(PING, MISO));
byte1 = SPI_Read();
byte2 = SPI_Read();
byte3 = SPI_Read();
result = ((unsigned long)byte1 << 15) + ((unsigned
long)byte2 << 7) +
(unsigned long)byte3;
return result;
}
2.7.2 Задание на лабораторную работу
Написать программу, которая бы выводила на семисегментные индика-
торы старшие 5 бит результата измерения АЦП, а в случае если они окажутся
больше 300 подать звуковой сигнал на динамик с помощью следующих
функций:
#define TIMER_FREQ (_BV(CS02) | _BV(CS01))

void initTimer()
{
TCCR0 = _BV(WGM01) | _BV(WGM00) | _BV(COM01);
DDRB |= _BV(4);
OCR0 = 128;
}

void startAlarm()
{
TCCR0 |= TIMER_FREQ;
}

void stopAlarm()
{
TCCR0 &= ~TIMER_FREQ;
}

49
Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке C с обязательными комментариями.
 Выводы.

Лабораторная работа 8. Управление левитацией постоянного магнита в


поле электромагнита
Цель работы. Освоение реализации системы автоматического управле-
ния неустойчивым объектом.
Введение. Перед выполнением работы установите тумблеры конфигу-
рации стенда в состояние, показанное на рис. Л.8.1.

Рис. Л.8.1. Состояние тумблеров конфигурации стенда для работы 8

Л.8.1 Основные сведения


Управление магнитным подвесом является классической задачей управ-
ления неустойчивым объектом. Для управления левитацией постоянного
магнита используется катушка, подключенная к плате управления. Таким об-
разом, можно управлять уровнем напряжения на катушке (ее магнитной си-
лой притяжения) и направлением тока (полярностью магнитного поля), ис-
пользуя порты PB5(PWM1 - ШИМ) и PG3(DIR1 - направление тока через ка-
тушку). Однако магнитная сила катушки на постоянный магнит зависит от
квадрата расстояния между ними и необходима система управления с обрат-
ной связью по положению магнита для сохранение этого положения посто-
янным. Положение постоянного магнита измеряется датчиком магнитного
поля находящимся под катушкой. Данный датчик выдаёт напряжение в диа-
пазоне от 0 до 5 вольт и подключён к первому каналу встроенного в микро-
контроллер АЦП. Магнит помещается между датчиком и катушкой. Датчик
определяет силу магнитного поля постоянного магнита. Простейшая система

50
управления представляет собой ПД-регулятор с обратной связью по положе-
нию постоянного магнита.
Схема включения магнитного подвеса представлена на рисунке Л.8.2.

Рис. Л.8.2. Схема включения магнитного подвеса

Для примера рассмотрим программу с П-регулятором, которая не справ-


ляется с задачей поддержания магнита:
#include <mega128a.h>
#include <delay.h>

#define _BV(b) (1 << (b))


#define MUX (_BV(REFS0))
#define BIT_IS_CLEAR(Reg, b) ((Reg & _BV(b)) == 0)

unsigned int readAdc(unsigned char channel)


{
ADMUX = MUX | channel;
delay_us(10);
ADCSRA |= _BV(ADSC);
while(BIT_IS_CLEAR(ADCSRA, ADIF));
ADCSRA |= _BV(ADIF);

return ADCW;
}

void main(void)
{
// Инициализация портов ввода/вывода
DDRB = _BV(5);
DDRG = _BV(3);

51
// Инициализация АЦП
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
// Инициализация таймера 1
// Быстрая ШИМ 8 бит
TCCR1A = _BV(COM1A1) | _BV(WGM10);
TCCR1B = _BV(WGM12) | _BV(CS10);
while(1)
{
int field; // Значение с датчика Холла
int ref; // Задание
int error = 0; // Ошибка управления
int control; // Сигнал управления
//управления
// Получение и фильтрация сигнала с датчика
// магнитного поля
field = (readAdc(1) + readAdc(1) +
readAdc(1) + readAdc(1) + readAdc(1)) / 5;
field -= 512;
ref = readAdc(3); // Получение задания с ручки
//потенциомера
// Расчёт ошибки управления
error = ref - field;
// Расчёт сигнала управления
control = error / 5;
// Ограничение сигнала управления
if(control > 255)
{
control = 255;
}
if(control < -255)
{
control = -255;
}
// Установка сигнала управления
if(control >= 0)
{
PORTG &= ~_BV(3);
OCR1AL = (unsigned char)control;
}
else
{
PORTG |= _BV(3);
OCR1AL = (unsigned char)(-control);
}
}
}
Задание на лабораторную работу. Необходимо добиться устойчивой
левитации постоянного магнита в магнитном поле катушки с помощью ПД-
регулятора.
Содержание отчета
52
 Цель работы.
 Задание на лабораторную работу.
 Принципиальная схема части макета, относящейся к заданию.
 Блок-схема алгоритма программы.
 Текст программы на языке C с обязательными комментариями.
 Выводы.

Лабораторная работа 9. Получение и обработка изображения с RGB


камеры используя средства библиотеки OpenCV в среде разработки Qt
Creator
Цель работы. Знакомство с интегрированной средой разработки Qt
Creator, библиотекой алгоритмов компьютерного зрения OpenCV и создание
простейшей программы для получения изображения с веб-камеры.
2.9.1 Основные сведения
Введение в интегрированную среду разработки QtCreator. QtCreator
‒ кроссплатформенная свободная интегрированная среда разработки для ра-
боты на языках С, С++ и QML. Разработана Trolltech(Digia) для работы с
фреймворком Qt. Включает в себя графический интерфейс отладчика и визу-
альные средства разработки интерфейса как с использованием QtWidgets, так
и QML. Поддерживаемые компиляторы: GCC, Clang, MinGW, MSVC, Linux
ICC, GCCE, RVCT, WINSCW.
QtCreator запускается с помощью ярлыка на рабочем столе или из стар-
тового меню, как и любое другое приложение операционной системы
Windows. Внешний вид редактора кода показан на рис. Л.9.1.

Рис. Л.9.1. Внешний вид QtCreator

53
На рисунке обозначены:
1. дерево проекта, показывающее все файлы подключённые к проекту;
2. окно редактора кода;
3. окно вывода программы;
4. список открытых файлов.
Введение в библиотеку OpenCV. OpenCV ‒ библиотека алгорит-
мов компьютерного зрения, обработки изображений и численных алгоритмов
общего назначения с открытым кодом. Реализована на C/C++, также разраба-
тывается для Python, Java, Ruby, Matlab, Lua и других языков. Может свобод-
но использоваться в академических и коммерческих целях.
Библиотека содержит в себе следующие основные модули:
 opencv_core – основная функциональность. Включает в себя базовые
структуры, вычисления(математические функции, генераторы случай-
ных чисел) и линейную алгебру, DFT, DCT, ввод/вывод для XML и
YAWL и т.д;
 opencv_imgproc – обработка изображений (фильтрация, геометриче-
ские преобразования, преобразование цветовых пространств и т.д);
 opencv_highgui – простой графический интерфейс, ввод/вывод изобра-
жений и видео;
 opencv_ml – модели машинного обучения (SVM, деревья решений,
обучение со стимулированием и т.д.);
 opencv_features2d – распознавание и описание плоских примитивов
(SURF(англ.)русск., FAST и другие, включая специализированный
фреймворк);
 opencv_video – анализ движения и отслеживание объектов (оптический
поток, шаблоны движения, устранение фона);
 opencv_objdetect – обнаружение объектов на изображении (нахожде-
ние лиц с помощью алгоритма Виолы-Джонса(англ.), распознавание
людей HOG и т.д.);
 opencv_calib3d – калибровка камеры, поиск стерео-соответствия и
элементы обработки трехмерных данных;
 opencv_flann – библиотека быстрого поиска ближайших соседей
(FLANN 1.5) и обертки OpenCV;
 opencv_contrib – сопутствующий код, ещё не готовый для применения;
 opencv_legacy – устаревший код, сохраненный ради обратной совмес-
тимости;
54
 opencv_gpu – ускорение некоторых функций OpenCV за счет CUDA,
создан при поддержке NVidia.
Библиотека распространяется в виде открытых исходных кодов. Для
расширения базовых возможностей OpenCV может быть собрана вместе со
сторонними библиотеками, например библиотекой Qt для создания более
функционального графического интерфейса.
Создание и настройка проекта для работы с библиотекой OpenCV.
Разработка новой прикладной программы в QtCreator начинается с создания
проекта. Для создания нового проекта выберите пункт «Новый файл или про-
ект…» из главного меню Файл. Откроется диалоговое окно для создания но-
вого проекта, показанное на рис. Л.9.2.

Рис. Л.9.2. Диалоговое окно создания нового проекта


Необходимо выбрать шаблон проекта «Другой проект» и «Пустой про-
ект Qt». После этого появится окно с выбором имени проекта и его располо-
жения на компьютере, показанное на рис. Л.9.3.

55
Рис. Л.9.3. Диалоговое окно выбора имени проекта
Вслед за этим появиться окно выбора комплекта, показанное на рис.
Л.9.4. Здесь необходимо нажать кнопку «Далее», оставив всё как есть.

Рис. Л.9.4. Диалоговое окно выбора комплекта


Последним диалоговым окном является «Управление проектом», пока-
занное на рис. Л.9.5. В нём также необходимо оставить всё как есть, и нажать
«Далее».

56
Рис. Л.9.5. Диалоговое окно «Управление проектом»

После этого будет создан пустой проект с пустым .pro файлом в нём. В
него необходимо добавить следующие строчки:
QT += core gui widgets # подключение библиотек Qt
TARGET = testApplication # имя программы (.exe файла)
TEMPLATE = app # создание программы
# указание местонахождения заголовочных файлов OpenCV
INCLUDEPATH += C:\\OpenCV\\opencv_bin\\install\\include
# указание местоположения файлов библиотек OpenCV
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_core240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_contrib240.dll.a
LIBS +=
C:\\OpenCV\\opencv_bin\\lib\\libopencv_features2d240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_flann240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_highgui240.dll.a
LIBS +=
C:\\OpenCV\\opencv_bin\\lib\\libopencv_objdetect240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_video240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_legacy240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_calib3d240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_imgproc240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_ml240.dll.a
LIBS += C:\\OpenCV\\opencv_bin\\lib\\libopencv_nonfree240.dll.a
На этом настройка проекта закончена.
Создание простой программы для получения изображения с каме-
ры. Для создания простой программы необходимо добавить в проект файл
исходных кодов программы (.cpp файл), для этого необходимо в области де-
рева проекта (1 на рис. 1.1) кликнуть правой кнопкой мыши на название про-
екта и выбрать пункт «Добавить новый…», откроется диалоговое окно, пока-
занное на рис. Л.9.6.

57
Рис. Л.9.6. Диалоговое окно добавления нового файла
В нём необходимо в разделе «Файлы и классы» выбрать пункт «C++» и
пункт «Файл исходных текстов C++».
Затем появится диалоговое окно выбора имени и размещения нового
файла исходных кодов, показанное на рис. Л.9.7.

Рис. Л.9.7. Диалоговое окно выбора имени файла


Последним диалоговым окном является окно настройки проекта, пока-
занное на рис. Л.9.8.

58
Рис. Л.9.8. Диалоговое окно настройки проекта
В котором нужно выбрать проект, в который следует добавить новый
файл.
В добавленный .cpp файл необходимо подключить заголовочный файл
графического интерфейса OpenCV вставив в начало следующую строчку:
#include "opencv2/highgui/highgui.hpp"
Все классы и функции библиотеки OpenCV находятся в пространстве
имён cv, поэтому перед их именами всегда нужно писать cv:: или добавить
в начало .cpp файла строчку using namespace cv;
Для работы с камерой используется класс VideoCapture. Для того что-
бы открыть камеру по умолчанию необходимо использовать функцию bool
open(int device), передав в неё 0 или передать 0 прямо в конструктор объ-
екта типа VideoCapture.
Изображения хранятся в объектах типа Mat, точнее в объекте типа Mat
хранятся параметры изображения (высота, ширина, тип и т.д.), а также указа-
тель на массив значений интенсивностей пикселей.
Для получения изображения с камеры нужно воспользоваться функцией
bool read(Mat &image) или оператором >>.
Для вывода изображения на экран используется функция void
imshow(const string &winname, InputArray mat), где winname - это на-

59
звание окна, в которое будет выводится изображение, а mat - это объект в ко-
тором хранится изображение (Mat).
Для получения кода нажатой клавиши на клавиатуре используется
функция int waitKay(int delay = 0), где delay - это время ожидания на-
жатия на клавишу, в случае 0 функция ожидает нажатия клавиши бесконеч-
но. Возвращает код клавиши или -1 в случае если ни одна клавиша не была
нажата во время ожидания.
Рассмотрим пример программы получения изображения с камеры и его
вывод:
// Подключение заголовочного файла графического интерфейса
#include "opencv2/highgui/highgui.hpp"

int main()
{
// Создание объекта для хранения изображения
cv::Mat frame;
// Создание объекта для управления камерой
// и открытие камеры по умолчанию
cv::VideoCapture camera(0);

// "бесконечный" цикл получения изображения с камеры


for(;;)
{
// Получение изображения с камеры
camera >> frame;
// Вывод изображения на экран
cv::imshow("Frame", frame);
// Выход из цикла если нажата клавиша
// наклавиатуре
if(cv::waitKey(1) >= 0) break;
}

return 0;
}
Для того чтобы собрать и запустить программу нужно нажать на кнопку
«Запустить», показанную на рис. Л.9.9 (1) или нажать комбинацию клавиш
Ctrl+R. В случае возникновения ошибок они будут показаны в окне «Про-
блемы» показанном также на рис. Л.9.9 (2).

60
Рис. Л.9.9. Кнопка «Запустить » и проблемы при сборке программы

Обращение к отдельным пикселям изображения. Каждый пиксель


цветной 8-и битной BGR картинки состоит из 3-х субпикселей, синего, зелё-
ного и красного. Данные изображения хранятся в массиве по 3 байта на пик-
сель, т.е. по байту на субпиксель.
Объект класса Mat хранит указатель на данный массив в виде открытого
члена класса data типа uchar*, т.е. указателя на unsigned char. Размер каж-
дого пикселя можно узнать, вызвав метод elemSize() класса Mat.
Размер строки изображения в байтах хранится в открытом члене класса
step. Количество столбцов и строк изображения (т.е. его разрешение) хра-
нится в переменных cols и rows соответственно, также являющихся откры-
тыми членами класса Mat. Рассмотрим пример изменения значения отдельно-
го пикселя изображения, допустим нужно поменять значения субпикселей
пикселя с координатами x и y, для этого можно использовать следующие
строчки:
// Синий субпиксель
*(frame.data + x * frame.elemSize() + y * frame.step) = 0;
// Зелёный субпиксель
*(frame.data + x * frame.elemSize() + y * frame.step + 1) = 25;
// Красный субпиксель
*(frame.data + x * frame.elemSize() + y * frame.step + 2) = 50;
Полную документацию по библиотеке OpenCV можно найти в интерне-
те по адресу: http://docs.opencv.org/

61
Задание на лабораторную работу. Получить изображение с камеры,
осуществить инверсию цветов левой верхней четверти изображения и вывес-
ти полученную картинку на экран. Всё это выполнять в бесконечном цикле с
выходом из программы по нажатию на любую клавишу на клавиатуре.
Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Блок-схема алгоритма программы.
 Текст программы на языке C++ с обязательными комментариями.
 Выводы.

Лабораторная работа 10. Определение положения объекта определённого


цвета, используя RGB камеру.
Цель работы. Знакомство с различными цветовыми моделями изобра-
жения (RGB, HSV), нахождение областей изображения с заданным цветом, а
также использование ползунков в интерфейсе OpenCV.
Л.10.1 Основные сведения
Цветовые пространства. Цветовое пространство представляет собой
модель представления цвета, основанную на использовании цветовых коор-
динат. Цветовое пространство строится таким образом, чтобы любой цвет
был представим точкой, имеющей определённые координаты, причём так,
чтобы одному набору координат соответствовал один цвет.
RGB-модель. RGB-модель – цветовая модель описывающая способ син-
теза цвета из трёх составляющих: красной, зелёной и синей. Выбор основных
цветов обусловлен особенностями физиологии восприятия цвета сетчаткой
человеческого глаза. Цветовая модель RGB нашла широкое применение в
технике. Изображение в данной цветовой модели состоит из трёх каналов.
При смешении основных цветов (основными цветами считаются красный,
зелёный и синий) — например, синего и красного, мы получаем пурпурный,
при смешении зеленого и красного — жёлтый, при смешении зеленого и си-
него — циановый. При смешении всех трёх цветовых компонентов мы полу-
чаем белый цвет. В OpenCV по умолчанию используется BGR-модель, пред-
ставляющая из себя ту же RGB-модель, но с обратным порядком цветов.

62
HSV-модель. HSV (англ. Hue, Saturation, Value — тон, насыщенность,
значение) или HSB (англ. Hue, Saturation, Brightness — тон, насыщенность,
яркость) — цветовая модель, в которой координатами цвета являются:
– Hue — цветовой тон, (например, голубой).
– Saturation — насыщенность.
Чем больше этот параметр, тем «чище» цвет, поэтому этот параметр
иногда называют чистотой цвета. А чем ближе этот параметр к нулю, тем
ближе цвет к нейтральному серому.
Value (значение цвета) или Brightness — яркость.
HSV-модель часто используется в компьютерном зрении для цветового
анализа изображений, т.к. разбиение на тон, насыщенность и яркость в таких
случаях оказывается удобней разбиения на красный, зелёный и синий кана-
лы.
Преобразование цветовых моделей в OpenCV. Для преобразования
изображения из одной цветовой модели в другую используется функция void
cvtColor(InputArray src, OutputArray dst, int code, int dstCn =
0), где src – исходное изображение, dst – получаемое изображение (может
использоваться исходное изображение), code – код преобразования, dstCn –
количество каналов в получаемом изображении, если равно 0 то выбирается
автоматически. Прототип функции включён в заголовочный файл
imgproc.hpp, чтобы его подключить нужно добавить в программу строку:
#include "opencv2/imgproc/imgproc.hpp"
Код преобразования задаётся с помощью константы и задаёт формат
входного и получаемого изображений.
Имена констант преобразования составлены по следующим правилам:
 используются только заглавные буквы;
 начинается с префикса CV_;
 дальше идёт название исходной цветовой модели (BGR, GRAY, HSV
и т.д.);
 после названия исходной цветовой схемы идёт цифра 2;
 заканчивается названием цветовой модели, в которую необходимо
преобразовать изображение.
Пример преобразования изображения из BGR-модели в HSV-модель:
cv::cvtColor(frame, // Исходное изображение
frame, // Получаемое изображение
CV_BGR2HSV // Тип преобразования
63
);
Нахождение областей заданного цвета. Для нахождения областей за-
данного цвета создаётся ещё одно изображение, такого же разрешения как
исходное изображение с камеры, но чёрно-белое, т.е. одноканальное. В этом
изображении пиксели, в которых в исходном изображении находится иско-
мый цвет, обозначаются белым цветом (255), а все остальные чёрным (0).
Для этого можно в цикле проверить все пиксели исходного изображения на
соответствие заданному цвету, а можно воспользоваться функцией библио-
теки OpenCV void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst), где src – исходное изображение,
dst – получаемое изображение, lowerb и upperb – нижняя и верхняя граница
цвета соответственно. Для того чтобы задать цвет используется объект типа
Scalar, в конструктор которого передаются значения всех каналов цвета. На-
пример, для выделения объектов, чьи цвета находятся в диапазоне от (100,
110, 120) до (255, 255, 255) нужно написать следующий код:
cv::inRange(frame, // исходное изображение
cv::Scalar(100, 110, 120), // нижняя граница цвета
cv::Scalar(255, 255, 255), // верхняя граница цвета
out // получаемое изображение
);
Использование ползунков в интерфейсе OpenCV. Для того чтобы во
время выполнения программы удобно варьировать значения некоторых пе-
ременных к окну вывода изображения можно добавить ползунки. Для этого
используется функция int createTrackbar(const string
&trackbarname, const string &winname, int* value, int count,
TrackbarCallbackonChange=0, void* userdata=0), где trackbarname –
имя ползунка, winname – имя окна, в которое нужно добавить ползунок, value
– адрес переменной типа int, в которой будет хранится текущая позиция пол-
зунка, count – максимальное значение которое может принимать переменная
(минимальное равно нулю), onChange – адрес функции которая будет вызы-
ваться при изменении положения ползунка (добавляется опционально),
userdata – адрес данных которые нужно передать в вызываемую функцию.
Перед вызовом этой функции необходимо создать окно с помощью функции
void namedWindow(const string &winname, int
flags=WINDOW_AUTOSIZE), где winname – имя создаваемого окна, flags – код
режима вывода изображения. Коды режима вывода могут быть:

64
 WINDOW_NORMAL – размер окна может изменяться пользовате-
лем;
 WINDOW_AUTOSIZE – размер окна определяется размером выво-
димого изображения.
Пример создания окна с ползунком и вывода в него изображения:
// Создание окна
cv::namedWindow("Frame");
// Переменная, изменяемая ползунком
int var;
// Создание ползунка
cv::createTrackbar("Track", // Имя ползунка
"Frame", // Имя окна
&var, // Адрес переменной
255 // Максимальное значение
);
// Вывод изображение в созданное окно
cv::imshow("Frame", frame);
Задание на лабораторную работу. Написать программу поиска шара
определённого цвета на изображении с цветовым пространством HSV и ше-
стью ползунками для задания цветов.
Содержание отчета
 Цель работы.
 Задание на лабораторную работу.
 Блок-схема алгоритма программы.
 Текст программы на языке C++ с обязательными комментариями.
 Выводы.

65
Оглавление
ВВЕДЕНИЕ ......................................................................................................... 3
1. ОПИСАНИЕ МИКРОКОНТРОЛЛЕРНОГО ЛАБОРАТОРНОГО
СТЕНДА И ИНСТРУМЕНТАЛЬНЫХ СРЕДСТВ РАЗРАБОТКИ
ПРИКЛАДНЫХ ПРОГРАММ ......................................................................... 4
1.1. Описание микроконтроллерного лабораторного стенда ................... 4
1.2. Введение в интегрированную среду разработки CodeVisionAVR ..... 5
2. ЛАБОРАТОРНЫЕ РАБОТЫ................................................................................ 13
Лабораторная работа 1. Работа с механическим энкодером .................. 13
Лабораторная работа 2. Работа с трёхцветным светодиодом ................ 22
Лабораторная работа 3. Работа с аналого-цифровым преобразователем
.......................................................................................................................... 28
Лабораторная работа 4. Работа с сервомашинками ................................ 33
Лабораторная работа 5. Работа с ультразвуковым дальномером ......... 36
Лабораторная работа 6. Работа с датчиком температуры по протоколу
I2C .................................................................................................................... 38
Лабораторная работа 7. Работа с внешним АЦП по протоколу SPI ..... 45
Лабораторная работа 8. Управление левитацией постоянного магнита
в поле электромагнита ................................................................................. 50
Лабораторная работа 9. Получение и обработка изображения с RGB
камеры используя средства библиотеки OpenCV в среде разработки Qt
Creator ............................................................................................................. 53
Лабораторная работа 10. Определение положения объекта
определённого цвета, используя RGB камеру. ......................................... 62

66
Подписано в печать 15.04.2015. Формат 60*84 1/16.

Бумага офсетная. Печать цифровая. Печ. 2,0.

Тираж 45 экз. Заказ .

Опечатано с готового оригинал-макета

в типографии Издательство СПбГЭТУ “ЛЭТИ”

Издательство СПбГЭТУ “ЛЭТИ”

197376, С.-Петербург, ул. Проф. Попова, 5

67