Введение
В данной курсовой работестоит задача разработать специализированное цифровое устройство — процессорCORDIC, являющееся отдельным законченным модулем для расчёта значений обратнойтригонометрической функции arcSin(Z) и функции возведения в степень числа arCth(Z).
Устройство такого родаможет использоваться в сложной комплексной системе, реализующей расчёткоординат, расстояния или размера объекта, либо может найти своё применение всистемах навигации и позиционирования. Такие приборы широко используются вразличных сферах жизнедеятельности, начиная от строительных площадок изаканчивая сверхточными системами позиционирования объектов в космосе.
Данное устройство должносочетать в себе как высокое быстродействие, так и необходимую точностьвычисления. Исходя из задания, в основе работы устройства лежит метод Волдера«Цифра за цифрой». Этот метод представляет собой ряд итерационных формул, врезультате расчёта которых происходит процесс поворота вектора до нужного угла.
Общая идея методасводится к следующему. Последовательным умножением аргумента на заранеевыбранные константы, приблизить аргумент с заданной точностью для одних функцийк единице, для других функций — к нулю. Однако, для того, чтобы само значениефункции при этом оставалось неизменным, необходимо одновременно совершатьэквивалентные действия над выбранными константами. При выборе значений константособым образом удается существенно упростить вычисления значений функции.
Промоделировавматематическую модель метода Волдера в пакете Scilab, ее необходимо реализоватьпрактически на интегральных микросхемах. Построить такое устройство можно какна отдельных микросхемах низкой степени интеграции выполняющих определённыефункции, либо на программируемой логической матрице, либо на готовоммикроконтроллере.
Каждый из этих способовимеет свои преимущества и недостатки, поэтому необходимо выбрать наиболееэффективный и экономичный среди них.
Для построения устройствана ПЛИС необходимо его смоделировать в САПР на языке VHDL. При использованиимикроконтроллера необходимо написать программу либо на языке ASSEMBLER, либо налюбом другом языке программирования высокого уровня, например C++. Таким образом,разработка и построение цифрового устройства является комплексной и весьмасложной задачей, требующей глубоких знаний во многих компьютерных дисциплинах.
Большинство цифровыхсистем строится на микропроцессорах либо на микроконтроллерах. И при помощимикропроцессорных систем происходит управление различными технологическимипроцессами и отдельными операциями. Данные системы практически универсальны,так как они имеют очень высокое быстродействие, и достаточную разрядность для выполненияточных расчетов на производстве. А так же используя в данных системах ППЗУвозможно при помощи одной компьютерной системы управление различнымоборудованием. То есть необходимо изменение только программы управления.
1. АНАЛИЗПОСТАВЛЕННОЙ ЗАДАЧИ
В курсовой проектенеобходимо реализовать специализированный математический процессор длявычисления элементарных функций arcSin(Z) и arCth(Z).
Эти функции можнореализовать методом Волдера «Цифра за цифрой», метод Меджита и др. Оба этиметода основаны на ряде итерационных формул, которые приведены в таблице 1.1.Основное их различие заключается в том, что в методе Меджита на первом этапесразу рассчитываются все направляющие коэффициенты. В данном устройстве будемиспользоваться метод Волдера «Цифра за цифрой», так как он требует меньшихаппаратных затрат и обладает достаточной точностью вычислений.
В таблице 1 приведеныитерационные формулы для вычисления заданных элементарных функций по методуВолдера «Цифра за цифрой».
Табл.1 - Метод Волдера для расчёта ArcSin(z).
Вычисление />
/>
/>
/>
/>
/>
Вычисление />
/>/>/> />
/>
Данное устройство должноявляться частью комплексного прибора, поэтому оно должно иметь разъём дляподключения и все соответствующие интерфейсные сигналы.
Устройство получаетданные от главного модуля и передаёт ему обратно результат. Данные передаются вформате с фиксированной точкой. На целую часть отводится 7 разрядов и 1знаковый, на дробную часть также отводится 16 разрядов. Передача осуществляетсяпо интерфейсу I2C(TWI). Выбран именно этот интерфейс так как в нём реализованораспознавание пакетов (начало, конец, распознавание собственных адресов длякаждого устройства, что является хорошим способом и альтернативным вариантомдля предотвращения коллизий).
1.1 Расчетразрядности представления данных и числа итераций
Произведём расчёт числаитераций и разрядности в математическом пакете SciLab.
Определим диапазондопустимых значений заданных элементарных функций. Исследуем итерационныеформулы для вычисления Θ = arcth Z:
/>
Тогда границы значенийфункции, при которых метод Волдера является верным, лежит в следующем пределе:
/>
При этом Z для функцииΘ = arch Z должно находиться в следующем диапазоне:
/>
Определим диапазондопустимых значений аргументов функции 2Z, а затем диапазон значенийсамо функции.
/>
Тогда границы значенийфункции, при которых метод Волдера является верным, лежит в следующем пределе:
/>
Следовательно функциябудет изменяться в диапазоне:
/>.
Рассчитаем минимальноечисло итераций при погрешности преобразования равной 0,01% и максимальнойвыходной величине 4,685:
/>
Тогда количестово разрядов данных составит:
/>.
1.2Разработка итерационных алгоритмов вычисления функции в математическом пакетеSciLab
Промоделируем в пакетематематического моделирования MatLab метод Волдера «Цифра за цифрой» дляанализа его работоспособности и определения погрешности вычислений.
В цикле подсчитаемзначение абсолютной погрешности при изменении количества итераций от 1 до n ипри изменении разрядности данных (дробная часть задается от 1 до 16 бит).
Листинг программы дляисследования погрешности при изменении числа итераций:
//== functionarch ====
//function[archZ] = arch(Z,N)
Q0 = 0;
x0 =0.6072529;
y0 = 0;
N=20;
Z= 0.512
acos_ist =asin(Z)
for n=1:N
Q(1)=Q0+atan(2^(-0));
r(1)=sign(Z-y0);
x(1)=x0-y0*2^(-0);
y(1)=y0+x0*2^(-0);
for i=1:n
r(i)=sign(Z-y(i));
// ARTH=atan(2^(-i));
Q(i+1)=Q(i)+r(i)*atan(2^(-i));
x(i+1)=x(i)-r(i)*y(i)*2^(-i);
y(i+1)=y(i)+r(i)*x(i)*2^(-i);
end
arcsinZ(n)=Q(n);
asin_ist =asin(Z);
pogr(n)=(asin_ist-arcsinZ(n))/asin_ist*100;
end
scf(1);
clf();
plot(pogr);
xgrid();
//endfunction
//////////////////////////////////////////////////////////////
Q0 = 0;
x0 =0.6072529;
y0 = 0;
for n=1:20
m=3;
Q(1)=Q0+atan(2^(-0));
Q(1)=conv(n,m,Q(1));
r(1)=sign(Z-y0);
x(1)=x0-y0*2^(-0);
x(1)=conv(n,m,x(1));
y(1)=y0+x0*2^(-0);
y(1)=conv(n,m,y(1));
for i=1:20
r(i)=sign(Z-y(i));
// ARTH=atan(2^(-i));
Q(i+1)=Q(i)+r(i)*atan(2^(-i));
Q(i+1)=conv(n,m,Q(i+1));
x(i+1)=x(i)-r(i)*y(i)*2^(-i);
x(i+1)=conv(n,m,x(i+1));
y(i+1)=y(i)+r(i)*x(i)*2^(-i);
y(i+1)=conv(n,m,y(i+1));
end
arcsinZ(n)=Q(20);
asin_ist =asin(Z);
pogr(n)=(asin_ist-arcsinZ(n))/asin_ist*100;
end
scf(2);
clf();
plot(pogr);
xgrid();
Запустив приведеннуюпрограмму, мы получим график зависимости погрешности от числа итераций:
/>
Рис.1.1 — График абсолютнойпогрешности для функции Θ = arcsin Z при изменяющемся числе итераций
По полученным графикамвидно как ведёт себя погрёшность преобразования. При количестве итераций меньше10 погрешность достигает 5%. По заданию требуется, чтобы погрешность составляламеньше 1%, это достигается при n = 13 и более.
Листинг программы дляизменения разрядности данных:
clear
clc
//== functionconvert real to bin ====
function[x_bin] = conv(n,m,x)
//преобразование целойчасти
x_int = abs(int(x));
x_tmp=x_int;
for j=1:m
x_tmp =x_tmp/2
if(x_tmp-int(x_tmp))==0
arr_tmp(j)=0
else
arr_tmp(j)=1
x_tmp =int(x_tmp)
end
end
x_cel = 0;
for j=1:m
x_cel =x_cel+arr_tmp(j)*2^(j-1)
end
//преобразование дробнойчасти
x_real = x- x_int;
for i=1:n,
x_real =x_real * 2;
if x_real
arr(i)=0;
else
arr(i)=1;
x_real=x_real-1;
end,
x_real1=1-int(x_real)
end
x_new=0;
for i=1:n
x_new=x_new+arr(i)*2^(-i)
end
x_bin=x_cel+x_new
endfunction
/>
Рис.1.2 — Графикабсолютной погрешности для функции Θ = arch Z при изменении разрядностидробной части
Изменяя количество бит,приходящихся на дробную часть, исследуется влияние разрядности данных наточность вычислений. Из графика видно, что необходимая точность достигается приразрядности дробной части 13 и более.
Исследуем точность итерационныхформул для функции arcth Z в математическом пакете SciLab. Ниже приведен кодпрограммы, которая вычисляет погрешность вычисления методом Волдера заданнойфункции при изменении числа итерации и разрядности дробной части.
Листингпрограммы:
clear
clc
//== functionconvert real to bin ====
function[x_bin] = conv(n,m,x)
//преобразование целойчасти
x_int = abs(int(x));
x_tmp=x_int;
for j=1:m
x_tmp =x_tmp/2
if(x_tmp-int(x_tmp))==0
arr_tmp(j)=0
else
arr_tmp(j)=1
x_tmp =int(x_tmp)
end
end
x_cel = 0;
for j=1:m
x_cel =x_cel+arr_tmp(j)*2^(j-1)
end
//преобразование дробнойчасти
x_real = x- x_int;
for i=1:n,
x_real =x_real * 2;
if x_real
arr(i)=0;
else
arr(i)=1;
x_real=x_real-1;
end,
x_real1=1-int(x_real)
end
x_new=0;
for i=1:n
x_new=x_new+arr(i)*2^(-i)
end
x_bin=x_cel+x_new
endfunction
//========================================
function[arth_i]=arth(x)
arth_i =1/2*log((1+x)/(1-x));
endfunction
//== functionarcth ====
//function[arcthZ] = arcth(Z,N)
Q0 = 0;
x0 = 1;
Z=2.25;
y0 = Z;
N=40;
Q(1)=Q0+arth(2^(-1));
r(1)=sign(1-y0);
x(1)=x0-r(1)*y0*2^(-1);
y(1)=y0-r(1)*x0*2^(-1);
for n=1:N
for k=2:n
i=1+int((k-1)/2);
r(k)=sign(1-y(k-1));
ARTH=arth(2^(-i));
Q(k)=Q(k-1)+r(k)*ARTH;
x(k)=x(k-1)-r(k)*y(k-1)*2^(-i);
y(k)=y(k-1)-r(k)*x(k-1)*2^(-i);
end
arthZ(n)= Q(n)
y_ist =1/2*log((1+Z)/(1-Z))
// z_i =(exp(y_ist)+exp(-y_ist))/2
pogr(n)=(y_ist-arthZ(n))/y_ist*100;
end
scf(1);
clf();
plot(pogr);
xgrid();
//endfunction
for n=1:20
m=3;
Q(1)=Q0+arth(2^(-1));
Q(1)=conv(n,m,Q(1));
r(1)=sign(Z-x0);
x(1)=x0+r(1)*y0*2^(-1);
x(1)=conv(n,m,x(1));
y(1)=y0+r(1)*x0*2^(-1);
y(1)=conv(n,m,y(1));
last=26;
for k=2:last
i=1+int((k-1)/2);
r(k)=sign(Z-x(k-1));
ARTH=arth(2^(-i));
ARTH=conv(n,m,ARTH);
Q(k)=Q(k-1)+r(k)*ARTH;
Q(k)=conv(n,m,Q(k));
x(k)=x(k-1)+r(k)*y(k-1)*2^(-i);
x(k)=conv(n,m,x(k));
y(k)=y(k-1)+r(k)*x(k-1)*2^(-i);
y(k)=conv(n,m,y(k));
end
archZ(n)=Q(last);
y_ist =log(Z+sqrt(Z^2-1));
pogr(n)=(y_ist-archZ(n))/y_ist*100;
end
scf(2);
clf();
plot(pogr);
xgrid();
/>
Рис.1.3 — Графикабсолютной погрешности для функции arcthZ при изменяющемся числе итераций
/>
Рис.1.4 — Графикабсолютной погрешности для функции arcthZ при изменении разрядности дробнойчасти
Из приведенных графиков видно,что минимальное число итерации должно составить 12, а минимальное числоразрядов – 12. То есть рассчитанное число итераций и разрядность данныхсоответствуют результатам моделирования.
2.РАЗРАБОТКА СТРУКТУРНОЙ СХЕМЫУСТРОЙСТВА
Устройства подключаетсячерез разъём к Управляющей компьютерной системе(УКС), от которой оно будетполучать управляющие сигналы, данные и которому оно будет в ответ выдаватьрезультат вычисления.
Анализируя поставленнуюзадачу можно определить основные блоки включающие в себя устройство.
Так сигналы от УКС будутпоступать на устройство ввода-вывода информации (УВВ), которое можетприсутствовать только абстрактно в нашем устройстве.
Из устройства вводавывода данные будут поступать в ОЗУ, а управляющие сигналы непосредственно вблок управления. Блок управления (УУ) должен синхронизировать и контролировать работувсего модуля в целом. При этом он должен вырабатывать сигналы чтения и записииз ОЗУ и ПЗУ, а также сигналы управления блоком вычислений (ОБ).
В ОЗУ хранятся входныевеличины, промежуточные данные и результат. В ПЗУ может хранитьсямикропрограмма вычисления, а также таблицы значений констант таких как Arth(2-i),log(1+ri2-i) и 2-i,.
Это один из возможныхвариантов структурной схемы. Ее можно реализовать на ПЛИС или на интегральныхсхемах средней степени интеграции. Реализации на ПЛИС более дорогая итрудоемкая в сравнении с другими способами. На интегральных микросхемах среднейстепени интеграции устройство получится более дорогое, так как требуетсябольшое количество дополнительных микросхем, и будет обладать меньшимбыстродействием, чем при реализации на микроконтроллере. Поэтому мы остановимсяна реализации устройства на микроконтроллере
2.1 Обоснованиедостаточности аппаратных средств и программных ресурсов
Данное устройство будетреализовано на микроконтроллере AVR фирмы ATMEL, так как они наиболеераспространённые и доступные по цене. Для реализации данного устройства достаточноиспользовать 8-ми разрядный микроконтроллер ATmega16, который по своим параметрамвполне удовлетворяет всем требованиям проекта и имеет запас программных иаппаратных средств для введения дополнительных функций и усовершенствованияданного специализированного процессора.
AT mega16 обладаетследующими характеристиками:
· 8-разрядный высокопроизводительныйAVR микроконтроллер с малым энергопотреблением
· ПрогрессивнаяRISC архитектура
1. 130 высокопроизводительных команд,большинство команд выполняется за один тактовый цикл,
2. 32 8-разрядных рабочих регистраобщего назначения
Полностью статическаяработа
3. Производительность приближается к 16MIPS (при тактовой частоте 16 МГц)
4. Встроенный 2-цикловый перемножитель
· Энергонезависимаяпамять программ и данных
1. 16 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash):
-обеспечивает 1000 цикловстирания/записи
- дополнительный секторзагрузочных кодов с независимыми битами блокировки
— Внутрисистемноепрограммирование встроенной программой загрузки
- Обеспечен режимодновременного чтения/записи (Read-While-Write)
2. 512 байт EEPROM:
— Обеспечивает 100000циклов стирания/записи
3. 1 Кбайт встроеннойSRAM
— Программируемаяблокировка, обеспечивающая защиту программных средств пользователя
· Интерфейс JTAG(совместимый с IEEE 1149.1)
· Программируемый последовательныйUSART
· Последовательныйинтерфейс SPI (ведущий/ведомый)
· Специальныемикроконтроллерные функции
1.Сброс по подаче питанияи программируемый детектор кратковременного снижения напряжения питания
2.Встроенныйкалиброванный RC-генератор
3. Внутренние и внешниеисточники прерываний
4. Шесть режимовпониженного потребления: Idle, Power-save, Power-down, Standby, ExtendedStandby и снижения шумов ADC
· Выводы I/O икорпуса
32 программируемые линииввода/вывода
40-выводной корпус PDIP и44-выводной корпус TQFP
· Рабочиенапряжения 4,5 — 5,5 В
· Рабочая частота 0- 16 МГц
· Корпус: DIP-40
Контролер имеет тривнешних прерывания, подключаемых к одному из портов. Обмен информацией с УКСможно производить по интерфейсу SPI.
2.2 Выбори обоснования режимов работы узлов микроконтроллера
Для ввода и вывода данныхбудем использовать интерфейс SPI (Serial Peripheral Interface) — полнодуплексный скоростной синхронный трёхпроводной интерфейс. В используемомМК интерфейс SPI реализован на старших выводах порта В.
SPI в реализации Atmelимеет четыре задаваемые программно скорости передачи, может передавать байты отстаршего к младшему биту и наоборот, обнаруживает ошибки пакета.
За работу интерфейсаотвечают 3 регистра:
· Регистр SPCR — регистр управления
SPIE — разрешениепрерывания по окончанию передачи.
SPE — SPI включен. Еслиустановлен этот бит, то выводы #SS, MISO,
MOSI и SCK работают каквыводы SPI, иначе — как простые выводы порта.
DORD — направлениепередачи данных. Если установлен, то передача идёт с младшего бита, еслисброшен — со старшего.
MSTR — если установлен,контроллер работает как Master, если сброшен — как Slave. Управляется такжевыводом #SS, если он настроен на ввод — при подаче «0» на #SS битMSTR сбрасывается.
CPOL — определяет уровеньна выходе SCK в режиме ожидания — SCK = CPOL
CPHA — если установлен,передача и приём бита производится по обратному фронту, если сброшен — попрямому.
SPR1, SPR0 — делительтактовой частоты (F — частота генератора контроллера).
SPR1SPR0Частота
00F/4
01F/16
10F/64
11F/128
· Регистр SPSR — регистр состояния
· Регистр SPDR — регистр данных
Также мы испольуем линиипорта D, на выводы которого подаются внешние прерывания – PD2(INT0) и PD3(INT1).
Для задания работы портовиспользуются регистры DDR и PORT, соответствующих портов. Режимы работы портовприведены в таблице1.
В те моменты, когдаустройство не востребовано, будем переводить его в спящий режим Power Down,выход из которого осуществляется по прерыванию. Данный режим работы описан втаблице 2.
Прерывания будемобрабатывать по переднему фронту, для этого занесём соответствующее значение врегистр MCUCR.
2.3Формирование тактовых импульсов
Тактироватьмикроконтроллер можно несколькими способами: использовать внешний тактирующийсигнал, либо подключать внешний кварцевый резонатор или RC-цепочку, либоиспользовать встроенный генератор с внутренней RC- цепочкой. Всё зависит от тойзадачи, которую мы решаем.
Использование встроенногоRC-генератора с внутренней время задающей RC-цепочкой является наиболее экономичнымрешением, так как при этом не требуется никаких внешних компонентов.
Внутренний RC-генераторамикроконтроллеров семейства мега может работать на нескольких фиксированныхчастотах.
Частота работывнутреннего RC-генератора определяется значениями битов CKSEL3-0 согласно табл.3.
В разрабатываемомустройстве высокая частота, а соответственно и высокая скорость работы ненужна, поэтому вполне достаточно будет выбрать частоту тактирования равную 4.0МГц.
2.4Организация сброса
В данном случае нетсмысла использовать отдельную кнопку сброса, сброс будет осуществляться повключению питания либо по внешнему сигналу сброса от устройства управления. Привключении устройства подаётся питание на контроллер и автоматическиосуществляется сброс, при выключении устройства, просто снимается питание сконтроллера.
Для предотвращения сбоевработы контролера и выполнения программы при скачке напряжения, используемвстроенную схему сброса при снижении питания BOD, которая отслеживаетнапряжение питания. Если работа этой схемы разрешена, то при снижении питанияниже некоторого уровня она переводит контроллер в состояние сброса. Когданапряжение вновь увеличится до порогового значения, запускается таймер задержкисброса. После формирования задержки tTOUT внутренний сигнал сбросаснимается и происходит запуск микроконтроллера.
Включением/выключениемсхемы BOD управляет конфигурационная ячейка BODEN. Для разрешения работы схемыэта ячейка должна быть запрограммирована в «0». Порог срабатывания VBOTопределяется состоянием конфигурационной ячейки BODLEVEL, при «1» порог срабатывания2.7 В, при «0» порог 4 В.
Для уменьшениявероятности ложных срабатываний порог напряжения переключения схемы имеетгистерезис, равный 50 мВ. Кроме того, срабатывание схемы BOD происходит тольков том случае, если период провала больше 2 мкс.
Задание длительностизадержки сброса tTOUT определяется значением конфигурационных ячеек,и включает в себя две составляющих: ts – выход на рабочий режим и стабилизациячастоты тактового генератора, tr – для установки напряжения питания. Прииспользовании встроенного RC-генератора с внутренней RC-цепочкой при включённойсхеме BOD, биты конфигурации SUT1-0 установлены в значение «00», при этом ts= 6тактов, tr –соответственно не используется.
2.5 Схемавключения микроконтроллера
В микроконтроллере ATmega16 используется напряжение 5 В, подаваемое на вход VCC. Вход AREFиспользуется для подключения внешнего фильтрующего конденсатора для повышенияпомехозащищенности.
3.ПРОЕКТИРОВАНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯМИКРОКОНТРОЛЛЕРА
3.1 Алгоритмработы устройства
/>
Рис.3.1 — Алгоритм работыустройства
Описание алгоритмапрограммы микроконтроллера:
1. Подача напряженияпитания на устройство, автоматически происходит сброс и запуск внутреннегогенератора тактовых импульсов;
2. Инициализациярежимов работы контролера и его внутренних устройств (портов, интерфейсов ит.д.);
3. Переход вэнергосберегающий режим ожидания Power Down;
4. Ожиданиепрерывания INT1, выводящего контролер из спящего режима;
5. При приходесигнала SS происходит загрузка регистров SPI и прием данных по MISO от УКС.
6. Анализ полученныхданных. Если получена команда 1 – запуск вычисления функции arcth Z, еслиполучена команда 2 – функции arcsin Z.
7. Начало вычислениязаданной функции:
1 этап вычислений- расчет ri, Xi (для функции arcth Z) или ri, Qi (для функции arcsin Z);
2 этап вычислений– расчет Yi, Qi или Xi
8. Установка флагазавершения вычислений;
9. Выдача результатапо MOSI;
10. Ожиданиепрерывания либо INT0 переводящего в спящий режим контроллер, либо INT1запускающего следующий расчёт.
3.2Разработка программного обеспечения
Листинг программы наязыке C++ для микроконтроллера ATmega16:
//== Библиотеки ========================================
#include
#include
#include«ctype.h»
#include«stdlib.h»
//== GlobalVariables =====================================
#define TRUE 1
#define FALSE 0
#define COM1 0x01//команданачала вычислении arCthZ
#define COM2 0x02 //команданачала вычислении arcsinZ
#define GICRMask 0xC0 //разрешениепрерываний Int0 Int1
#define MCUCRMask 0xCF //спящийрежим POWER Down прерывания по низкому уровню
#definenMCUCRMask 0x0F //запрет режима POWER Down
// биты для настройки SPI
#define MOSI 5 //выходныйданные передаются по 5 биту порта В
#define SCK 7 // импульсысинхронизации передаются по 7 биту порта В
#define SS 4 //битупарвляющий передачей данных
#define SPIE 7 //разрешениепрерываний по SPI
#define SPE 6 //включение SPI
#define MSTR 4 //МК врежиме мастер
#define SPR0 0// делитель на 16
#defineCLRBIT(ADDR,BIT) (ADDR&=~(1
#defineSETBIT(ADDR,BIT) (ADDR|=(1
unsigned char com;//переменнаядля хранения полученной команды
unsigned char DATA[4];//массивданных, в котором хранится полученное значение Z
unsigned char DATA_SEND[4];//массивданных, в котором хранится результат вычислений
unsigned char DDR_SPI; //переменнаядля настройки работы порта В
unsigned char SPIF = 0;//флагзавершения передачи/приема данных по SPI
unsigned char FlagInt1 = 0//флагполучения прерывания INT1 – вывод МК из спящего режима
unsigned char FlagInt0 =0;//флаг получения прерывания INT0 – перевод МК в спящий режим
unsigned charFlagCalcReady = 0; //флаг завершения вычислений
//== Const=============================================
// Table of2^(-i) ---------------------------------------------
floatdva[15]={0.5,0.25,0.125,0.0625,0.03125,0.015625,
0.0078125,0.00390625,0.001953125,0.0009765625,
0.00048828125,0.000244140625,0.0001220703125, 0.00006103515625,
0.00003051758125};
// Table ofArth -------------------------------------------------
loat ath[13]={0.5493061,0.2554128,0.1256572,0.0625816,0.0312602,0.0156263,
0.0078127,0.0039063,0.0019531,0.0009766,0.0004883,0.0002441,
0.0001221 };
floatlog1[13]={0.5849625, 0.3219281,0.169925, 0.0874628, 0.0443941, 0.0223678,
0.0112273,0.0056245, 0.0028150, 0.0014082, 0.0007043, 0.0003522,
0.0001761};
floatlog2[13]={1, 0.4150375, 0.1926451, 0.0931094, 0.0458037, 0.0227201, 0.0113153,
0.0056466,0.0028205, 0.0014096, 0.0007046, 0.0003523, 0.0001761};
//=====================================================
voidGlobalInitialize(void)
{
#asm(«cli»);
DDRB =DDR_SPI;
PORTB = 0xD0;
DDRD = 0x00;//PortD as input
PORTD = 0x0C; //подключениерезисторов подтяжки к выводам PD2, PD3
GICR=GICRMask;
MCUCR=nMCUCRMask;
#asm(«sei»);
}
//=====================================================
voidInit_SPI_SLAVE(void)
{
//настройка интерфейса врежим подчиненный
DDR_SPI=(1
//прием по MISO,тактовый сигнал и сигнал выбора МС на ввод
SPCR |= (1
SPCR |= (1
}
//== функция приемасообщений ============================
voidSPI_SlaveReceive(void)
{
unsigned chari;
for(i=0; i
{
while(!(SPSR &(1
com = SPDR;
SPIF = FALSE;
}
for(i=1;i
{
while(!SPIF); //ждемзавершения передачи байта
DATA[i-1] =SPDR;
SPIF = FALSE;
}
}
//== функция передачи данных =============================
voidSPI_SlaveSend(void)
{
unsigned chari;
for (i = 0;i
{
SPDR = DATA_SEND[3-i];//сохр данный в регистре данных SPI
while(!SPIF); //ждемзавершения передачи
SPIF = FALSE; //установкафлага завершения передачи в 0
}
FlagCalcReady = 0;
}
//====преобразованияданных в формат с плавающей запятой =======
floatchar_to_Float(void)
{
float tmp=0;
float a=255;
tmp =(DATA[3]*a);//преобразование целой части
tmp=tmp+DATA[2];
tmp=tmp+(DATA[1]/a);//преобразование дробнойчасти
tmp=tmp+(DATA[0]/a/a);
return tmp;
}
//=====================================================
voidFloat_to_char(float tmp)
{
intdata_tmp=0;
data_tmp=(int)tmp;
DATA_SEND[3]=data_tmp>>8;
DATA_SEND[2]=data_tmp;
data_tmp=(int)((tmp-data_tmp)*65025);
DATA_SEND[1]=data_tmp>>8;
DATA_SEND[0]=data_tmp;
}
//=====================================================
float arCth(floatZ)
{
float aCh;
floatX0=1.45235,X1=0,Y0=0,Y1=0,Q0=0,Q1=0;
unsigned chari,n;
for(n=1;n
{
i = 1 +((n-1)>>1);
if ((Z-Q0)>=0) //определениезнака итерации
{
Q1=Q0 + ath[i-1]; //вычислениеZ
X1=X0 + Y0*dva[i-1];//вычисление Xi=arcthZ
Y1=Y0 +X0*dva[i-1]; //вычисление Yi=sh(arChZ)
}
else
{
Q1=Q0 — ath[i-1]; //вычисление Z
X1=X0 — Y0*dva[i-1];//вычисление Xi=arcthZ
Y1=Y0 — X0*dva[i-1]; //вычисление Yi=sh(arChZ)
}
//сохранение предыдущихзначений
Q0=Q1;
X0=X1;
Y0=Y1;
}
aCh = Q1;
FlagCalcReady= 1;
return aCh;
}
//=====================================================
float arcsinZ (floatZ)
{
float as;
float X0=1.0, X1=0.0,Q0=0.0, Q1=0.0;
unsigned chari,n;
for(n=1;n
{
i = 1 + ((n-1)>>1);
if ((Z-Q0)>=0) //определениезнака итерации
{
Q1=Q0 + log1[i]; //вычислениеугла
X1=X0 + X0*dva[i];//вычисление Xi
}
else
{
Q1=Q0 — log2[i];//вычисление Z
X1=X0 — X0*dva[i];//вычисление Xi
}
Q0=Q1;
X0=X1;
}
as = X1;
FlagCalcReady=1;
return as;
}
//=====================================================
voidmain(void)
{
unsigned charnSS; //сигнал выборамикросхемы
float Z, ans;
Init_SPI_SLAVE();//инициализация SPI
GlobalInitialize(); //настройкапортов ввода-вывода
while(1)
{
if (FlagInt0) //обработкапрерывания Инт0
{
FlagInt0=0;
MCUCR=MCUCRMask; //разрешениевключения спящего режима
#asm(«SLEEP»);} //переход в спящий режим
}
if (FlagInt1)
{
FlagInt1=0;
nSS = PORTB & 0x10; //маскадля выделения бита PORTB4
if (nSS == 0)
{
SPI_SlaveReceive();
if (com ==COM1)
{
Z =char_to_Float();
ans = arCth(Z);
}
if (com ==COM2)
{
Z =char_to_Float();
ans = arcsin(Z );
}
}
if(FlagCalcReady)
{
Float_to_char(ans);
SPI_SlaveSend();
}
}
}
//=interrupt==============================================
interrupt[EXT_INT0] void INT0_interrupt(void) //обработка прерывания Int0
{
FlagInt0 = 1;//установка флага
}
interrupt[EXT_INT1] void INT1_interrupt(void) //обработка прерывания Int1
{
FlagInt1 = 1; //установкафлага
MCUCR=nMCUCRMask;//запрет спящего режима
}
4.АНАЛИЗ РАБОТОСПОСОБНОСТИ ПРОГРАММЫ
Откомпилировав написаннуюпрограмму в CodeVision, проанализируем её работу в симуляторе AVRStudio4.
В пошаговом режиме будем тестироватьпрограмму, подавая в нужные моменты на входы контроллера соответствующиесигналы. По имеющимся в отладчике часам определим время получения одногозначения.
На рис.4.3 показанырезультаты вычислений функции arch при получении следующей посылки: com = 0x01,Z = 1.7997576 (после преобразования посылки в формат с плавающей запятой). Врезультате вычислений получено: arch Z = 1,1927513. Истинное значениесоставляет arch Z = 1,1927565. Погрешность составляет:/>, что находится в пределахзаданной.
Ниже отображенырезультаты вычислений пр получении другой посылки от УКС. В ней com = 0x02, Z =1.0468 (после преобразования посылки в формат с плавающей запятой). Врезультате вычислений получено: arcsinZ = 2,0657325. Истинное значениесоставляет arcsinZ = 2,06594. Погрешность составляет:/>, что находится в пределахзаданной.
По значению переменнойStopWatch можно подсчитать время всего преобразования:
T=7141,5 мкс, чтосоставляет 7,1 мс и вполне удовлетворяет техническому заданию.
Заключение
В данной работе былпромоделирован и реализован процессор CORDIC. Данный процессор способенвыполнять вычисление различных элементарных функций, таких кактригонометрические, логарифмические и другие. Однако в данном случае стоялазадача реализовать только функции arCth Z и arcsinZ.
Вычисление заданнойфункции устройство выполняет в соответствии с техническим заданием с заданнойточностью и в течении заданного периода времени.
Структурная схема, разработаннаяв этой работе, конечно, не единственно возможная и, тем более, не максимальнопроизводительная. Но на ее примере можно усвоить основные принципы построенияспециализированных цифровых вычислительных систем, таких как процессор CORDIC.
Данное устройствоявляется универсальным и может быть использовано в любом комплексномустройстве. Для согласования работы данного устройства с ведущим устройством невозникает никаких сложностей, так как оно может работать асинхронно, приниматьи генерировать прерывания.