понедельник, 19 февраля 2018 г.

Автопилот на AT91SAM7 : 5. Схема и ПО


5.  Схемотехника


Как говорилось во вступлении, я использовал готовую платку. На рис. 14 можно посмотреть "наколенный вариант", который до сих пор и летает. Со временем, после подключения GPS, пришлось увеличить размер памяти, и я перешел с версии SAM7S64 на SAM7S256.


Рис.14
Схема электрическая принципиальная нарисована в двух вариантах - вариант1 включающий в себя контроллер AT91SAM7S256, и вариант2 для использования готовой платы контроллера. Здесь я расскажу лишь о некоторых элементах схемы, поскольку она проста. Позиционные обозначения я буду брать из варианта2. Питание платы осуществляется от источника напряжения в диапазоне 3.6 - 12В.  Ток потребления при напряжении 5 В составляет примерно 0.3 А.  В реальной модели напряжение 5В можно взять непосредственно от регулятора ESC. (я так и делаю) При использовании ДВС аккумулятор 4.8В.  Для качественного питания сначала используется повышающий преобразователь на U4 LM2577 до 5.9 В, а потом понижающий до 5 В (U5 LT1963). Понижающий преобразователь 5В-3.3В в составе платы контроллера. Напряжение 5.9В используется для формирователя опорных напряжений V-REF и +5VREF (U6 REF195, U13 AD823). V-REF - опорное напряжение для встроенного АЦП контроллера, +5VREF - опорное напряжение для ОУ сигналов датчиков. Для предотвращения попадания на АЦП контроллера напряжения больше 3.3 В предусмотрены защитные диоды VD1 - VD4. Еще возможно нужно сказать, какой сигнал ожидается на входе PPM-IN, от приемника. Мой вариант схемы ожидает в 6-канальном случае сигнал, изображенный на рис.15. Это требует обсуждения, поскольку это единственное нестандартное место в проекте - требуется модификация стандартного приемника PPM. Кроме того, в случае современных пультов все импульсы на всех каналах начинаются одновременно, 


Рис.15
поэтому требуется другой вариант сопряжения - необходимо использовать на каждый импульс по одному порту контроллера, и при этом изменяется режим таймера для измерения длительности этих импульсов. Такое решение проверено, и присутствует в программном обеспечении, но не отлажено.  Проект печатной платы, подготовленный для разводки (созданы все компоненты и размещены рядом с печатной платой) можно найти в архиве.  Здесь PDF на все применяемые компоненты.

6.  Программное обеспечение


В архиве проекта для контроллера мы увидим следующие файлы:
Cstartup_SAM7.c - из примеров Atmel
fat.c     - функции FAT  
fat32.c - функции FAT32
GPS.c - парсер NMEA, обработка GPS, привязка по времени
main.c - главный цикл программы
mmc.c - поддержка SD карты
twi.c - интерфейс I2C с компасом
usart.c - последовательные порты
Board.h - файл из примеров Atmel
Cstartup.s79 - стартап файл, asm, Atmel

На рисунке 16 представлен алгоритм запуска автопилота.  После включения питания сначала происходит инициализация всех необходимых регистров контроллера. Далее есть пауза 20 секунд, хотя она должна быть больше. Практика показала, что для прогрева датчика высоты требуется время около 10-15 мин. Если SD карта отсутствует, то параметры автопилота выставляются из структуры кода. Если есть, то сначала инициализируются параметры автопилота.
Параметры автопилота и маршрут должны быть записаны по определенным правилам в жестко определенный файл с именем gpspoint.txt. Правила такие: строка парметров начинается с симфола P, строка маршрута - G. Символ # - обозначает комментарий. Так выглядит строка параметров автопилота:
#Paramrters:Kst_roll,Kast_roll,Kfar_roll,Kst_pitch,Kast_pitch,Kfar_pitch;
#           Kst_speed,Kast_speed,Kst_hdg,Kast_hdg,Kst_alt,Kast_alt;
P 0.08, 0.0, 0.08, 0.2, 0.0, 0.2, 5.0, 1.0, 0.02, 0.2, 0.0, 2.0, 0.0,
#
Значение параметров можно посмотреть в п.п.4.3.  Они похожи на используемые в программе x-pilot.


