Atmega8+DDS AD9850

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

Так-с постепенно вникаю, но даже такой простой код с комментариями, как говорится "чужой код потемки" (это я про себя :)) )
Вот так я представляю, что можно работать с переменной freq
Спойлер

Код: Выделить всё

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
                                             Соединение Меги с AD9850:
                                             MOSI ---> D7
                                             SCK ---> W_CLK
                                             PB2 ---> FQ_UD
Date    : 26.05.2013
Author  : PerTic@n
Company : If You Like This Software,Buy It
Chip type               : ATmega8
AVR Core Clock frequency: 8,000000 MHz
*****************************************************/
#include <mega8.h>
#include <spi.h>
#define FQ_UD PORTB.2         // подключен вывод FQ_UD AD9850
/*********** Переменные **************/
     union un_dataword                  //5 Байт, объединение  содержит данные для передачи AD9850
     {
     unsigned long dataword_freq;      // 32 бит слово,  для управления частотой
     unsigned char dataword_byte[5]; // массив для побайтного доступа
     }un;
unsigned long freq =0;        // частота Гц
unsigned char i;                             // счетчик
float k = 34.359738368;    // коэффициент  4294967296/F = 34.359738368 для 125MHz тактовой
           
void set_frq(void)
{
          un.dataword_byte[4]=0b00000000;  // два младших бита (0 и 1) Обязательно = 0.
                                        // бит 2 устанавливает режим Power-Down
                                        // пять старших бит управляют фазой.
           un.dataword_freq = freq*k;       //  частота
           FQ_UD =1;
           FQ_UD =0;
                     for (i=0; i<5; i++)
                     {
                     spi(un.dataword_byte[i]);
                     }
           FQ_UD =1;
           FQ_UD =0; 
}     
void main(void)
{
PORTB=0x00;
DDRB=0x2D;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x70;
SPSR=0x00;

TWCR=0x00; 
while (1)
      {
               set_frq();
               freq = 500000;       
      }
}

Но эт пока теория, надо на практике проверить что будет если freq = 39999999;
bobr25 спасибо.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Garin писал(а):"чужой код потемки"

Если что-то в моем коде непонятно, спрашивайте поясню.

Garin писал(а):Вот так я представляю, что можно работать с переменной freq


Вроде правильно все, только мне непонятно для чего в основном цикле непрерывно вливать данные в DDSку?
Или это только для примера?

Garin писал(а):что будет если freq = 39999999

Теоретически будет работать до частоты равной половине тактовой.
т.е. 125/2=62,5МГц но качество сигнала при этом будет никакое.
На 39.999999 побочных излучений будет много, но как-то работать будет.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

Да какие там вопросы если это
Спойлер

Код: Выделить всё

    union un_dataword                  //5 Байт, объединение  содержит данные для передачи AD9850
     {
     unsigned long dataword_freq;      // 32 бит слово,  для управления частотой
     unsigned char dataword_byte[5]; // массив для побайтного доступа
     }un;

на тарелочке мне преподнесено , и мне это ни о чем не говорит, точнее я неправильно выразился я понял что это работа с массивом в 5 слов, но начнав подобный свой проект я это применить себе не смогу.
Хотя вопрос все же есть , есть ли возможность сделать управление с любых ног МК? (не через SPI)
Вот подобное видел
В результате. первый вариант через SPI

Код: Выделить всё

void show_dig() { 
SS=0; //Ни чего не кажем
          if (dig_num==0) {
          dig_data=show_data; //Если показываем первую цифру обнавляем переменную
          dig_num++;
          }
                    spi(dig_num); //Отправляем байт для отображения разряда
                    spi(led_table[dig_data%10]); //Получаем разряд из dig_data и отправляем байт с цифрой
                    dig_data/=10;
                    dig_num<<=1; //Смещаем бит для отображения следующего разряда
SS=1; //Показываем разряд
}


Второй вариант управление с любых ног

Код: Выделить всё

void show_dig() { 
unsigned char data[2];
unsigned char i;
ST_CP=0;
if (dig_number==0) dig_data=show_data; //Если показываем первую цифру обнавляем переменную
data[0]=dig_data%10; //Получаем разряд
dig_data/=10;
data[0]=led_table[data[0]]; //Получаем данные для сигментов
data[1]=1<<dig_number;
          for (i=0;i<8;i++) {
          DS=data[1]&1;
          SH_CP=1;
          SH_CP=0;
          data[1]>>=1;
          }
                         for (i=0;i<8;i++) {
                         DS=data[0]&1;
                         SH_CP=1;
                         SH_CP=0;
                         data[0]>>=1;
                         }
dig_number++;
if (dig_number>7) dig_number=0;
ST_CP=1;
}

