Н.В. Клиначев

Информационные технологии в расчетах динамики твердого тела

Задание к курсовой работе. Часть первая

Разработать сервер 3D-визуализации технического объекта для изучения движения его инерционных масс. Использовать прикладной программный интерфейс браузера WebGL API. Составить документацию для программного кода в виде web-документа. Использовать библиотеку highlight.js для подсветки образцов кода. Выполнить валидацию: HTML-кода по стандарту 5.0, JavaScript-кода по стандарту ECMA-262: Edition 5.1.

3D-сцена. Пример построения 3D-модели технического
устройства из единственного графического примитива

Задание к курсовой работе. Часть вторая

Разработать программно-аппаратную модель системы ориентации космического аппарата. Использовать отладочную плату STM32F3DISCOVERY [1] с микроэлектромеханическим гироскопом L3GD20. Имеющиеся на плате светодиоды использовать для информирования человека, в каком направлении следует поворачивать плату для отработки заданной ориентации. Составить отчет в печатной форме.

План выполения курсовой работы

  1. Скачайте, установите и зарегистрируйте компилятор IAR для ARM-процессоров [2]
  2. Скачайте и распакуйте комплект проектов для электропривода MCKIT-KNV.zip [3]
  3. Скачайте и распакуйте в папке MCKIT-KNV демо-проект для платы STM32F3DISCOVERY
  4. Запустите проект: c:\Users\*\Documents\MCKIT-KNV\Discovery_Demo\EWARM\Demo.eww
  5. Конвертируйте javascript-код системы ориентации [4] в Си-код Discovery_Demo\main.c
  6. Добавьте код для компенсации смещений нуля микроэлектромеханического гироскопа
  7. Примените IQ-стиль, перепишите Си-код и отключите математический сопроцессор
  8. Документируйте программу. Составьте отчет в печатной форме

Пример программы системы ориентации КА с MEMS-гироскопом
(демонстрация результата выполненной курсовой работы)

На отладочной плате STM32F3DISCOVERY, кроме микроэлектромеханического гироскопа (L3GD20), имеется 8 светодиодов распаянных по кругу. Из которых, 4 подписаны сторонами света: север (N), восток (E), юг (S), запад (W). Программа, которую необходимо написать в ходе выполнения курсовой работы, должна превратить плату в модель космического аппарата с функционирующей системой ориентации. Каждый светодиод – это реактивный двигатель. Предположим, плата лежит на столе. Если загорается северный светодиод, то нужно поднять южный край платы. Если загорается южный светодиод, то нужно поднять северный край платы. Подобным образом следует поступить, если активировался восточный или западный реактивный двигатели. Если горят юго-западный и северо-восточный светодиоды, то плату нужно повернуть в плоскости стола по часовой стрелке. Последний вариант – поворот платы в плоскости стола против часовой стрелки следует выполнить, если загорятся юго-восточный и северо-западный светодиоды. Система ориентации космического аппарата отработала задание, если погасли все светодиоды.

  1. Скачайте и распакуйте исполняемый код.
  2. Прошейте плату STM32F3DISCOVERY c гироскопом.
  3. Положите плату на горизонтальную поверхность.
  4. Нажмите кнопку Reset. Начнет мигать светодиод LED3 (N).
  5. Не трогайте плату 30 секунд. Компенсируются смещения нуля.
  6. Нажмите кнопку пользователя. Задан кватернион ориентации.
  7. Найдите ориентацию платы, при которой погаснут светодиоды.
  8. Вернитесь к пункту 6 или к пункту 4.

Примечание 1: Первый из 5 кватернионов вынуждает сохранить ориентацию платы. Отрабатывая второй кватернион, система управления двигательной установкой (т.е. ваша рука) должна развернуть плату вокруг нарисованной на плате оси "запад-восток" на 90 градусов (против часовой стрелки). Третий кватернион – для поворота платы вокруг оси "юг-север" на -90 градусов. Четвертый – поворот вокруг оси "низ-верх" платы на 45 градусов. Пятый – поворот вокруг оси "юг-север" на 90 градусов и вокруг нового положения оси "запад-восток" на 45 градусов.

Примечание 2: Перед тем как сменить задание для ориентации возвращайте плату в исходное положение. В противном случае задающие кватернионы будут приращениями к текущему положению.

Примечание 3: Величина дрейфа MEMS-гироскопа L3GD20, после процедуры коррекции смещений нуля, составляет от 3 до 10 градусов в минуту.

Структура программного кода системы ориентации КА

В программе системы ориентации космического аппарата можно выделить три важных для понимания блока кода. Первый – это главная функция main. Где включаются и конфигурируются устройства процессора, внешние микросхемы и циклически исполняется код системы ориентации (опроса гироскопа и управления реактивными двигателями).

// На время отладки программы отключаем оптимизацию кода функции main !!!
#pragma optimize=none

