====== Пример работы блока цифрового расчета поворота координат CORDIC в Электросиле ====== Ранее, в одной из [[https://startmilandr.ru/doku.php/prog:spec:proj_elpower|статей]], мы уже рассматривали пример работы с микроконтроллером для управления электроприводами “Электросила”. Теперь мы ознакомимся с отдельным блоком сопроцессора для тригонометрических преобразований. Работать будем с отладочной платой на базе Электросилы. Проект, рассмотренный в статье, предназначен для того, чтобы продемонстрировать работу этого блока, проводя вычисления **sin, cos** для разных форматов данных (//integer, float 32, float 16//) и **atan** формата //float 32//. **Проект из статьи всегда доступен для скачивания на [[https://github.com/StartMilandr/Examples/tree/master/ESila_CORDIC|GitHub]]** ===== Особенности работы блока CORDIC ===== Блок осуществляет конвейерную обработку входящих данных * Время обработки данных от входа в блок до появления результата на выходе – 35 тактов * Блок может принимать данные на вход каждый такт * Блок работает в 3 форматах входных-выходных данных: -//32 числа с плавающей точкой;// -//16 битные числа с плавающей точкой;// -//32 битные целые знаковые числа. Для данного режима входной диапазон ограничен 24 битами (то есть от 0xFF000000 до 0x00FFFFFF);// * Блок реализует метод двойного повтора с компенсацией деформации * Блок работает в 2 режимах поворота: -//Поворот входного вектора на заданный угол// -//Поворот входного вектора до оси ОХ по часовой стрелке с определением начального угла и длины вектора (деформированное значение)// * Блок осуществляет поворот входного вектора в диапазоне углов (-360; +360) градусов - //360 градусов для режимов с плавающей точкой соответствует значению 1.0;// - //360 градусов для целочисленных режимов соответствует значению 0x01000000;// //Структурная схема блока представлена на рисунке ниже// {{doc:mk:mkee:cordic_struct.png}} ===== Работа модуля ===== При появлении на входе всех 3 значений (x, y, α), модуль загружает данные и начинает их обработку, через 35 тактов модуль выдаст результат обработки. Модуль имеет следующие стадии работы: * Преобразование числа с плавающей точкой в 25 битное знаковое целое (для форматов с плавающей точкой) * Выравнивание порядков переменных X, Y (для форматов с плавающей точкой) * Вычисление дополнительных углов для двойного поворота (α + β) и (α - β) * Нормировка квадранта (для двух параллельных CORDIC): - Для режима поворота вектора до оси ОХ выполняется до 4 поворотов на 90 градусов, пока вектор не окажется в 1 квадранте - Для режима поворота вектора на угол выполняется до 4 поворотов на 90 градусов, пока угол поворота не окажется в диапазоне ± 90 градусов. * 25 последовательные операций на двух параллельных CORDIC * Усреднение полученных данных с двух CORDIC * Восстановление порядка (для форматов с плавающей точкой) * Выдача результата на выход ===== Настройка проекта для запуска из ОЗУ и FLASH ===== Как и в проекте //“Hello, World”//, ссылка на статью с рассмотрением которого есть в начале статьи, в проекте есть два набора настроек: для запуска из оперативной памяти и из внутренней. Выбор нужных настроек для запуска осуществляется в //Select Target//. **Обратите внимание, что если Вы хотите запустить программу из Flash памяти, то необходим FLM-файл, отвечающий за корректность записи кода во внутреннюю память микроконтроллера. Он входит в состав проекта с именем MLDR149.FLM. Его нужно поместить в папке с установленной Keil по адресу Keil/ARM/Flash, а так же указать к нему путь как показано на картинке ниже.** {{doc:mk:mkee:cordic_flm.png}} Из особенностей можно выделить то, что для рассмотрения правильности работы примера нужно указать путь к файлу **MLDR124.SFR**. Данный файл используется для отображения регистров периферии в //IDE Keil// в режиме отладки. Его можно найти в папке со скачанным проектом. Файл нужно указывать в настройках //Target//, выставив галочку// “Use Custom File”// и указав путь, где он располагается (при распаковке проекта в любую директорию укажите путь к папке проекта с названием файла). На картинке ниже показана настройка файла. {{doc:mk:mkee:cordic_sfr.png}} И важно, что для запуска из FLASH и корректной работы вывода посчитанных значений с помощью интерфейса **ITM**, помимо его настройки, требуется указать файл инициализации для FLASH-памяти. Вспомним, что в проекте //"Hello, World"// работоспособность не страдала от отсутствия данного файла. Настройка показана на рисунке ниже. {{doc:mk:mkee:cordic_ini.png}} Все остальные настройки не отличаются от проекта //“Hello, World”//, поэтому обязательно ссылайтесь на статью с рассмотрением данного примера. Все расчёты тригонометрических функций будут так же выводиться в отладочную консоль с помощью **ITM** интерфейса. Поэтому уделите настройке интерфейса особое внимание. **ITM работает только в режиме программирования SW.** ===== Как работает программа ===== Основные настройки блока задаются в регистре управления модулем **CRD_CTRL**. Таблица на рисунке ниже. Она так же доступна в спецификации на микроконтроллер. {{doc:mk:mkee:cordic_ctrl.png}} Обратите внимание на код, где для расчёта синусов и косинусов используется //IN_MODE = 0//, а так же все три формата входных данных, задающихся занесением в регистр **CTRL** //IN_FORMAT// значения. Арктангенс считается для режима //IN_MODE = 1// и //IN_FORMAT = 0// (32 бита, плавающая точка). Перед расчётом функций блоком сопроцессора считается эталонное значение в соответствии с заголовочным файлом стандартной библиотеки //math.h//. Далее идёт вычисление тригонометрических функций методом CORDIC с помощью поворота входного вектора. В конечном счёте через функцию //printf()// должно выводиться посчитанное методом CORDIC значение для определенной итерации (радиана), а так же эталонное значение, после которого следует подсчёт отклонения полученной величины от эталона. После запуска проекта из ОЗУ или ПЗУ с настроенным интерфейсом **ITM** и окном //printf()// в отладке, мы сможем наблюдать вывод посчитанных тригонометрических функций с отклонением от посчитанного калькулятором значения. По результатам можно видеть, что отклонение очень маленькое, что указывает на высокую точность преобразования. Наглядно на рисунке ниже. {{doc:mk:mkee:cordic_final.png}} Находясь в режиме отладки, помимо просмотра посчитанных значений в //printf()//, у нас так же есть возможность просматривать все значения из регистров микроконтроллера. За это отвечает файл **.SFR**, который мы привязали при настройке проекта. Давайте выведем окошко со значениями регистра CORDIC (**CRD**). Наглядно на рисунке ниже. {{doc:mk:mkee:crd_debug.png}} Теперь посмотрим регистры микроконтроллера после первоначальной настройки блока. По картинке можно видеть, что программа, которая дошла до точки останова, правильно отображает состояние регистров микроконтроллера, которые были выставлены программой. Таким образом можно отследить ход выполнения всей программы. {{doc:mk:mkee:crd_debug2.png}}