Опробовал я в работе два этих варианта, работают без нареканий, но второй вариант очень удобен , нет привязки к определенным ногам МК при проектировании схемы.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Garin писал(а):работа с массивом в 5 слов

Это не совсем массив, хотя и массив тоже.

union un_dataword это объединение (или смесь) размером 5 байт т.е. 5*8=40 бит.
размер определяет самый большой элемент входящий в объединение,
в данном случае массив unsigned char dataword_byte[5].
Еще в union un_dataword входит переменная unsigned long dataword_freq
ее размер 4 байта или 32 бита
Элементы объединения занимают один и тот-же кусок памяти и все начинаются с нулевого бита.
Получается что содержимое переменной dataword_freq (4 байта) и содержимое первых четырех элементов массива dataword_byte ([0...3]) совпадает.
Это дает возможность обращаться к одним и тем же данным либо целиком, либо по частям. Иногда это удобно.

Объединение union un_dataword содержит в себе целиком "Управляющее слово" для DDSки.
"Управляющее слово" состоит из 5 байт, первые 4 из которых это данные о частоте и еще один байт содержит данные о фазе и два служебных бита(они должны быть нулями).
Первые 4 байта вместе - это переменная dataword_freq, когда мы из частоты в герцах получаем данные для передачи в DDSку, мы их запихиваем в эту переменную. Затем дописываем еще один байт в последний элемент массива dataword_byte[4] и все, данные для передачи готовы. Дальше скармливаем по очереди все элементы массива функции spi для передачи.

Garin писал(а):есть ли возможность сделать управление с любых ног МК? (не через SPI)

Можно. Нужно взять (готовую или написать самому) функцию софтового SPI и скормить ей те-же данные.
Вся разница только SPI железный или програмный, мне был удобней железный.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

Спасибо за разъяснения , продолжаю вникать.
Сегодня наконец то получил посылку, в реальности это оказалась совсем маленькая платка с разъемом на 20 контактов.
Изображение
Даташит на буржуйском http://www.analog.com/static/imported-f ... AD9850.pdf единственное что уяснил, питать можно до 5 вольт..
Подстроечник R13 Adj Duty Ratio , не совсем понял что за коэф. заполнения..
Ноги --> W_CLK ---> FQ_UD---> D7 промаркированы, это хорошо
--->ZOUT1 - ZOUT2 --->QOUT1 - QOUT2 выход , думаю после запуска осциллографом увижу, что там прямоугольник, что синус..
---> D0 - D6, data, reset , остаются свободными?....
И не понял про какую перемычку, было написано у продавца в информации.
Спойлер
Прямоугольная и синусоуголная форма сигнала 0-40МГц.
После 20-30 МГц гармоники возрастают, форма сигнала будет меньше и менее чистой.
Параллельный и последовательный ввод данных может быть выбран с помощью перемычки.

Изображение
Да и мелкосхема этой платы, не сильно тут подробная....
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

ZOUT - синус
QOUT - прямоугольник

Подстроечник регулирует скважность прямоугольника.

Garin писал(а):D0 - D6, data, reset , остаются свободными?....
И не понял про какую перемычку, было написано у продавца в информации.

D2 нужно соединить с GND (для последовательного режима передачи данных) остальное все на платке сделано (в моем экземпляре так)
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

Подключил испытываю, синус прямоугольник - есть :)
D2 нужно соединить с GND

А D2, на что оно отражается? подсоединяю - разъединяю изменений никаких не вижу.
И такой факт, схемка потребляет почти 0.1А, не многовато для такой мелкой схемы?
И щас определю до какой частоты прямоугольник без искажений и покажу осциллограмму.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

с отключенной D2 по идее не должны загружаться данные в DDSку в последовательном режиме.

по поводу потребления вот кусок из даташита


AD9850_Power_supply.png
(45.62 КБ) 1047 скачиваний
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

Пока все опробовал на макетке, D2 никак у меня не повлияло,
в остальном результат положительный, частоты в МК пока установил фиксированные, пробовал разные от 1 герца,
программа управляет частотой адекватно. :beer:

Озадачился я пока другим, измерением сигнала после 1 мегагерца
Изображение
На синусе и прямоугольнике видно этакий "звон"
Изображение
вот чуть растянул, его видно лучше
Изображение
На 10 МГц естественно он стал поболее.

Изображение
25 МГц

Изображение
39МГц

