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

Тема: Как повернуть фазу на 90 в AD9850

  1. #1

    Как повернуть фазу на 90 в AD9850

    Всем привет.
    В синтезаторе используется готовый DDS модуль из Китая на AD9850. Синтезатор используется в трансивере прямого преобразования. В модуле, насколько я знаю 2 выхода синуса. Сейчас использую один. В соседних темах сейчас обсуждаю, как можно использовать смесители ADE в технике прямого преобразования. Ребята подсказали, что фазовращение по ВЧ лучше делать в самом гетеродине, чем после смесителя, согласен с этим. Вот тема, если что http://www.cqham.ru/forum/showthread...=1#post1423471

    Так вот. Смеситель сейчас пока состоит из двух смесителей ADE (пока всё в теории). Ему на вход нужно подавать с гетеродина два синуса, разнесённые на 90 градусов, чтобы обеспечить фазовращение по ВЧ. И я сначала думал, блин, как же с моего синтезатора этот синус разделить на 2 сигнала со двигом... Мысли всякие были, от триггеров, до просты фазовращателей на ОУ. А сейчас мысль в голову пришла - ведь в моей DDS платке уже же есть 2 выхода синуса!

    Сейчас измерил осциллографом, разницы между двумя выходами нет, то есть сдвиг фазы или 0 или 360. Можно-ли в скетче сделать так, чтобы разница фаз стала 90 градусов? И если да, то как? Если что, вот скетч:

    Скрытый текст

    /*
    Main code by Richard Visokey AD7C - www.ad7c.com
    Revision 2.0 - November 6th, 2013
    */

    // Include the library code
    #include <LiquidCrystal.h>
    #include <rotary.h>
    #include <EEPROM.h>

    //Setup some items
    #define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
    #define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
    #define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
    #define RESET 11 // Pin 11 - connect to reset pin (RST)
    #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
    Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
    LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
    int_fast32_t rx=3650000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
    int_fast32_t rx2=1; // variable to hold the updated frequency
    int_fast32_t increment = 10; // starting VFO update increment in HZ.
    int_fast32_t iffreq = 0; // Intermedite Frequency - Amount to subtract (-) from base frequency. ********************************************
    int buttonstate = 0;
    int buttonstate2 = 0;
    int GoIF = 1;
    String hertz = "10 Hz";
    int hertzPosition = 5;
    byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders
    String freq; // string to hold the frequency


    int ForceFreq = 0; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!



    void setup() {
    pinMode(A0,INPUT); // Connect to a button that goes to GND on push
    pinMode(A1,INPUT); // IF sense **********************************************
    digitalWrite(A0,HIGH);
    digitalWrite(A1,LOW);
    lcd.begin(16, 2);
    PCICR |= (1 << PCIE2);
    PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
    sei();
    pinMode(FQ_UD, OUTPUT);
    pinMode(W_CLK, OUTPUT);
    pinMode(DATA, OUTPUT);
    pinMode(RESET, OUTPUT);
    pulseHigh(RESET);
    pulseHigh(W_CLK);
    pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);

    // Load the stored frequency
    if (ForceFreq == 0) {
    freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
    rx = freq.toInt();
    }
    }

    void loop() {
    // Update the display and frequency if the new Freq NEQ the old Freq
    if (rx != rx2){
    showFreq();
    sendFrequency(rx);
    rx2 = rx;
    }

    // Rotate through the rate of tuning as you hold down the button
    buttonstate = digitalRead(A0);
    if(buttonstate == LOW) {
    setincrement();
    };

    // Writing current frequency to EEPROM triggered by A1
    buttonstate = digitalRead(A1);
    if (buttonstate != buttonstate2 && buttonstate == LOW){
    storeMEM();
    };
    buttonstate2 = buttonstate;
    };

    // Interrupt routine to catch the rotary encoder
    ISR(PCINT2_vect) {
    unsigned char result = r.process();
    if (result) {
    if (result == DIR_CW){rx=rx+increment;}
    else {rx=rx-increment;};
    if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
    if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
    }
    }

    // frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
    void sendFrequency(double frequency) {
    if (GoIF == 1){frequency=frequency-iffreq;}; //If pin = low, subtract the IF frequency.
    int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
    for (int b=0; b<4; b++, freq>>=8) {
    tfr_byte(freq & 0xFF);
    }
    tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
    pulseHigh(FQ_UD); // Done! Should see output
    }
    // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
    void tfr_byte(byte data)
    {
    for (int i=0; i<8; i++, data>>=1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
    }
    }

    void setincrement(){
    if(increment == 10){increment = 100; hertz = "100 Hz"; hertzPosition=5;}
    else if (increment == 100){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
    else if (increment == 1000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
    else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
    lcd.setCursor(0,1);
    lcd.print(" ");
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);
    delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
    };

    void showFreq(){
    millions = int(rx/1000000);
    hundredthousands = ((rx/100000)%10);
    tenthousands = ((rx/10000)%10);
    thousands = ((rx/1000)%10);
    hundreds = ((rx/100)%10);
    tens = ((rx/10)%10);
    ones = ((rx/1)%10);
    lcd.setCursor(0,0);
    lcd.print(" ");
    if (millions > 9){lcd.setCursor(1,0);}
    else{lcd.setCursor(2,0);}
    lcd.print(millions);
    lcd.print(".");
    lcd.print(hundredthousands);
    lcd.print(tenthousands);
    lcd.print(thousands);
    lcd.print(".");
    lcd.print(hundreds);
    lcd.print(tens);
    lcd.print(ones);
    lcd.print(" Mhz ");
    };

    void storeMEM(){
    //Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
    EEPROM.put(0,millions);
    EEPROM.put(1,hundredthousands);
    EEPROM.put(2,tenthousands);
    EEPROM.put(3,thousands);
    EEPROM.put(4,hundreds);
    EEPROM.put(5,tens);
    EEPROM.put(6,ones);
    };



    Прошу сильно не пинать, в программировании ардуино разбираюсь очень посредственно))


  2. #2
    Аватар для UV7QAE
    Регистрация
    05.05.2014
    Адрес
    Запорожская область
    Сообщений
    531
    А с чего вы взяли что там 2 генератора? Выходов может быть хоть 10, а генератор там ведь один.

  3. #3
    В 9850 повернуть фазу нельзя. Для этого нужна АД9854.
    Можно применить 2 платы АД9850 и заклокать их со сдвигом фаз. Посмотрите как сделано это в векторном измерителе N2PK.

  4. #4
    Цитата Сообщение от RK6AJE Посмотреть сообщение
    В 9850 повернуть фазу нельзя.
    а для чего тогда там сделано два синусоидальных выхода?..

  5. #5
    Цитата Сообщение от DX888 Посмотреть сообщение
    а для чего тогда там сделано два синусоидальных выхода?..
    имхо, чтобы коммутировать программно, а не аппаратно

    например один заведен в приемник, а второй в передатчик

    Нажмите на изображение для увеличения. 

Название:	AD9850-fbl.png 
Просмотров:	581 
Размер:	255.3 Кб 
ID:	268133

  6. #6
    Цитата Сообщение от UT0UM Посмотреть сообщение
    имхо, чтобы коммутировать программно, а не аппаратно
    то есть можно программно включить или выключить тот или иной выход? Если да, то может как-то можно прописать, чтобы один выход при включении сдвигался по фазе на 90?))

  7. #7
    Модератор
    Регистрация
    23.10.2005
    Адрес
    Ялта
    Сообщений
    13,691
    Посмотрите на рисунок, один ЦАП,один выход. Компаратор сигнал не синтезирует, если нужен меандр, то компаратор встроен в микросхему. Хотя опытные синтезаторостроители писали что лучше применять внешний компаратор.
    Нажмите на изображение для увеличения. 

Название:	Один ЦАП один выход.png 
Просмотров:	573 
Размер:	123.3 Кб 
ID:	268132
    Вы хотели микросхему где можно синтезировать два сигнала с заданным сдвигом по фазе. Вам посоветовали ранее AD9959 4-ре канала и уже в этой теме 2-х канальную AD9854.
    Сергей sgk.

  8. Спасибо от UT0UM

  9. #8
    Аватар для UV7QAE
    Регистрация
    05.05.2014
    Адрес
    Запорожская область
    Сообщений
    531
    Цитата Сообщение от DX888 Посмотреть сообщение
    то есть можно программно включить или выключить тот или иной выход? Если да, то может как-то можно прописать, чтобы один выход при включении сдвигался по фазе на 90?))
    Для этого нужен еще один генератор, а не выход

  10. #9
    Эх, жалко, хорошая была задумка). Всем спасибо за ответы.


  11. #10
    Цитата Сообщение от DX888 Посмотреть сообщение
    то есть можно программно включить или выключить тот или иной выход
    Нет. там не чего включать и выключать программно,это один и тот же выход .Если вам нужно от одного генератора то самое простое поднять частоту в 2 раза и сделать сдвиг частоты на триггерах ,или в 4 раза как вам больше нравится,как сделано в сдр. Но там уже будет не синус.

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Объясните про фазу и ноль
    от jett в разделе Для начинающих
    Ответов: 43
    Последнее сообщение: 20.07.2015, 13:46
  2. Раскачать IRF от AD9850
    от nostromo в разделе Технический кабинет
    Ответов: 25
    Последнее сообщение: 02.07.2013, 15:01
  3. И снова AD9850 в SDR
    от rv6hff в разделе Software Defined Radio (SDR), Digital Radio Mondiale (DRM)
    Ответов: 14
    Последнее сообщение: 16.02.2011, 22:32
  4. Выжимаем AD9850\51
    от DerBear в разделе Software Defined Radio (SDR), Digital Radio Mondiale (DRM)
    Ответов: 2
    Последнее сообщение: 22.11.2009, 10:45
  5. Крутит ли фазу резистивный делитель?
    от alexis в разделе Технический кабинет
    Ответов: 3
    Последнее сообщение: 01.06.2007, 19:07

Ваши права

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