Перейти к содержанию
bbh_blocked_dnftl

Dx Portal ArduinoUno и ЦАП PT8211


Рекомендуемые сообщения

Здравствуйте друзья. Изучаю программирование на Ардуино и пытаюсь подключить к нему различные микросхемки , которые попадают мне под руку. Вот и попалась мне ЦАП РТ8211 . Дешёвая микросхема , которую я снял с поломоного спутникового ресивера. Протокол работы с ней оказался не сложный по этому посидев несколько часов я написал програмку работы с ней. Принимает она по 16 бит на вывод DIN для двух каналов . Всего 32 бита получается. По переходу с 0 на 1 вывода BCK каждый бит прописывается в ячейках цап . Битов можно передавать и больше , но останутся только последние 16 , по переходу вывода WC. Изменение состояния этого вывода с 0 на 1 сохраняет в цап последние 16 битов для правого канала , а обратный для левого. Но с использованием старшего бита MSB связана какая то загадка . Вот пример какая синусоида получилась здесь http://arduino.ru/forum/obshchii/pt8211. У меня так же получилась нормальная пила и странная синусоида. Тогда я не стал использовать значения , затрагивающие старший бит , и синусоида вышла нормальная. С прямым вычислением синуса частота получилась 298 Герц. Не много конечно , но без вычислений синуса с пилой , частота на пине WS около 20 килогерц. Синусоида получилась размахом около 1.2 Вольт.

 

 

 

 

 

// программа работы с ЦАП РТ8211 пины 1 - BCK , 2 - WS , 3 - DIN , 4 - GND , 5 - +5V , 6 - Left Out , 7 - nc , 8 - Rite Out

#define Port PORTB // оределяем рабочий порт

// определим назначение пинов этого порта

// для ардуино

#define BCK 8 // to pin 1 тактовый сигнал

#define WS 9 // to pin 2 0 - правый канал , 1- левый канал

#define DIN 10 // to pin 3 16 бит данных

// для соответствующих пинов порта

#define PORT_BCK B001 // тактовый сигнал

#define PORT_WS B010 // 0 - правый канал , 1- левый канал

#define PORT_DIN B100 // 16 бит данных

#define Dt 5 // полупериод в мкс для BCK

#define MAX 32768.0 //65535.0 используем меньшие значения не затрагивая старший 16 бит

#define ZER 16384.0 //32768.0

#define pi_pi 6.2831853

#define st 0.340261

//volatile byte w =1 ;

// micros() // возвращает количество микросекунд разрешение 4 микросекунды

void setup() {

// put your setup code here, to run once:

pinMode ( BCK , 1 );

pinMode ( WS , 1 );

pinMode ( DIN , 1 );

pinMode ( 13 , 1 ) ;

noInterrupts();

}

void loop() {

// put your main code here, to run repeatedly:

unsigned int in , tt ;

float r_ad ;

double sinus ;

boolean f = 0 ;

 

 

for ( r_ad = 0 ; r_ad <= pi_pi ; r_ad += st) { // будем линейно увеличивать данные для ЦАП

//tt = micros();

//while ( micros()-tt < 20);

//digitalWrite(13, f);

 

sinus = sin(r_ad);

sinus = ZER * sinus + ZER;

in = (unsigned int)sinus;

 

BUS_Send (in) ; // отправим данные в ЦАП

f = !f ; // моргаем 13 пином

 

 

 

//interrupts();

}

}

void BUS_Send ( word Data_In ) {

// volatile byte i ;

byte Bus_Out , i = 0 ;

word temp , sdvig = 32768 ;

unsigned long Timer ;

boolean D = 1 , flag = 1 ;

Bus_Out = Port & ~(PORT_BCK + PORT_WS + PORT_DIN) ; //сбрасвываем линии

while ( i <= 31 ) { //Передаём 16 бит в правый канал 31 и 16 нулей в левый

if ( flag ) { // флаг правого левого канала

//Bus_Out = Port & ~PORT_DIN ;

if ( Data_In & sdvig ) { // определяем что передаём DIN , 0 или 1

Bus_Out |= PORT_DIN; // PORT_DIN * D ; // Выводим DIN

 

} else Bus_Out &= ~PORT_DIN;

sdvig >>= 1 ; // сдвигаем позицию следущего бита из Data_In

}

else Bus_Out &= ~PORT_DIN ;

Port = Bus_Out ;

//на этом моменте BCK = 0 , DIN установлен

// sdvig >>= 1 ; // сдвигаем позицию следущего бита из Data_In

Bus_Out |= PORT_BCK ; // подготавливаем переход BCK c 0 на 1

Port = Bus_Out ; // фиксируем бит DIN переходом BCK c 0 на 1

Bus_Out = (Bus_Out & ~PORT_BCK); // подготавливаем переход BCK с 1 на 0

if ( i == 15 ) { // формирование нулей для левого канала

Bus_Out |= PORT_WS ;// подготовка строба записи правого канала WS

flag = 0 ;

}

i++;

Port = Bus_Out ;

}

Port = Port & ~PORT_WS; // строб записи левого канала WS

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PT8211.rar

 

Читать дальше

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...