|
Курс AVR123.nm.ru |
|
||
|
Задача - упражнение 13
Цель задачи: 1) Создать
программу для микроконтроллера
ATmega16
Схемы и компоненты для сопряжения МК с COM-портом ПК,
так же программы для управления и лога данных смотрите в
задаче 4
и в задаче
5
- Как и чем прошить МК AVR читайте на странице 7 курса !
- Подробно и с картинками
симуляция
программы
Для выполнения задачи
необходимы : - Data Sheet - ДШ - паспорт на МК AVR ATmega16 - Знать ХОРОШО теоретический материал курса - до стр. 6 - Выполнить задчачи-упражнения 4 и 5
Это нужно не мне - это нужно ВАМ ! Делаем ...
SERVO - сервопривод или рулевая машинка - это электромеханическое устройство которое устанавливает ( поворачивает ) свой выходной вал ( либо другой механический параметр - перемещение, момент, скорость ) в соответствии с управляющим сигналом. SERVO HiTEC - параметры и выбор SERVO Futaba - параметры и выбор SERVO аксессуары - ServoCity SERVO для моделей питаются напряжение 4.8 - 6 вольт (обычно "+" это средний красный провод, а земля это черный или коричневый провод). SERVO для моделей управляются длительностью импульсов напряжения 3-5 вольт которые повторяются каждый 15-25 мС ( некоторые цифровые рулевые машинки допускают повторение управляющих импульсов каждые 4-5 мС ) до 200 Гц ). Купить недорого по-почте серво servo рулевые машинки и другие детали для моделизма, создания роботов, различные ракеты, различной техники, беспилотников, БПЛА, ДПЛА, квадрокоптеров и мультикоптеров можно у Семенова Михаила. Ширина импульса 1500 микро секунд (мкС) соответствует среднему положению вала сервы. Изменение ширины импульса на 400 мкС обычно соответствует повороту вала сервы на 45 градусов. На рисунке показаны примерно положения "качалки" servo для ширины управляющих импульсов 1100, 1500, 1900 мкС.
Для "обычных" серво желательно формировать импульсы управления от 1000 до 2000 мкС чтобы поворот вала не превысил 60 градусов от среднего положения - это гарантирует сохранность потенциометра ОС (обратной связи) по положению вала внутри SERVO. Есть специальные сервы с поворотом на 180 град., есть сервы на 3-4 полных оборота и есть сервы неограниченного вращения.
- Cкорость поворота вала сервы без нагрузки - в параметрах выше для SERVO Futaba S3003 она составляет 316 градусов в секунду ( 60 град. за 0.19 сек.) при напряжении питания 6 вольт.
-
Момент на валу сервы
Futaba S3003 - 4,1 Кг*См при 6 вольтах
питания. Это значит - если на вал установить шкив диаметром 2 См и на
шкив намотать нить то серва сможет удерживать или поднимать
на
нити груз массой 4100 грамм. Произведение момента (Н*М) на скорость вращения (рад/сек) дает мощность в Вт.
Подробней работа и
устройство servo и аппаратуры
Реклама недорогих радиодеталей почтой:
Формат команд Команды управляющие работой servo будут поступать на вход RxD USART ATmega16 в формате который используется servo-контроллерами компаний Pontech, New Micros, Pololu, Net Media, Lynxmotion, Picobytes, Parallax. Посылки передаются на скорости 9600 в формате 8N1 и состоят из 3-х байт:
Байт 1 - синхробайт - всегда
байт 255 или
0xFF
Если байт 3 равен 127 то наш прибор должен выдавать на соответствующую серву импульс 1500 мкС , Если 0 то импульс 1000 мкС - серва повернет вал максимально против часовой стрелки. Если 254 то импульс 2000 мкС - серва повернет вал максимально по часовой стрелке.
Бесплатная программа
управления 16
SERVO Можно скачать резервный архив с программой.
Начнем с написания программы принимающей команды с COM порта ПК. Если у вашего ПК нет COM-порта, вам поможет микросхема FT232R которая подключается в USB и в ПК возникает виртуальный COM-порт. Для этого используем материалы задачи 5. Скачайте архив с файлами для CVAVR и VMLAB - z5-13.rar и после распаковки поместите файлы в папку C:\z13 Если у вас нет файла m8_128.h то скачайте его и поместите в папку C:\CVAVR\inc компилятора CVAVR. Запустите CVAVR и откройте проект - cvavr.prj Выполните компиляцию - она должна пройти без ошибок с одним "вонингом".
Теперь нам нужно внести изменения в текст программы : а) установить скорость USART 9600 Для этого запустите мастер кода CVAVR (серая шестерёнка левее красного жучка в панели инструментов) и убедитесь что Chip - ATmega16 и частота 11.059 МГц, перейдите на закладку USART и поставьте галочку в Receiver - появятся обычные настройки - скорость должна быть 9600. Теперь нажмите File -> Program preview и в открывшимся тексте сгенерированной мастером программы скопируйте в буфер строки настройки скорости USART
//
USART Baud Rate: 9600
закройте текст и мастер и вставьте настройки вместо
соответствующих
б) нужно "закомментировать" - сделать комментариями
- не нужные нам
После строки программы :
Сделайте комментарием и эту строку программы:
в) после строки :
Выполните компиляцию снова - ошибок быть не
должно, но добавятся
Вот отредактированный файл -
usart.c
Вы можете скачать файл, закрыть
Приём и распознавание символов по USART В тексте нашей программы информация поступающая на ножку TxD ATmega16 в USART сохраняется в созданном в задаче 5 буфере размером 100 байт - в нашей задаче наверно хватило бы и 10 , но и 100 не помешает. Для хранения принятых команд создадим массив на 8 элементов char с начальным значением 127 - это среднее положение servo. И переменную для выбора элемента массива. После строки программы :
int temp; теперь требуемое положение вала сервы 4 подключенной к ножке PC4 хранится в элементе массива servo_poz[4]
Пора создать процедуру чтения символов из буфера
принятых символов
Добавляем в программу цикл
Проверим приём по USART в VMLAB
Запустите симулятор
VMLAB и откройте
проект C:\z13\vmlab.prj
Разместите окна симулятора как вам удобно - мне удобно так :
Выполните компиляцию проекта - "Проджект" - "Ребилд ол" - должна появится надпись как на рисунке выше - "Success! All ready to run" - всё готово к симуляции.
Создайте файл с данными для передачи команд на МК
("как бы" из COM-порта
ПК) в симуляторе кнопочкой
TX File - см. на рисунке выше ! Откройте
редактор "Блокнот" и наберите текст:
98 08
F1 F3 FF 04 53 08 01 E3 22
56 33 13 11 73 55
Сохраните файл в папку
C:\z13
под именем 1.TX и УБЕДИТЕСЬ ,
Видно что программа определила что в номере сервы есть ошибка, затем определила команды для серво в соответствии с нашей задумкой. Вот архив с файлами проекта z13-2.rar
Итак ...
Программа принимает команды и сохраняет их в
массиве Настройка таймера рассматривалась в задаче 6
Наверно удобно будет использовать 16 битный
таймер ( 16-bit Timer Counter
1 - это стр. 89 даташита ATmega16 )
настроив его на 1 отсчет каждую микросекунду.
Делитель ( prescaler factor 1, 8, 64, 256, or 1024 ) тактовой частоты может делить на 1 на 8 и на 64. Значит нам подойдет делитель 8 и частота такта 8 МГц ( желательно кварц и конденсаторы по 22 пФ но можно и внутренний RC генератор использовать ) - укажите это значение частоты в свойствах проекта CVAVR, в тексте программы :
UBRRH=0x00;
// USART Baud Rate: 9600 и в файле проекта VMLAB : .CLOCK 8meg
Запустите мастер CVAVR и сделайте такие установки:
Я включил: 1) источник такта - такт МК "System clock" 2) Частота 1 МГц ( там 1000 КГц ) с какой будет считать таймер 3) Прерывание "Interrupt on" по достижению (насчёту) таймером числа в ячейке "Comp. A" - я вписал произвольное число 3FFF. Теперь посмотрите код мастера - File -> Program Preview - и комбинацией Alt + C отправьте код в панель заготовок кода "Code Templates" она в CVAVR находится слева. Закройте код и мастер. Опустите курсор под текст программы и скопируйте нашу новую заготовку кода в текст программы. Нам нужно взять из этого куска лишь нужное. Во-первых скопируйте и поставьте после строки: #include <lcd.h> // библиотека для LCD
код обработчика прерывания
:
Во-вторых весь блок настройки таймера :
скопируйте и вставьте в программу после строки :
В-третьих включите прерывание
от Таймера 1
Удалите с низу текста программы вставленную
заготовку - мы уже взяли
Теперь настроим PORTC
на выход - добавьте строки :
Выполните компиляцию "Make the
project" - убедитесь что нет ошибок.
Проверим работу таймера и его прерывания.
Чтобы прерывание от таймера возникало каждые 1500 мкС
OCR1A = 1500;
// Timer 1 output compare
A interrupt service routine добавим переключение логического уровня на ножках PORTC : PORTC ^= 255; // инвертировать регистр PORTC
.plot V(PC0) Перекомпилируйте проект - "Ре-билд ол". Затем разверните окно SCOPE и поместите его под окно исходника, предварительно подняв его нижнюю границу. Поставьте мышкой точку останова левее строчки : PORTC ^= 255; // Запустите симуляцию и после третьего нажатия светофора произойдет прерывание от таймера, я еще раз нажал светофор и снова возникло прерывание таймера и остановка на точке останова - вот картинка :
Вы видите что время с запуска МК прошло
4.1 мС , строчка кода у которой поставлен
"брейк поинт" подсвечена голубым - она еще не выполнена !
Продолжаем симуляцию...
Текущее время 19.1 м - если вычесть предыдущее время 4.1 мС то подучится 15 мС на 10 прерываний - т.е. прерывание случается у нас каждые 1.5 мС или 1500 мкС - как и было задумано. Как точней измерять время в VMLAB - читайте в задаче 3
Пора писать код для создания
управляющих Мы будем управлять сервами последовательно. В прерывании от таймера включаем первую серву и установим время следующего прерывания от таймера (значит и ширину управляющего импульса) в соответствии с командой указанной в массиве servo_poz[servo_num] , затем выключаем эту серву и включаем следующую. Так делаем для всех 8 servo , а потом отсчитываем остаток времени до общего периода повторения 20 мС. Нам понадобятся переменные и константы - их нужно объявить до использования в программе - значит выше обработчика прерывания :
1) переменная индекс на 9 значений
или 9 состояний PORTC :
2) массив констант
содержащий эти 9 состояний PORTC :
Переместите сюда переменную и массив объявленные в начале этой задачи.
в обработчике прерывания от таймера :
if (index_st
== 8){
//
обновить остаток времени на 20 мС
// обнулить индекс
// Вычислить
длину имп. для сервы и вписать в OCR1A
// Вычесть
длину имп. сервы из периода в 20 мС
// увеличить
индекс на 1 };
Программа готова ! работает ли ? Выполните компиляцию "Make the project" - ошибок быть не должно. Запустите симулятор VMLAB - откройте проект vmlab.prj и добавьте в файл проекта вывод сигналов всего PORTC в виртуальный осциллограф SCOPE
.plot V(PC0)
V(PC1) V(PC2) V(PC3) и закомментируйте строку LCD
; Xdisp LCD(16 2
250K) Запустите симуляцию 4 раза нажав на светофор и после 3-й пачки управляющих импульсов запустите передачу на МК команд нажав кнопку "TX File" ...
После появления сообщения S_num
4 Poz 83 остановите
симуляцию.
Созданный контроллер выполнил команды для трех серво поступившие на вход USART в последовательном формате :
Servo 0 - команда 34
- импульс 1128 мкС Расчет для Серво 0 таков : 34 * 4 + 992 = 1128 мкС
На остальные сервы продолжают поступать импульсы
шириной 1500 мкС
Самостоятельно !
Измерьте ширину импульсов и период
Как устроен микроконтроллер AVR
|
|
|