24230

Пример работы блока цифрового расчета поворота координат CORDIC в Электросиле

Автор статьи: Лампадов Илья Александрович (Инженер)
Дата последнего изменения: 17.06.2021 09:39:20

Ранее, в статье "Создаем проект “Hello, World” на микроконтроллер для управления электроприводами “Электросила”. Запуск из ОЗУ и внутренней памяти.", уже рассматривалcя пример работы с микроконтроллером для управления электроприводами “Электросила”. В этой статье будет представлено ознакомление с отдельным блоком сопроцессора для тригонометрических преобразований.

Работа будет вестись с отладочной платой на базе микроконтроллера "Электросила". Проект, рассмотренный в статье, предназначен для того, чтобы продемонстрировать работу блока тригонометрических преобразований, проводя вычисления sin, cos для разных форматов данных (integer, float 32, float 16) и atan формата float 32.

Проект из статьи всегда доступен для скачивания после статьи, в подразделе "Файлы для скачивания".

Особенности работы блока CORDIC

Блок осуществляет конвейерную обработку входящих данных.

  • Время обработки данных от входа в блок до появления результата на выходе – 35 тактов;
  • Блок может принимать данные на вход каждый такт;
  • Блок работает в 3 форматах входных-выходных данных:
  1. 32 числа с плавающей точкой;
  2. 16 битные числа с плавающей точкой;
  3. 32 битные целые знаковые числа. Для данного режима входной диапазон ограничен 24 битами (то есть от 0xFF000000 до 0x00FFFFFF);
  • Блок реализует метод двойного повтора с компенсацией деформации;
  • Блок работает в 2 режимах поворота:
  1. Поворот входного вектора на заданный угол
  2. Поворот входного вектора до оси ОХ по часовой стрелке с определением начального угла и длины вектора (деформированное значение)
  • Блок осуществляет поворот входного вектора в диапазоне углов (-360; +360) градусов:
  1. 360 градусов для режимов с плавающей точкой соответствует значению 1.0;
  2. 360 градусов для целочисленных режимов соответствует значению 0x01000000;

Структурная схема блока представлена на рисунке 1:

Рисунок 1 - Структурная схема блока цифрового расчёта поворота координат CORDIC

Работа модуля

При появлении на входе всех 3 значений (x, y, α), модуль загружает данные и начинает их обработку, через 35 тактов модуль выдаст результат обработки. Модуль имеет следующие стадии работы:

  • Преобразование числа с плавающей точкой в 25 битное знаковое целое (для форматов с плавающей точкой);
  • Выравнивание порядков переменных X, Y (для форматов с плавающей точкой);
  • Вычисление дополнительных углов для двойного поворота (α + β) и (α - β);
  • Нормировка квадранта (для двух параллельных CORDIC):
  1. Для режима поворота вектора до оси ОХ выполняется до 4 поворотов на 90 градусов, пока вектор не окажется в 1 квадранте
  2. Для режима поворота вектора на угол выполняется до 4 поворотов на 90 градусов, пока угол поворота не окажется в диапазоне ± 90 градусов.
  • 25 последовательные операций на двух параллельных CORDIC;
  • Усреднение полученных данных с двух CORDIC;
  • Восстановление порядка (для форматов с плавающей точкой);
  • Выдача результата на выход.

Настройка проекта для запуска из ОЗУ и FLASH

Как и в проекте “Hello, World”, ссылка на статью с рассмотрением которого есть в начале статьи, в проекте есть два набора настроек: для запуска из оперативной памяти и из внутренней. Выбор нужных настроек для запуска осуществляется при помощи меню Select Target.

Обратите внимание, что если есть необходимость запустить программу из Flash памяти, то необходим FLM-файл, отвечающий за корректность записи кода во внутреннюю память микроконтроллера. Он входит в состав проекта с именем MLDR149.FLM. Его нужно поместить в папке с установленной Keil по адресу Keil/ARM/Flash, а так же указать к нему путь как показано на картинке 2.

Рисунок 2 - Подключение FLM-файла для работы проекта с внутренней памятью в IDE Keil

Для рассмотрения правильности работы примера рекомендуется указать путь к файлу MLDR124.SFR. Данный файл используется для отображения регистров периферии в IDE Keil в режиме отладки. Его можно найти в папке с приложенным проектом. Файл нужно указывать в настройках Target, выставив галочку “Use Custom File” и указав путь, где он располагается (при распаковке проекта в любую директорию необходимо указать путь к папке проекта с названием файла). На рисунке 3 показан алгоритм подключения SFR-файла.

Рисунок 3 - Алгоритм подключения SFR-файла в IDE Keil

Важно отметить, что для запуска из FLASH и корректной работы вывода посчитанных значений с помощью интерфейса ITM, помимо его настройки, требуется указать файл инициализации для FLASH-памяти во вкладке Debug (сам файл инициализации доступен в папке с проектом). Настройка показана на рисунке 4.

Рисунок 4 - Подключение файла инициализации для корректной работы с FLASH-памятью

Все оставшиеся настройки не отличаются от проекта “Hello, World”, поэтому обязательно нужно ознакомиться со статьёй, на которую есть ссылка в начале статьи.

Все расчёты тригонометрических функций будут также выводиться в отладочную консоль при помощи ITM интерфейса. Поэтому важно уделить настройке интерфейса особое внимание.

Обратите внимание, что ITM работает только в режиме программирования SW.

Алгоритм работы программы

Основные настройки блока задаются в регистре управления модулем CRD_CTRL. Таблица с описанием битов регистра представлена на рисунке 5 и взята из спецификации на микроконтроллер.

Рисунок 5 - Таблица описания регистра CRD_CTRL

Если ознакомиться с кодом проекта, то можно увидеть, что для расчёта синусов и косинусов используется IN_MODE = 0, а так же все три формата входных данных, задающихся изменением поля IN_FORMAT.

Арктангенс считается для режима IN_MODE = 1 и IN_FORMAT = 0 (32 бита, плавающая точка).

Перед расчётом функций блоком сопроцессора считается эталонное значение в соответствии с заголовочным файлом стандартной библиотеки math.h. Далее идёт вычисление тригонометрических функций методом CORDIC с помощью поворота входного вектора.

В конечном счёте после запуска проекта из ОЗУ или ПЗУ, через функцию printf() выводиться посчитанное методом CORDIC значение для определенной итерации (радиана), а так же эталонное значение, после которого следует подсчёт отклонения полученной величины от эталона.

По результатам работы блока можно видеть, что отклонение очень маленькое, что указывает на высокую точность преобразования. Наглядно на рисунке 6.

Рисунок 6 - Результат работы блока цифрового расчёта поворота координат CORDIC

Находясь в режиме отладки, помимо просмотра посчитанных значений в printf(), имеется также возможность просматривать все значения из регистров микроконтроллера. За это отвечает файл .SFR, привязка которого ранее рассматривалась в статье при настройке проекта. Вывести окошко со значениями регистра CORDIC (CRD) можно по следующей инструкции, которая представлена на рисунке 7.

Рисунок 7 - Алгоритм вывода значений регистра CORDIC (CRD) в режиме отладке IDE Keil

В этом окне можно просматривать значения полей регистра микроконтроллера после первоначальной настройки блока. По рисунку 8 можно видеть, что программа, которая дошла до точки останова, правильно отображает состояние регистров микроконтроллера, которые были выставлены программой. Аналогичным способом можно отслеживать ход выполнения преобразований.

Рисунок 8 - Сопоставление значений из окна регистра CRD_CTRL с тем, что было выставлено в коде программы. Режим отладки в IDE Keil


Сохранить статью в PDF

Файлы для скачивания

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

Standard Peripherals Library + software pack для Keil MDK 5
Standard Peripherals Library + software pack для Keil MDK 5
ОФИЦИАЛЬНАЯ СБОРКА
Standard Peripherals Library – библиотека для микроконтроллеров.

Теги

Была ли статья полезной?