243.50K
Category: electronicselectronics

LabRoboProg-01

1.

Обучающее задание 1.
Релейное управление яркостью светодиода
1. Светодиод подключен к выводу D11
2. Код
1

2.

Обучающее задание 2.
Управление яркостью светодиода на базе ШИМ
1. Светодиод подключен к выводу D11
2. Код
2

3.

Управление моторами
1. Передние и задние моторы с каждой стороны работают синхронно;
2. Управление левыми моторами выполняется с помощью D4 и D5;
3. D4 – направление вращения (digital): 0 – по часовой; 1 – против часовой;
4. D5 – мощность мотора (ШИМ);
5. Управление правыми моторами выполняется с помощью D6 и D7;
6. D7 - направление вращения (digital): 0 – по часовой; 1 – против часовой;
7. D6 – мощность мотора (ШИМ).
Задание 1. Напишите код, реализующий следующий алгоритм:
1. Плавный разгон левых моторов по часовой стрелке, а правые стоят на месте;
2. Плавное торможение левых моторов;
3. Плавный разгон левых моторов против часовой стрелки, а правых – по часовой
стрелке;
4. Плавное торможение всех моторов;
5. Плавный разгон правых моторов против часовой стрелки, а левые стоят на
месте;
6. Плавное торможение правых моторов;
7. Повторить, начиная с п.1
3

4.

Прерывания в алгоритмах управления
Прерывание – инициируемый определенным образом процесс, временно
переключающий микропроцессор на выполнение другой программы с
последующим возобновлением выполнения прерванной программы.
Генераторами прерываний могут быть внутренние блоки микроконтроллера: АЦП, таймер,
UART и др. Такие прерывания называются внутренними. Кроме внутренних существуют еще
внешние прерывания. Сигналы внешних прерываний поступают через выводы
микроконтроллера и генерируются внешними по отношению к микроконтроллеру устройствами.
External hardware interrupt – это прерывание, вызванное изменением напряжения на выводе
микроконтроллера. Использование прерываний в алгоритмах управления позволяет отказаться
от регулярного опроса состояния вывода(ов) системным ядром микроконтроллера (не
тратить на это время). Как только напряжение на выводе микроконтроллера изменяется его
специальный аппаратный блок обнаруживает это событие и генерирует сигнал прерывания,
который заставляет ядро микроконтроллера прервать выполнение основной программы и
запустить специальную функцию для обработки обнаруженного события. По завершении
работы функции-обработчика ядро микроконтроллера возобновляет исполнение основной
программы с точки ее прерывания.
Прерывания хорошо подходят для обнаружения случайных (асинхронных) событий. Например,
подсчет нерегулярной последовательности коротких импульсов или ручное переключение
режима работы оборудования. Также прерывания способны возвращать микроконтроллер из
режимов энергосбережения, в которых практически все его функциональные блоки отключены.
4

5.

Прерывания в Arduino
У микроконтроллера есть возможность получать прерывания с любого вывода,
такие прерывания называются PCINT. Работать с ними можно только при помощи
сторонних библиотек, либо при программировании микроконтроллера на уровне
регистров. Для фреймворка Arduino определен свой набор прерываний, который
обозначается INT. Таких прерываний и соответствующих им выводов немного (см.
таблицу).
По таблице можно заметить, что прерывания в Arduino имеют собственный номер,
который отличается от номера вывода микроконтроллера. Для установления
соответствия между номером вывода микроконтроллера и номером прерывания в
Arduino можно использовать функцию digitalPinToInterrupt(pin), где pin – номер
вывода микроконтроллера. Функция возвращает номер прерывания.
5

6.

Обработчик прерывания
В среде Arduino для каждого прерывания, используемого в программе
управления роботом, нужно объявить функцию-обработчик со следующим
синтаксисом:
void function() {…}
Код этой функции должен удовлетворять следующим требованиям:
• Переменные, которые изменяют своё значение в прерывании, должны быть
объявлены со спецификатором volatile. Пример: volatile byte value;
• Не работают задержки типа delay();
• Не меняет своё значение millis() и micros();
• Некорректно работает вывод в порт Serial.print();
• Минимизация вычислений, т.е. нужно избегать сложных алгоритмов,
требующих длительных вычислений. Такие вычисления будут отнимать много
процессорного времени при частых прерываниях:
Вычисления с float;
Работа с динамической памятью (функции new(), malloc(), realloc() и пр.);
Работа со String-строками.
6

7.

Подключение прерывания
Прерывание подключается в программе с помощью функции:
attachInterrupt(INT, pFun, mode),
где INT – номер прерывания;
pFun – указатель на функцию-обработчик;
mode – режим генерации прерывания:
RISING (рост) – при изменении сигнала с LOW на HIGH;
FALLING (падение) – при изменении сигнала с HIGH на LOW;
CHANGE (изменение) – при изменении сигнала с LOW на HIGH и наоборот;
LOW (низкий) – срабатывает постоянно при сигнале LOW.
Прерывание в программе можно отключить при помощи функции:
detachInterrupt(pin).
Глобально запретить все прерывания на микроконтроллере можно с помощью
функции noInterrupts(), и снова разрешить их при помощи Interrupts().
Примечание! Следует очень осторожно использовать noInterrupts(), т.к. запрет
всех прерываний остановит работу таймеров, которые отвечают всех функций
времени и генерацию сигналов с ШИМ.
7

8.

Измерение угла поворота колес
1. Датчик для измерения угла поворота колес называется энкодер.
2. В мобильном роботе энкодеры имеются только на передних колесах.
3. Сигнал с энкодера левого колеса подается на вход микроконтроллера D2, а
сигнал с энкодера правого колеса - на вход D3.
4. При повороте колеса энкодер формирует прямоугольный импульс. Одному
обороту колеса соответствует 25 импульсов.
Задание 2. Напишите код для измерения угловой скорости колес:
1. Реализуйте процедуры прерывания для обработки сигналов энкодеров левого и
правого колеса.
2. Обработчики прерывания должны вызываться по фронту импульсов сигнала.
3. Используйте вызов функции micros() в первой строке обработчика, чтобы
фиксировать время возникновения прерывания.
4. В процедуре loop реализуйте запись сведений о 500 импульсах энкодеров во
внутреннюю память контроллера
5. По завершении записи показаний обеих энкодеров передайте эти данные в ПК
через COM-порт.
6. Используя Scilab или Matlab отобразите зависимости угла поворота колес от
времени в виде графиков.
8

9.

Регулятор угловой скорости
Задание 3. Разработайте код П-регулятора угловой скорости правых и левых колес:
В качестве желаемой скорости используйте значение, которое соответствует
примерно 70% мощности двигателей робота.
В обработчиках прерываний используйте флаги для указания процедуре loop о
необходимости расчета угловой скорости.
В процедуре loop реализуйте расчет угловой скорости и запись сведений о 500
отсчетах во внутреннюю память контроллера.
По завершении записи показаний передайте их в ПК через COM-порт.
Используя Scilab или Matlab отобразите зависимости угловой скорости колес от
времени в виде графиков.
Подберите коэффициент регулятора так, чтобы фактическое значение
отличалось от желаемого менее чем на 3%.
9
English     Русский Rules