Рис. 16
Маршрут пишется так:
#G<N> , Lat, Lon, Alt, Speed, Head, Time, Next
G0, 59.712199, 29.806145, 0, 0, 0, 0, N 
G1, 59.710478, 29.804568, 30, 45, 0, 0, N
..
G 6,59.710478, 29.804568, 20, 0, 0, 0, 0
Последняя строчка должна оканчиваться вместо символа N(next) 0. Разделители везде ",".
Как видно есть ряд лишних параметров. Но это осталось от другой версии, где не было GPS, но маршрут задавался курсом и временем пролета заданным курсом. Если при включении питания был замкнут jumper J7 перед калибровкой датчиков будет выполнена калибровка компаса. При этом в течении 2 мин. нужно поворачивать самолет небыстро вокруг вертикальной оси, держа его по возможности с нулевым креном и тангажом. Последний шаг - калибровка датчиков - при этом текущие усредненные значения датчиков принимаются как нулевые. При чтении SD карты телеметрия выдает расчетные параметры полета по bluetooth (см. п.п. 3.6). После инициализации программа входит в бесконечный цикл. Если во время полета происходит сбой или зависание, то предполагается перезапуск контроллера с помощью watch dog таймера и возврат к главному циклу без калибровки датчиков. Работа автопилота происходит под управлением контроллера прерываний. Временную сетку задает таймер реального времени - 15.625 мс. Всего 8 обработчиков прерываний используются в системе. Они такие:  
-          void T0isr(void) - таймер, измерение тангажа
-          void T2isr(void) -  таймер, измерение последовательности PPM от RF приемника
-     void PWMCisr(void) - широтно-импульсный контроллер -  формирование PPM для сервоприводов.
-        void SYSisr(void) - таймер реального времени. Настроен на генерацию прерывания 64 раза в секунду.
-          void TWIisr(void) - поддержка I2C, компас
-          void ADCisr(void) - Измерение аналоговых параметров:
канал 3 - напряжение питания
канал 4 - высота
канал 5 - воздушная скорость
канал 6 - гироскоп - измерение крена.
-          void US1isr(void) - прием данных от GPS модуля
-          HiPriorityFunc() - программно генерируемое прерывание управления полетом  
Результаты обработки размещаются в статических структурах данных, доступных для функций главного цикла программы. На рисунке 17 представлен граф работы главного цикла программы.
Рис.17

RTTС -  таймер реального времени генерирует прерывание 64 раза в секунду. Это прерывание вызывает обработчик SYSisr(), который модифицирует счетчик i. Каждые 3 такта происходит вызов функции программного прерывания HiPriorityFunc(), которая предназначена для удержания самолета в правильном положении в пространстве и отслеживанием наличия внешнего сигнала управления. В случае его появления эта функция непосредственно перенаправляет данные от измерителя входного потока PPM на PWMC.  Если сигнала нет, принимается решение о включении автопилота, и тогда работает функция FlStSys.   Эта функция генерирует сигналы управления плоскостями и двигателем самолета. Так же SYSisr выставляет флаг cmd_rt, который вызывает последовательно запуск различных модулей с интервалом как минимум 15.625 мс. На такты 1-6 обрабатывается датчик магнитный компас. На такт 7 формируется решение о режиме автопилота (переход с взлетного режима на режим полета или режим ручного управления), вычисляется в соответствие с требованием навигационной системы значения keep_pitch и keep_roll. На такт 10 происходит обработка навигационной информации и формирование requested altitude, requested course, requested speed.  На такт 20 происходит выдача информации по телеметрии через BT, и также запись текущей строчки лога на карту памяти. При записи лога используется время и дата от модуля GPS. Порты UART работают в режиме прямого доступа в память.  Прием сигналов GPS ведет порт USART1 по прерываниям. USART0 используется для вывода телеметрии. Таким образом, все низкоприоритетные задачи выполняются раз в секунду и разнесены по времени. Высокоприоритетная функция удержания самолета работает в режиме реального времени каждые 46.875 мс примерно.