24230

[i] Работа с блоком цифрового расчета поворота координат CORDIC в МК K1986ВК01GI

Автор статьи: Лампадов Илья Александрович (Инженер)
Дата последнего изменения: 17.10.2022 16:04:11

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

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

Проект, рассмотренный в статье, входит в состав установочного пака для IDE Keil с названием "cordic", начиная с версии 1.4, тем не менее, в качестве справки проект также доступен для скачивания после статьи, в подразделе "Файлы для скачивания".

Особенности работы блока 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”, ссылка на статью с рассмотрением которого есть в начале статьи, в проекте "cordic" из состава установочного пака для IDE Keil есть два набора настроек: для запуска из оперативной памяти и из внутренней. Выбор нужных настроек для запуска осуществляется при помощи меню Select Target.

Для корректного запуска из Flash-памяти необходимо проверить, настроена ли трассировка в блоке ITM, чтобы функция printf() смогла выводить данные в консоль при выполнении режима отладки. Сделать это можно в соответствии со статьей "Printf через ITM". Частоту при настройке "Core Clock" установить равную 8 МГц. Важно дополнительно отметить, что интерфейс ITM работает строго в режиме SWD.

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

Для корректного запуска проекта из оперативной памяти (RAM) необходимо убедиться, что файл 0x02000000.ini, находящийся в папке с проектом, подключен к проекту в виде файла инициализации (вкладка "Debug" настроек проекта), как показано на рисунке 2:

Рисунок 2 - Подключение файла инициализации к проекту при запуске из оперативной памяти

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

Теги

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