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

Тема: Вопрос по AD9835 и ему подобным

  1. #1

    Вопрос по AD9835 и ему подобным

    В синтезе не силен но есть пару вопросиков знающим....


    1. диапазон частот на выходе DDS определяется контроллером который им управляет (точнее его прошивкой) и частотой опорного генератора?
    2. Если правильно я перевел даташит на AD9835 то у него есть возможность управления DDS через параллельный порт? Если да то жначит все управление DDS можно сделать с копа?


  2. #2
    Модератор
    Регистрация
    23.10.2005
    Адрес
    Ялта
    Сообщений
    13,660
    Да, можно.
    Одна из таких конструкций и управляющая программа описаны, например в Радиохобби №3 или №4 за 2004 год. Управление через COM порт по 3-м проводам.
    Сергей sgk.

  3. #3

    Re: Вопрос по AD9835 и ему подобным

    Цитата Сообщение от AlexFX
    В синтезе не силен но есть пару вопросиков знающим....


    1. диапазон частот на выходе DDS определяется контроллером который им управляет (точнее его прошивкой) и частотой опорного генератора?
    2. Если правильно я перевел даташит на AD9835 то у него есть возможность управления DDS через параллельный порт? Если да то жначит все управление DDS можно сделать с копа?
    1. Опорный генератор определяет предельную частоту. Дальше все зависит от программы , которая управляет DDS --- какую частоту захочет программист , ту и будет выдавать DDS (но не выше предельной).
    2. DDS управляется по трем проводам --- поэтому абсолютно не важно что будет им управлять, будь то компьютер или контроллер --- главное , что бы по эти трем проводам шли нужные импульсы управления.

  4. #4

    Re: Вопрос по AD9835 и ему подобным

    Значит правильно понял, спасибо!

  5. #5
    Всем радиоаматорам гип-гип-УРА!
    Ребята, помогите разобраться с управлением DDS-ки AD9835 - собираю синтезатор по схеме Сергея(4Z5KY) - http://cqham.ru/image4/swl_synt_big.gif ,но управлять хочу по USB с использованием PIC18F2550.
    Так вот. Пол годика назад экспериментировал с AD9850. Результат моих творений - http://amatar.by/news-view-468.html
    Код в USER.C следующий:
    Код:
    void ServiceRequests(void)
    { 
        if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)))
        {
            switch(dataPacket.CMD)  // команда 0x01 - первый байт, 0x02 - второй байт, ... , 0x05 - пятый байт
            {
                case PKTBYTE:       
        UsartFunc(dataPacket.ID1);   
        UsartFunc(dataPacket.ID2);   
        UsartFunc(dataPacket.ID3);   
        UsartFunc(dataPacket.ID4);   
        UsartFunc(dataPacket.ID5);
        mLED_1 = 1;   // произвести запись в DDS (порт RC0 в "1"  _-) 
        mLED_1 = 0;   // перевести порт RC0 в "0"  -_
                    break;
            }//end switch
        }//end if
    }//end ServiceRequests
    void UsartFunc(unsigned char dataByte)  // dataByte - байт переданных данных
    { 
     static byte i;
     for(i = 0; i < 8; i++){
      mLED_3 = UBit(dataByte, i); // перевести RC2 в состояние i-того бита байта переданных данных
      mLED_2 = 1;   // сигнал CLOCK в "1"   _-
      mLED_2 = 0;   // сигнал CLOCK в "0"  -_
     }
    }// end UsartFunc
    BOOL UBit(unsigned char byteB, unsigned char bit0)
    {
     if(((byteB >> bit0) & 1) > 0)
     {
      return 1;
     }else{
      return 0;
     }
    }
    Но то для AD9850... Всё работает на ура для алгоритма:
    Нажмите на изображение для увеличения. 

Название:	ad9850.GIF 
Просмотров:	239 
Размер:	5.4 Кб 
ID:	57417

    Для AD9835 данные передаются двумя байтами, но подаём их сзаду наперёд))) :
    Нажмите на изображение для увеличения. 

