[an error occurred while processing this directive]
AD9834 формула для задания фазы!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Леонтий 01 марта 2006 г. 22:35

Приобрели микросхемы DDS AD9834 для проекта «модуль генераторный». Возникли определенные сложности с программированием от микроконтроллера Atmega8515. В частности, не получается записать фазу (с точностью как указано в руководстве, удается записать только значения полученные Analog Devices Virtual Design Center для 0, 45, 90, 135, 270...360 град.) в AD9834, в то же время установка частоты от микроконтроллера, а так и фазы от ЭВМ по LTP происходит без нарушений. Для программирования микроконтроллера (на языке «С» компилятор ICCAVR ver.7.04 ImageCraft) использовались 1647921AD9834_0.PDF и Analog Devices Virtual Design Center Interactive Design Tools Direct Digital Synthesizers AD9834 Device Configuration As.

Может кто работал с фазой и получилось ли по руководству задавать фазы с точностью 0,1 град.

Программу записи частоты и фазы (8 значений) прилагаю.


const float AD_MClkFreq=25000000;
const unsigned int AD_ControlWord1=0x2100;
const unsigned int AD2=0x8000;
const unsigned int AD3=0x8000;
const unsigned int AD5=0xE000;
const unsigned int AD_ControlWord2=0x2000;
double F;
unsigned int Faz;

//SPI initialize, clock rate: 460799hz
void SPI_Init(void)
{
DDRB |= 0xB8; // Set SCK, MOSI & SS as outputs
PORTB|=BIT(4); //Fsync=1
PORTB&=~BIT(5); // очистка MOSI
PORTB&=~BIT(7); //очистка SCK
SPCR = 0x59; //setup SPI
}

void SpiWriteByte(unsigned char byte)
{
SPDR = byte;
while (!(SPSR & 0x80));
byte=SPDR;
}

void F_YST (double FF, unsigned int ph)
{
unsigned char tmp1=0, tmp2=0;
unsigned long L;
unsigned int AD4;
unsigned int AD0;
unsigned int AD1;
switch (ph)
{
case 0: {AD4=0xC000;}
break;
case 45: {AD4=0xD400;}
break;
case 90: {AD4=0xE800;}
break;
case 135: {AD4=0xFC00;}
break;
case 180: {AD4=0xD000;}
break;
case 225: {AD4=0xE400;}
break;
case 270: {AD4=0xF800;}
break;
case 315: {AD4=0xCC00;}
break;
case 360: {AD4=0xC000;}
break;
default: {AD4=0xC000;}
}
//Вычесляем частоту генерации
FF = ((FF*0x4000)*0x4000);
FF = (FF/AD_MClkFreq);
FF = floor (FF);
L = (unsigned long)(FF);
// Подготавливаем данные
AD0=( 0x4000 | ( L & 0x3FFF ) );
AD1=( 0x4000 | ( ( L >> 14 ) & 0x3FFF ) );
SPI_Init();
// Пишем в регистр контроля 0x2100
tmp1=(unsigned char)((AD_ControlWord1>>8)& 0xFF);
tmp2=(unsigned char)((AD_ControlWord1)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1
// Пишем F0 MSB
tmp1=(unsigned char)((AD0>>8)& 0xFF);
tmp2=(unsigned char)((AD0)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1
// Пишем F0 LSB
tmp1=(unsigned char)((AD1>>8)& 0xFF);
tmp2=(unsigned char)((AD1)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1*/
// Пишем F1 0x8000
tmp1=(unsigned char)((AD2>>8)& 0xFF);
tmp2=(unsigned char)((AD2)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1
// Пишем F1 0x8000
tmp1=(unsigned char)((AD3>>8)& 0xFF);
tmp2=(unsigned char)((AD3)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1
// Пишем Ph0 0xC000
tmp1=(unsigned char)((AD4>>8)& 0xFF);
tmp2=(unsigned char)((AD4)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1
// Пишем Ph1 0xE000
tmp1=(unsigned char)((AD5>>8)& 0xFF);
tmp2=(unsigned char)((AD5)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1
// Пишем в регистр контроля 0x2000
tmp1=(unsigned char)((AD_ControlWord2>>8)& 0xFF);
tmp2=(unsigned char)((AD_ControlWord2)& 0xFF);
PORTB&=~BIT(4); // Fsync установить в 0
SpiWriteByte(tmp1); // Запись байта данных
SpiWriteByte(tmp2); // Запись байта данных
PORTB|=BIT(4); // Fsync установить в 1
}

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru