Skype: yamukha

Адрес: Украина, г.Тернополь


E-mail: yamukha@ukr.net

DDS

DO IT YOURSELF

Сделай сам цифровой синтезатор

С чего бы начать построение радио?

Скорее всего - с генератора.

Достаточно простым и эффективным вариоантом будет использования прямого цифрового синтеза или DDS (direct digital synthesizer).

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

- опорный генератор;

- синтезатор частот;

- ГПД (генератор плавного диапазона);

- модулятор (чатотный, фазовый, амплитудный и т.д.);

- ГКЧ (генеаратор качающеся частоты);

- ППРЧ (передатчик на произвольно прыгающих частотах).

 

Для начального эксперемента нам понадобится:

- микросхема конфигурированной логики (CPLD);

- цифро-аналоговый преобразователь (ЦАП);

- операционный усилитель общего применения (ОУ);

- блок питания +/-12В, +5В, +3,3B.

Лет двадцать назад увлекался любительской радиосвязью.

Первый мой приёмо-передатчик был копией SSB трансивера  прямого преобразования диапаозна 180 м (по книге Полякова). С тех пор прошло лет 20. И недавно всплыла тема разработки радиостанций на новой элементной базе, с использованием цифровой обработки сигнала (ЦОС). 

В руки попала конструкция с готовой микросхемой DDS, которая не совсем устраивала меня, в основном из-за не слишком удобного интерфейса (надо записывать несколько 32 битных регистров).

Возникло желание сделать DDS своими руками. Оказывается это не так уж и сложно.

 

Расcмотриим функциональную схему DDS.

В общем случае имеется всего лишь три основных узла, два цифровых - фазовый аккумулятор и преобазовательная таблица, плюс цифро-аналоговый преобразователь (ЦАП).

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

Аккумулятор есть ни что иное, как циклический двоичный счётчик который после переполнения обнуляется.

Значение аккумулятора с каждым циклом линейно увлеичивается, как показано на рис. 2, что соответсвует линейному измению фазы от нуля до 360 градусов. Соответсвенно, таблица преобразований каждому значению фазы представляет двоичный код для управления выходом ЦАП (например, генерирует один период синуса).

Математика для цифрового синтезатора не сложная. Частота на выходе ЦАП прямо-пропорциональна тактовой, приросту фазы W и обратно пропорциональна разрядности акуммулятора.

Так для 12 битного аккумулятора при тактовой частоте 8.192 МГц, получим, изменению W на один бит соответсвует изменение в 2КГц на выходе.

Таким образом, изменяя код на входе можна получить сетку частот вплоть с шагом 2 КГц почти вплоть до теоретического предела 4.096МГц.

Однако желательно чтобы прирост фазы был на много меньше рарядности аккумулятора (как минимум на порядок, и чем эта разница больше, тем лучше).

Практическая реализация:

- CPLD - EPM3032 (самая простая и дешёвая);

- ЦАП - 572ПА1А и ОУ - К140УД7 (обе из старых запасов).

Далее приведёна принципиальная схема и код на языке VHDL .

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity DDS is       
    generic  (
                 Nbit       : natural := 12 ; -- Acc resolution
                 Nstep       : natural := 3 -- Sin tab resolution
                  );
    Port (
            phase_inc    : in  STD_LOGIC_VECTOR (3 downto 0);         
            DtSin           : out STD_LOGIC_VECTOR (3 downto 0);         
            ClkX           : in  STD_LOGIC;                            
            DDS_En      : in  STD_LOGIC                     -- DDS enable   
            );

  signal MuxA    : STD_LOGIC_VECTOR ( Nbit downto 0):="0000";  -- acc
  signal MuxX    : STD_LOGIC_VECTOR ( 3 downto 0):="0000";     -- data pt
  signal Clk         : STD_LOGIC;                              

  end DDS;

architecture BHVa of DDS is
  begin

  Clk <= ClkX and DDS_EN;

   process  (Clk) -- phase acc increment
     begin
          if    (Clk'event and Clk='1')
          then
                        MuxA <= MuxA + Phase_inc;
           end if;
    end process;

  MuxX (3 downto 0 ) <= MuxA (Nbit downto (Nbit - Nstep));

  with  MuxX select     -- for SIN data table    
    DtSin   <=
            x"1"  when "0000", --     @0    - min
            x"2"  when "0001", --     @11.25
            x"4"  when "0010", --     @22.5
            x"6" when "0011", --     @33.75
            x"8" when "0100", --     @45
            x"A" when "0101", --     @56.25            
            x"C" when "0110", --     @67,5
            x"E" when "0111", --     @78,25

            x"F" when "1000", --     @Pi/2  = max  
            x"E" when "1001", --     @
            x"C" when "1010", --     @
            x"A" when "1011", --     @
            x"8" when "1100", --     @
            x"6" when "1101", --     @
            x"4"  when "1110", --     @
            x"2"  when "1111", --     @            
         
            x"8" when others; --    @180

end BHVa;

Форма сигнала на выходе (для таблицы синусов из 8 записей).

 

09.2010

Copyright yamukha & SDRblocks

 

Сделать бесплатный сайт с uCoz