Название:	ad9835.GIF 
Просмотров:	248 
Размер:	5.8 Кб 
ID:	57419
    поэтому переработал код таким образом:
    Код:
    void ServiceRequests(void)
    { 
        if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)))
        {
            switch(dataPacket.CMD) 
            {
                case PKTBYTE: 
        mLED_1 = 0;    
        UsartFunc(dataPacket.ID1);   
        UsartFunc(dataPacket.ID2);     
        mLED_1 = 1;
                    break;
            }//end switch
        }//end if
    }//end ServiceRequests
    void UsartFunc(unsigned char dataByte)  // dataByte - байт переданных данных
    { 
     static byte i;
     for(i = 7; i >= 0; i--){
      mLED_3 = UBit(dataByte, i);
      mLED_2 = 0;  
      mLED_2 = 1; 
     }
    }// end UsartFunc
    BOOL UBit(unsigned char byteB, unsigned char bit0)
    {
     if(((byteB >> bit0) & 1) > 0)
     {
      return 0;
     }else{
      return 1;
     }
    }
    Для AD9835:
    mLED_1 - сигнал FSYNC
    mLED_2 - сигнал SCLK
    mLED_3 - сигнал SDATA
    Однако ничего DDS-ка не выдаёт, когда отправляю эти два байта(прога под PC, каждый байт изменяю независимо друг от друга)
    В некоторые моменты времени, особенно когда активно меняю второй байт(трэкбаром меняю значение), появляется сигнал, который потом можно менять первым байтом(меняется по непонятной тенденции).

    Уверен, что ошибка где-то в коде для PIC. Ткине, пожалуйста, носом меня, - где я что не так делаю???

  6. #6

  7. #7
    SK Аватар для ut1wpr
    Регистрация
    19.10.2003
    Адрес
    Украина, Львов
    Сообщений
    2,652
    Позывной
    ut1wpr
    Цитата Сообщение от amatar Посмотреть сообщение
    Моё замечание не по поводу управления синтезатором, а по поводу использования оператора switch.
    В языке Си это переключатель. Его применяют тогда, когда переменная принимает МНОГО значений и по каждому из них надо производить определённые действия.
    У вас в переключателе есть только одно "положение" - PKTBYTE. Тогда зачем переключатель вообще. Упростите и написание и понимание программы.

    ........
    Код в USER.C следующий:
    Код:
    void ServiceRequests(void)
    { 
    if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)))
    {
    switch(dataPacket.CMD) // команда 0x01 - первый байт, 0x02 - второй байт, ... , 0x05 - пятый байт
    {
    case PKTBYTE: 
    UsartFunc(dataPacket.ID1); 
    UsartFunc(dataPacket.ID2); 
    UsartFunc(dataPacket.ID3); 
    UsartFunc(dataPacket.ID4); 
    UsartFunc(dataPacket.ID5);
    mLED_1 = 1; // произвести запись в DDS (порт RC0 в "1" _-) 
    mLED_1 = 0; // перевести порт RC0 в "0" -_
    break;
    }//end switch
    }//end if
    }//end ServiceRequests
    Правильнее будет такое написание (по крайней мере логичнее в понимании, а то встретив оператор переключения глаз ищет, а где же другие позиции переключателя?
    Код:
    void ServiceRequests(void)
    { 
      if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)) && (dataPacket.CMD == PKTBYTE))
      {
        UsartFunc(dataPacket.ID1); 
        UsartFunc(dataPacket.ID2); 
        UsartFunc(dataPacket.ID3); 
        UsartFunc(dataPacket.ID4); 
        UsartFunc(dataPacket.ID5);
        mLED_1 = 1; // произвести запись в DDS (порт RC0 в "1" _-) 
        mLED_1 = 0; // перевести порт RC0 в "0" -_
      }//end if
    }//end ServiceRequests
    В правильности последовательностей байтов управления не разбирался.
    Просто хотел посоветовать упростить написание, тогда лишнее отпадёт и легче будет обнаруживать ошибки логики.
    Извините за быть может ненужные советы.
    73!
    ---
    Vic/ut1wpr

  8. #8
    Итак, вот что я узнал нового...
    Отправлять данные необходимо не за один раз, как это я делал в AD9850 (40 бит одним махом)
    Сама программа для PIC18F2550 выглядит так..
    Код:
    void ServiceRequests(void)
    { 
        if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)) && dataPacket.CMD == PKTBYTE)
        {
     FSYNC = 0;  // начинаем запись в DDS. FSYNC в -_
     UsartFunc(dataPacket.ID2); // передаём сначала старший байт в DDS       
     UsartFunc(dataPacket.ID1); // затем младший... 
     FSYNC = 1;  // завершаем запись в DDS. FSYNC в _-
        }//end if
    }//end ServiceRequests
    void UsartFunc(unsigned char dataByte)
    { 
       static byte i;
       for(i = 8; i > 0; i--){
     SDATA = UBit(dataByte, i);  // перебираем каждый бит байта
     SCLK = 0;  // запись бита по заднему фронту SCLK
     SCLK = 0;  // задержим немного SCLK в нуле
     SCLK = 0;  // задержим немного SCLK в нуле
     SCLK = 1;  // SCLK в _-
       }
    }// end UsartFunc
    BOOL UBit(unsigned char byteB, unsigned char bit0)
    {
       if(((byteB >> (bit0 - 1)) & 1) > 0) // MSB - со старшего бита к младшему
       {
     return 1;  // если 1, то возвращаем 1
       }else{
     return 0;  // если не 1, то возвращаем 0
       }
    }// end UBit
    НО! Во первых,
    - при первом включении необходимо отправить два байта инициализации 0хF800;
    - потом байт 0х33 + 4-ый байт данных о частоте;
    - потом байт 0х22 + 3-ый байт данных о частоте;
    - потом байт 0х31 + 2-ый байт данных о частоте;
    - потом байт 0х20 + 1-ый байт данных о частоте;
    - включаем оперативный режим(два байта): 0хС000

    В последующем, если нам понадобится перестроить частоту, мы уже будем отправлять только то, что выделено красным цветом, т.к. DDS переведён в оперативный режим)))
    Это всё я пока не проверял и сделал эти выводы из прочтения мануала и др. тем данного форума.
    Если я ошибаюсь, исправьте меня пожалуйста..

  9. #9
    мда.. смотрю, что нет здесь компетентных людей ответить на поставленный вопрос. да ладно, сам разберусь и оставлю всё при себе..


  10. #10
    amatar
    Посмотрите вот эту статью: http://community.livejournal.com/rus...io/351358.html , может что-то полезное для себя найдёте...
    У радиолюбителя руки должны быть ПРЯМЫМИ, а извилины КРИВЫМИ....

Страница 1 из 21 123411 ... ПоследняяПоследняя

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

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

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

Ваши права

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