int main(void)
{
    // Включаем и конфигурируем используемую периферию

    // Инициализируем переменные перед входом в бесконечный цикл

    while (1)
    {
        // Ожидаем готовность данных гироскопа (1 / ODR сек)

        // Считываем значения угловых скоростей с микросхемы гироскопа

        // Вычтем смещение нуля датчиков угловых скоростей

        // Вычислим смещение нуля апериодическими звеньями с T = 10 с
        if (UserButtonCounter == 5) {

            continue; // досрочно вернемся к началу цикла
        }
        // Решим "Кинематические уравнения в кватернионной форме"

        // Смена знака ОС для "Главного сумматора" (conjugating)

        // Вычисляем ошибку системы ориентации "Главным сумматором"

        // Поменяем знак для ОС контура ограничения угловых скоростей

        // Уточним состояния тех реле, которые ограничивают угловые скорости

        // ... И тех реле, которые следят за составляющими ошибками ориентации КА

        // Рассчитаем состояние выходов двухрелейных регуляторов

        // Управляем двигателями ориентации по оси Х
        // Управляем двигателями ориентации по оси У
        // Управляем двигателями ориентации по оси Z
    }
}                                                                                 

Второй блок кода – прерывание по внешней линии (от кнопки пользователя). Где происходит смена задания на ориентацию космического аппарата.

// На время отладки программы отключаем оптимизацию кода функции прерывания
#pragma optimize=none

void EXTI0_IRQHandler(void)
{
    if ("Прерывание вызвано не кнопкой пользователя")
    { return; } // .. досрочно выйдем из функции (это ловушка)

    // Исключаем повторное прерывание от дребезга контактов

    // Ведем счет нажатий кнопки пользователя
    UserButtonCounter += 1;
    if (UserButtonCounter > 0x5) { UserButtonCounter = 0x0; }

    // Обновим задание – кватернион ориентации

    // Сбрасываем интеграторы кватерниона ориентации КА

    // Сбрасываем флаг обслуживания прерывания
    EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE);
}                                                                                 

Третий блок кода – это типовое решение – организация задержки в программах пользователя с использованием системного таймера. Это решение необходимо знать, поскольку оптимизаторы кода легко находят пустые циклы и исключают их при трансляции.

unsigned int TimingDelay = 0; // Декрементируемый счетчик тиков системного таймера

// Обработчик на векторе прерывания системного таймера (обычно 1 мс)
void SysTick_Handler(void)
{
    if (TimingDelay != 0) { TimingDelay -= 1; }
}                                                                                 

// Функция программной задержки
void Delay(unsigned int nTime)
{
    TimingDelay = nTime;
    while (TimingDelay != 0);
}

Для перехода к целочисленной арифметике необходимо определить несколько макросов (см. листинг ниже по тексту). Потребуются так же макросы тригонометрических функций: _IQsin, _IQcos, _IQatan2. С их кодом и образцами вызова можно ознакомиться в источнике [5].

typedef long    _iq;    // это _iq24, _iq22 или _iq20 в зависимости от GL_Q       

#ifndef GL_Q            // Точность типа данных для IQ-вычислений: 20 22 24
#define GL_Q 20         // Количество разрядов в слове под дробную часть
#endif
#if GL_Q == 24          // _iq24:   -128 .. +127.999 999 940    0.000 000 060
#define _IQ(A)          (long) ((A) * 16777216.0L)      // _IQ24
#elif GL_Q == 22        // _iq22:   -512 .. +511.999 999 76     0.000 000 24
#define _IQ(A)          (long) ((A) * 4194304.0L)       // _IQ22
#elif GL_Q == 20        // _iq20:  -2048 .. 2047.999 999 0      0.000 001
#define _IQ(A)          (long) ((A) * 1048576.0L)       // _IQ20
#else
#error "Wrong IQ type. Use: IQ24 or IQ22 or IQ20 or define _IQ macros"
#endif

#define _IQmpy(A, B)    (long) (((long long) (A) * (long long) (B)) >> GL_Q)
#define _IQmpy2(A)      ((A) << 1)
#define _IQdiv2(A)      ((A) >> 1)

К данной веб-странице, с целью программирования 3D-сцены, подключена библиотека glMatrix. Этим можно воспользоваться для составления массива кватернионов – заданий для системы ориентации КА. Откройте интегрированную среду разработки браузера (нажмите функциональную клавишу [F12]). Напечатайте в консоли код вызова функции, которая вычислит кватернион из углов Эйлера:

quat.fromEuler([], 90, 0, 0);

Литература

  1. STMicroelectronics. STM32F3DISCOVERY – Discovery kit with STM32F303VC MCU // STMicroelectronics web site. − URL: www.st.com/stm32f3discovery − URL: https://www.chipdip.ru/product/stm32f3discovery (дата обращения: 04.02.2018).
  2. IAR Embedded Workbench: Tools for Arm (size-limited version) // IAR Systems web site. − URL: https://www.iar.com/iar-embedded-workbench/tools-for-arm (дата обращения: 04.02.2018).
  3. Клиначёв Н.В. Комплект разработчика устройств управления электродвигателями. // Моделирующая программа Jigrein: Теория, программа, руководство, модели. – 2006-2018 гг. – URL: http://model.exponenta.ru/k2/Jigrein/md_120.htm (дата обращения: 04.02.2018).
  4. Клиначёв Н.В. Инструмент отладки программного кода системы ориентации космического аппарата. // Моделирующая программа Jigrein: Теория, программа, руководство, модели. – 2006-2018 гг. – URL: http://model.exponenta.ru/k2/Jigrein/md_133.htm (дата обращения: 04.02.2018).
  5. Клиначёв Н.В. Программный код векторной системы управления для синхронного двигателя с обработкой сигналов резольвера. // Моделирующая программа Jigrein: Теория, программа, руководство, модели. – 2006-2016 гг. – URL: http://model.exponenta.ru/k2/Jigrein/JS/fwlink.htm#AD65 (дата обращения: 04.02.2018).