Программная реализация — передатчик.
На этом уроке мы с вами уясним для себя что такое интерфейсы и протоколы. Узнаем какие варианты реализации доступны нам. Попробуем реализовать обмен между двумя МК.
Для управления машинкой нам понадобится система радиоуправления. Состоит она из пульта управления и ответной части, установленной непосредственно в самой машинке.
Пульт управления включает в себя: органы управления, кодер (в виде нашего МК) и передатчик.
В машинке установлен: приёмник, декодер (нам придётся использовать дополнительный МК), драйверы приводов и исполнительные механизмы.
Физическая связь между кодером и декодером осуществляется посредством интерфейса связи. Данные передаются по заранее установленным правилам, которые определяются протоколом обмена.
Для примера: всем мы общаемся, создавая звуковые волны голосовыми связками – это наш интерфейс. Звуки складываются в слова, мы с вами говорим на русском языке, американцы на английском, французы на французском. Язык — это наш протокол обмена. Вот и получается, что обладая одним и тем же интерфейсом, у людей не совпадают протоколы обмена. Потому то русские и не понимают американцев, пока не выучат их «протокол»!!!
Какие интерфейсы нам доступны?
- вывод данных посредством линии порта с программным формирования пакета данных;
- передача данных с использования аппаратных интерфейсов имеющихся в МК, таких например как UART, I2C, SPI.
По поводу протоколов… есть несколько вариантов реализации:
- программное формирования импульсов с длительностью соответствующей передаваемым данным;
- программное формирования цифровой, байт ориентированной последовательности;
- передача данных посредством использования аппаратных интерфейсов имеющихся в МК, таких например как UART, I2C, SPI.
Попробуем разобраться с программной реализацией… В начале мы должны выяснить, какие данные мы будем передавать, для этого определим состав нашей машинки:
Во первых двигатель привода, во вторых рулевая система. Что можно ещё добавить???
Фары, клаксон?? В них я не вижу смысла.
Коробка передач… её у нас нет.
Адаптивная система управления клиренсом – интересная тема! Но подвеска у нас «не той системы»…
Контроль напряжения батареи… возможно!
Значит, для управления выше перечисленным нам понадобится:
Пакет данных будет выглядеть следующим образом:
Стартовая пауза в 300 отсчётов, для идентификации начала пакета. Три импульса, длительностью в 255 отсчётов каждый. Плюс две паузы, чтобы разграничить импульсы. Всего посылка занимает 1165 отсчётов общей длительностью в 26,6мс.
Рассмотрим как происходит формирование посылки.
Во первых АЦП. Мы настроили его проводить измерения в автоматическом режиме. Никаких действий по запуску/перезапуску нам выполнять не требуется.
Опрос клавиш заднего хода и поворота происходит следующим образом. Для обработки нажатий введены дополнительные переменные…
direction_of_motion //Направление движения
direction_of_rotation //Направление поворота
В основном цикле программы происходит опрос клавиш и кодирование текущего состояния…
//Направление движения
if (!(PIND & (1 << PD0))) direction_of_motion = 255;
else direction_of_motion = 128;
//Направление поворота
if (!(PIND & (1 << PD1))) direction_of_rotation = 3; //Влево
if (!(PIND & (1 << PD2))) direction_of_rotation = 255; //Вправо
if (PIND & (1 << PD1) && PIND & (1 << PD2)) direction_of_rotation = 127; //Прямо
Формирование основной посылки данных происходит в прерывании. Работает это следующим образом. Для проведение отсчётов введена переменная…
counter_cycles //Счётчик тактов посылки
…каждый раз когда счетчик переполняется, переменная инкрементируется и обнуляется при достижении 1165 отсчётов…
counter_cycles++;
if (counter_cycles = 1165) counter_cycles = 0;
Исходя из текущего положения по оси Х импульсы начинаются с отметок 300, 605, 910. Проверяя значение переменной counter_cycles на совпадения с отметкой программно формируется фронт импульса…
if (counter_cycles == 300) PORTB |= (1 << PB0); //Мощность двигателя
Точка среза вычисляется путём сложения значения отметки импульса и значения передаваемой переменной (которое лежит в диапазоне 0..255)…
if (counter_cycles == (300 + ADCH + 3)) PORTB &= ~(1 << PB0);
Остальные данные передаются аналогичным образом.
Прикрепленные файлы:
- transmitter.rar (50 Кб)