Ожидал что увижу картину получше, не исключаю что во первых это пока все на макетке, второе осциллограф у меня совсем недавно.
В общем пока повозился , пробовал сделать "имитацию" экрана вокруг платки, общий провод подключал по разному ,хз что я тут еще не знаю.
С одной стороны по сравнению с моими ранними поделками все равно тут прогресс, так как генератор что у меня был на 4 МГц уже совсем не выдавал прямоугольник.
Вот пока так.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

У меня осциллограф старенький, одноканальный, и частоты выше 2 МГц посмотреть не могу.
Но на частотах ниже 2 МГц синус был чистый.
Не должно таких искажений быть.

Попробуйте увернут подстроечник до пропадания прямоугольника.

Чем питаете?
Может поможет пара конденсаторов с VCC на GND 0.1 - 1 мкФ керамика + электролит.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

На низких частотах результат отличный
Изображение
А в мегагерцах эт еще нужно делать правильно делать измерения, все влияет, и нужно делать "правку" на того, кто делает измерения :)
Вот статейка http://radiokot.ru/circuit/digital/measure/103/ , по большому счету эффект тот - же что и у меня,
и цена вопроса меня очень устраивает модуль DDS на AD9850 7у.е.
плюс ваш код с помощью которого реально можно управлять этим модулем в своих поделках.
Частоты которые мне пока реально были нужны для тестов максимум были 250кГц, так что пока полный порядок.
Вложения
6565 006.png
(9.47 КБ) 4825 скачиваний
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Я про питание и про отключение прямоугольника заговорил потому, что искажения на синусе идут сразу после фронта и спада на прямоугольнике. Было бы интересно посмотреть на осциллограмму при частоте 10 - 15 МГц с отключенным прямоугольником.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

Питание от трансформаторного блока питания, напряж. 4.5 вольт
Вот отключил прямоугольник, , щуп 1:1, на 15 там все красиво и до 25 МГц нормально, дальше синусоида искривляется.

Изображение
15 МГц

Изображение
25 МГц
Вложения
15 003.png
25 МГц
(8.46 КБ) 5038 скачиваний
15 002.png
15 МГц
(9.38 КБ) 5098 скачиваний
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Спасибо за осциллограммы, а то у меня возникли сомнения в пригодности этих модулей для моих целей.
Мне от них нужен синус до 20 МГц.
Аватара пользователя
Yusff
Встал на лапы
Сообщения: 124
Зарегистрирован: Сб окт 20, 2012 14:07:16

Re: Atmega8+DDS AD9850

Сообщение Yusff »

C синусом не все так страшно:
СпойлерИзображение

СпойлерИзображение

Конечно ФНЧ на платке сильно подсаживает сигнал и режет его после 40 МГц, но в поделках использовать можно.
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: Atmega8+DDS AD9850

Сообщение C@at »

Сделал себе тоже такой генератор

Изображение

Нормальная вещь получилась.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Спасибо за осциллограммы и видео.
НИК2
Встал на лапы
Сообщения: 97
Зарегистрирован: Вт мар 12, 2013 18:28:34
Откуда: Тула

Re: Atmega8+DDS AD9850

Сообщение НИК2 »

C@at писал(а):Сделал себе тоже такой генератор

Изображение

Нормальная вещь получилась.

Платкой не поделитесь? :)
С уважением.
kt610
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пн июн 10, 2013 16:43:50

Re: Atmega8+DDS AD9850

Сообщение kt610 »

привет с новым 2014 годом. интересует ета тема, но мне надо ad9850+lcd12864 winstar /vfo transiwera al bend / есть в baskomavr исходники . но на LCD 128-64 нету ничево только на LCD1602 собраны с разных форумов . выкладую так на обзор. но невсе. если ктото попробует делом помочь надо выложу больше . я сам неочень шарю в написание прогром. много конструкций повторил . просто очень хочу сделать в трансивер. С DDS VFO. на индикаторе lcd12864 winstar .
Вложения
150409.jpeg
типа так
(97.01 КБ) 779 скачиваний
file.rar
(180.67 КБ) 309 скачиваний
Аватара пользователя
Moto_v3x
Потрогал лапой паяльник
Сообщения: 307
Зарегистрирован: Ср мар 31, 2010 11:45:58
Откуда: Славянск

Re: Atmega8+DDS AD9850

Сообщение Moto_v3x »

В баском есть свои библиотеки для дисплеев 128х64 на контролерах ks0108 и t6963, у вас какой? Но к атмеге 8 наверно не подключить выводов не хватит.
Ответить

Вернуться в «AVR»