Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 2 из 21 ПерваяПервая 1234512 ... ПоследняяПоследняя
Показано с 11 по 20 из 201

Тема: Работаем с AD9832

  1. #11

    Регистрация
    03.04.2008
    Адрес
    г. Киев
    Сообщений
    28
    Позывной
    ur4mck
    Вот, как и обещал, прошивка и схема подключения ATmega8 к AD9832 (см. на схеме сигналы с префиксом "DDS_")

    Прошивка тестовая, она писалась и компилируется без ошибок в AVR Studio 4.13 SP2 build 571.

    Назначения ножек см. в файле main.asm, функции работы с DDS AD9832 - в файле dds.asm, функции пересылки данных по последовательному интерфейсу - в файле serial.asm. Все файлы снабжены комментариями. Если возникнут проблемы, обращайтесь помогу чем смогу.
    Прошивку предоставляю "как есть", можете свободно модифицировать и использовать ее или ее части в своих проектах.

    Успехов!
    Вложения Вложения

  2. Спасибо от veso74


  3. #12
    Спасибо UR4MCK, но для меня ассемблер.... туговат.
    Исходя из пересмотренных мною данных, сначала надо инициализировать DDS.
    1. Биты инициализации: 1111100000000000
    2. Затем запись MSB H: 110011000000 +4бита F
    3. запись MSB L: 100010000000 +4бита F
    4. запись LSB H: 110001000000 +4бита F
    5. запись LSB L: 100000000000 +4бита F
    6. И переход в спящий режим: 1000000000000000
    Это так у "китайца", потом только вводятся данные частоты пункты 2, 3, 4 и 5. Кто сталкивался с этим подскажите что не правильно я делаю.[/i]
    73! Александр UR4QBP

  4. #13

  5. #14
    Аватар для Explorer
    Регистрация
    07.09.2006
    Адрес
    Лисичанск
    Сообщений
    951
    Записей в дневнике
    1
    Позывной
    UR7MA
    to Александр Карнаух
    1. 1111 1000 0000 0000

    2. 0011 0011 0000 0000 + 8бит F
    3. 0010 0010 0000 0000 + 8бит F
    4. 0011 0001 0000 0000 + 8бит F
    5. 0010 0000 0000 0000 + 8бит F

    6. 1100 0000 0000 0000
    Frequency Reg 0 (pin DDS FSELECT - GRD )

  6. #15

    Регистрация
    03.04.2008
    Адрес
    г. Киев
    Сообщений
    28
    Позывной
    ur4mck
    Alex007 дал хорошие ссылки! В частности по "AD9832 Device Configuration Assistant". Знал бы я про них раньше, сэкономил бы целый вечер. А так сам разбирался по datasheet, вооружившись бумагой, ручкой и осциллографом. Но это тоже полезно. После того, как разобрался все показалось достаточно просто. О встретившихся мне подводных камнях также расскажу.

    Итак, постановка задачи:
    Есть плата с напаянными вместе с "обвязкой"ad9832 , тактовым генератором и atmega8. Плата и пайка проверена на отсутствие замыканий. Микроконтроллер настроен (fuse bits), программируется и работает с тестовой программой (например, "hello, world"). В качестве примера будем считать, что и ad9832,и генератор, и atmega8 работают от 5V. Пусть также DDS_MCLK = 16 MHz. Также (в качестве упрощения) предполагаем, что ножка выбора частоты (FSELECT) dds выбирают частоту из регистра FREG0, а ножки выбора фазы (PSEL0, PSEL1) выбирают фазу из регистра PHASE0.
    Цель: запрограммировать ad9832 так, чтобы на выходе было 5.5 MHz.

    Алгоритм:

    0. Инициализация микроконтроллера и портов ввода вывода:
    (DDS_FSYNC = 1, DDS_SCLK = 0, DDS_SDATA = 0)

    1. Выполнить задержку на несколько десятков миллисекунд (подбирается экспериментально) чтобы дать возможность стабилизироваться питанию на dds (там обычно ставять конденсаторы большой емкости) и тактовому генератору выйти в рабочий режим.

    2. Инициализация DDS
    2.1 Выполняем программный сброс ad9832:
    (SLEEP = 1, RESET = 1, CLR = 1 (см. табл. IX из ad9832 datasheet), получается слово (16 бит): 0b1111|1000|0000|000 0 = 0xf800
    2.1.1: DDS_FSYNC = 0
    2.1.2: передаем старший байт 0b11111000 (порядок бит - MSB - от старшего к младшему)
    2.1.3: передаем младший байт 0b00000000
    2.1.4: DDS_FSYNC = 1

    2.2 Первый раз устанавливаем значение выходной частоты:
    Частота расчитывается следующим образом:
    Fout = FREG0 * Fmclk / 2^32, где
    Fout - частота на выходе dds, Hz (5.5 MHz в этом примере);
    FREG0 - значение регистра, определяющего частоту (32 бит);
    Fmclk - тактовая частота dds, Hz (16 MHz в этом примере);
    2^32 = 4 294 967 296.

    Решая это простое уровнение относительно FREG0, находим:
    FREG0 = (Fout / Fmclk) * 2^32;
    FREG0 = (5 500 000 / 16 000 000) * 2^32 = 1 476 395 008 = 0x58000000.

    (пишем старший (3-й) байт FREG0
    2.2.1: DDS_FSYNC = 0
    2.2.2: передаем байт 0b00110011 (выбор 3-го байта из FREG0)
    2.2.3: передаем байт 0b0101|1000 = 0x58
    2.2.4: DDS_FSYNC = 1

    (пишем 2-й байт FREG0
    2.2.5: DDS_FSYNC = 0
    2.2.6: передаем байт 0b00100010 (выбор 2-го байта из FREG0)
    2.2.7: передаем байт 0b0000|0000 = 0x00
    2.2.8: DDS_FSYNC = 1

    (пишем 1-й байт FREG0
    2.2.9: DDS_FSYNC = 0
    2.2.10: передаем байт 0b00110001 (выбор 1-го байта из FREG0)
    2.2.11: передаем байт 0b0000|0000 = 0x00
    2.2.12: DDS_FSYNC = 1

    (пишем младший (0-й) байт FREG0
    2.2.13: DDS_FSYNC = 0
    2.2.14: передаем байт 0b00100000 (выбор 0-го байта из FREG0)
    2.2.15: передаем байт 0b0000|0000 = 0x00
    2.2.16: DDS_FSYNC = 1

    2.3 Переводим dds в оперативный режим
    (SLEEP = 0, RESET = 0, CLR = 0)
    2.3.1: DDS_FSYNC = 0
    2.3.2: передаем старший байт 0b1100|0000
    2.3.3: передаем младший байт 0b00000000
    2.3.4: DDS_FSYNC = 1

    Все, после этого DDS выдает на выходе 5.5MHz.
    В дальнейшем при перестройке dds выполняются только шаги 2.2.1 - 2.2.16 (см. подпрограмму dds_tune из моей прошивки)

    Комментарий: как легко видеть, DDS_FSYNC - это огибающая (активный уровень - '0') для данных, посылаемых по последовательному интерфейсу. Данные посылаются по линиям DDS_SCLK, DDS_SDATA и считываются ядром dds по заднему фронту DDS_SCLK. Я делал так:
    1. выставить в порту бит b (DDS_SDATA = b);
    /* do_clock */
    2. DDS_SCLK = 1;
    3. пауза1
    4. DDS_SCLK = 0;
    5. пауза2
    (обычно пауза2 < пауза1, и подбирается так, чтобы DDS_SCLK был похож на меандр, хотя это и необязательно)

    Подводные камни.
    Когда я в свое время разбирался с ad9832, то были такие трудности:
    1. все сигналы и данные передаваемые на dds правильные (каждый бит проверялся вручную по осциллографу), но все равно на выходе dds нет никакого сигнала.
    Причина: а) недостаточный уровень сигнала DDS_MCLK, b) недостаточный или черезмерный(!) уровень на сигнальных линиях DDS_SDATA, DDS_SCLK, DDS_FSYNC (актуально, когда напряжение питания dds и мк отличаются)

    2. даже при отсутствии питания на dds он производит частоту на выходе (но только после нескольких последовательных вызовов dds_tune и довольно случайным образом).
    Причина: превышен уровень сигналов DDS_MCLK, DDS_SDATA, DDS_SCLK, DDS_FSYNC (одного или нескольких). Проявилось когда питание dds было около 3.0 V, а atmega8 и тактового генератора 5.0 V. Устранилось путем установки резистивных делителей на этих ножках.

    Вот пока все, что в подробностях я смог описать. Надеюсь, ничего не напутал и не забыл. Если все еще будут проблемы, спрашивайте.

    Удачи в конструировании!
    ---
    Dmitry ur4mck

  7. Спасибо от veso74

  8. #16
    Дмитрий, спасибо большое за алгоритм, все понятно. Но не хочу глупо выглядеть, но не получается у меня на Си из "слов" (HEX или BIN) побитно вытягивать каждый бит отдельно. Просто не знаю как это сделать, надо наверное на форум "Кота" заглянуть, если тут никто не откликнется. В "Коте" ребята оперативно отвечают.
    73! Александр UR4QBP

  9. #17

    Регистрация
    25.09.2006
    Адрес
    Москва
    Сообщений
    180
    Позывной
    rv3bj
    Александр Карнаух
    не получается у меня на Си из "слов" (HEX или BIN) побитно вытягивать каждый бит отдельно. Просто не знаю как это сделать
    Самый наглядный способ
    1. Скопировать слово в temp того же типа
    2. Наложить маску temp = temp & 10000000
    3. После этого в temp будет значения старшего бита
    и так далее для всех других битов

  10. #18
    Цитата Сообщение от rv3bj
    Александр Карнаух
    не получается у меня на Си из "слов" (HEX или BIN) побитно вытягивать каждый бит отдельно. Просто не знаю как это сделать
    Самый наглядный способ
    1. Скопировать слово в temp того же типа
    2. Наложить маску temp = temp & 10000000
    3. После этого в temp будет значения старшего бита
    и так далее для всех других битов
    Не могли бы вы подробней описать.
    73! Александр UR4QBP

  11. #19
    Цитата Сообщение от rv3bj
    Александр Карнаух
    не получается у меня на Си из "слов" (HEX или BIN) побитно вытягивать каждый бит отдельно. Просто не знаю как это сделать
    Самый наглядный способ
    1. Скопировать слово в temp того же типа
    2. Наложить маску temp = temp & 10000000
    3. После этого в temp будет значения старшего бита
    и так далее для всех других битов
    Вот функция записи по маске:
    void save_dds()
    {
    unsigned long int temp;
    FSYNC=1; SCLK=1;
    FSYNC=0; temp=data; temp=temp & 10000000; SDATA=temp; SCLK=0; delay_us(5);
    SCLK=1; temp=data; temp=temp & 01000000; SDATA=temp; SCLK=0; delay_us(5);
    SCLK=1; temp=data; temp=temp & 00100000; SDATA=temp; SCLK=0; delay_us(5);
    SCLK=1; temp=data; temp=temp & 00010000; SDATA=temp; SCLK=0; delay_us(5);
    SCLK=1; temp=data; temp=temp & 00001000; SDATA=temp; SCLK=0; delay_us(5);
    SCLK=1; temp=data; temp=temp & 00000100; SDATA=temp; SCLK=0; delay_us(5);
    SCLK=1; temp=data; temp=temp & 00000010; SDATA=temp; SCLK=0; delay_us(5);
    SCLK=1; temp=data; temp=temp & 00000001; SDATA=temp; SCLK=0;
    FSYNC=1;
    }
    data=11001100;
    Сигналы на осциллографе:
    PD0 FSYNC
    PD1 SDATA
    PD2 SCLK
    Что неправильно?
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	10845_1207304560.jpg_161.jpg 
Просмотров:	628 
Размер:	12.0 Кб 
ID:	19072  
    73! Александр UR4QBP


  12. #20

    Регистрация
    03.04.2008
    Адрес
    г. Киев
    Сообщений
    28
    Позывной
    ur4mck
    Попробую я описать.

    Код:
    #define SCLK_DELAY 128
    
    void send_byte(const char byte) {
        int i, j;
        char tmp;
    
        tmp = byte; /* temporary byte holder to work with */
    
       /* Cycle for each bit in byte (MSB first) */
       for (i = 0; i < 8; i++) {
           if (tmp & 0x80) /* Check for most significant bit (bit15) */
                  /* Send '1' */
           else   /* Send '0' */
    
           tmp <<= 1; /* Get next bit in bit15 */
    
           /* do clock */
           /* set SLCK = '1' */
          for (j = SCLK_DELAY; j > 0; j--);   /* some delay */
          /* set SCLK = '0' */
          for (j = SCLK_DELAY - 8; j > 0; j--);   /* another delay */
       }
    }
    
    void dds_init(void) {
    
        /* Reset DDS */
        /* set FSYNC = '0' */
        send_byte(0x58);
        send_byte(0x00);
        /* set FSYNC = '1' */
    
       /* Set inital frequency */
        /* set FSYNC = '0' */
       send_byte(0x33);
       send_byte(freq3); /* byte 3 */
       /* set FSYNC = '1' */
    
       /* set FSYNC = '0' */
       send_byte(0x22);
       send_byte(freq2); /* byte 2 */
       /* set FSYNC = '1' */
    
       /* set FSYNC = '0' */
       send_byte(0x31);
       send_byte(freq1); /* byte 1 */
       /* set FSYNC = '1' */
    
       /* set FSYNC = '0' */
       send_byte(0x20);
       send_byte(freq0); /* byte 0 */
        /* set FSYNC = '1' */
    
       /* Go to operational mode */
        /* set FSYNC = '0' */
       send_byte(0xc0);
       send_byte(0x00);
        /* set FSYNC = '1' */
    }
    Частота задается в freq3...0.
    Предоставляю вам самим написать остальные функции.
    В приведенном выше листинге строки с "Send '1'", "Send '0'", "set SLCK = '1'", "set SLCK = '0'", "set FSYNC = '1'", "set FSYNC = '0'" нужно заменить на команды вывода в порт для соответствующей ножки. Как дергать ножками AVR на Си, надеюсь, знаете?

    Желаю удачи!

    ----
    dmitry

Страница 2 из 21 ПерваяПервая 1234512 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Работаем через спутник - первые шаги....
    от DerBear в разделе SAT связи
    Ответов: 522
    Последнее сообщение: 01.08.2021, 08:39
  2. Запуск AD9832 - помогите добрым словом
    от zi4rox в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 19
    Последнее сообщение: 15.05.2009, 12:30
  3. AD9832
    от UR8IP в разделе Трансиверы, приемники КВ/УКВ
    Ответов: 8
    Последнее сообщение: 24.09.2008, 12:16
  4. PLL синтезатор на DDS AD9832 для платы ADTRX_UR4QBP
    от UR4QBP в разделе Software Defined Radio (SDR), Digital Radio Mondiale (DRM)
    Ответов: 58
    Последнее сообщение: 21.06.2008, 15:01

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •