Главная » Статьи » Проекты

Запускаем генератор DDS на AD9851 в Bascom-AVR
автор: Pchelа5
 
 Примеров генераторов DDS достаточно много и я, ничтоже сумняшеся, решил скомпилировать из них что-то свое на нашем любимом Бейсике для проверки работоспособности платы. Интерфейс управления был взят из звукового генератора DDS итальянского коллеги, расчет и управление микросхемой – немецкого. Смотрим ниже:


Расчет генерируемой частоты

 

Программа скопипастилась быстро – используя CtrlC-CtrlV, но тут я от собственной жадности решил сэкономить память камня Atmega8 в расчете на дальнейший апгрейд ПО и схемы вообще. Итак, индусский код в моем исполнении:

 1. Цифры, выводимые на дисплей, представлены в виде массива чисел. 

 Итальянский коллега высчитывал требуемое число последовательным умножением в цикле каждого разряда на 10 и сложением чисел



...
Dim Fdig(8) As Byte          'числовой массив генерируемой частоты
...

'преобразуем массив в целое
      Fincr = 0
      Tmpw = 1
      Txx1 = 5                        
      Do
      Tmpl = Fdig(txx1) * Tmpw        'da * 1  a * 10000
      Fincr = Fincr + Tmpl
      Tmpw = Tmpw * 10                'множитель изменения
      Decr Txx1
      Loop Until Txx1 = 0            'заканчиваем преобразование массива в целое

'получаем на выходе  Fincr как long


Мой вариант решения проблемы:


...
Dim Fdig(8) As Byte                     ' числовой массив генерируемой частоты
Dim Digasci(8) As Byte
Dim Dispstring As String * 7 At Digasci Overlay

      For I = 1 To 7
      Digasci(i) = Fdig(+ 1) + 48
      Next I
      Frequ_gen = Val(dispstring)

' получаем на выходе  Frequ_gen как long


 Я использую вспомогательный семизначный массив, сдвигая значения 0-9 в ASCII код 48-57 и потом просто преобразую строку в число. Опять же мною были применен апноут №193. Старшую цифру я не трогаю по причине, указанной ниже.


 2. Управление микросхемой реализовано с помощью последовательного ввода кода.

Оригинальное решение немецкого коллеги для работы с 64 разрядным числом:

Sub To_ad9851
   Local S As Single
   Local Fred As Long
   Local Korr As Long
   Local W As Long
   Local Lauf As Byte

   Select Case Frequ_gen

      Case 0 To 9999999 : Fred = Frequ_gen
                           Korr = 0
      Case 10000000 To 19999999 : Fred = Frequ_gen - 10000000
                                   Korr = 238609294
      Case 20000000 To 29999999 : Fred = Frequ_gen - 20000000
                                   Korr = 477218588
      Case 30000000 To 39999999 : Fred = Frequ_gen - 30000000
                                   Korr = 715827883
      Case 40000000 To 49999999 : Fred = Frequ_gen - 40000000
                                   Korr = 954437177
      Case 50000000 To 59999999 : Fred = Frequ_gen - 50000000
                                   Korr = 1193046471
      Case 60000000 To 69999999 : Fred = Frequ_gen - 60000000
                                   Korr = 1431655765
      Case Is >= 70000000 : Fred = Frequ_gen - 70000000
                             Korr = 1670265060
   End Select

   S = Fred
   S = S * 23.86092942              '= 2 ^ 32 / 180MHz; = delta phi в Гц
   W = Round(s)
   W = W + Korr

И т.д.

Как мы видим – все строго и надежно, по-немецки.

Индусский вариант в моем исполнении:


Sub To_ad9851

   Local S As Single
   Local Korr As Long
   Local W As Dword
   Local J As Byte
   Local K As Byte

   S = Frequ_gen * 23.86092942                              '= 2 ^ 32 / 180MHz;
   W = Round(s)
   Korr = Lookup(fdig(1) , Dta)                             ' First digit
   W = W + Korr

'И т.д.

End Sub

Dta:
Data 0& , 238609294& , 477218588& , 715827883& , 954437177& , 1193046471&
Data 1431655765& , 1670265060& , 1908874354& , 2147483647&

 То есть функцию Case меняем на lookup, экономя при этом нужную в дальнейшем память. Первая цифра массива Fdig(8) используется как индекс для поиска в данных нужного слагаемого. Генерируемая частота также повысилась до 100 МГц. Я, правда, не уверен, что данная платка его вытянет, и пока не проверял в железе.

 Подытоживая вышесказанное - указанные выше примеры т.н. индусского кода позволяют вместо лобового решения проблемы путем умножения и т.п. найти обходные пути, что экономит память и быстродействие микроконтроллеров.

  Печатку я еще не разводил, т.к. планирую использовать Атмегу8 в прямоугольном корпусе. Фьюзы по умолчанию – на 8 МГц. В качестве дальнейшего развития схемы (памяти и ног у нас еще ого-го) можно поставить энкодер, ввести шаг перестройки частоты, АМ и ФМ модуляцию, ну и т.п. Неплохо на выходе поставить ОУ как повторитель для защиты мелкосхемы. 

 Для экспериментов использовалась вот такая схема подключения:


 Результат всех трудов можно скачать ниже:

  СКАЧАТЬ



И напоследок несколько фоток процесса:




 Все это испытывалось на оригинальной отладочной плате, которая совмещает в себе блок питания 5 и 12 вольт, частотомер и генератор, программатор и сом-порт, а на крышке сверху - макетная плата.




 

Категория: Проекты | Добавлено: 06.07.2012
Просмотров: 22611 | Комментарии: 15 | Теги: AD9851, dds | Рейтинг: 5.0/6
Всего комментариев: 15
+1   Спам
15 supervolens   (19.01.2016 20:53) [Материал]
Плата и софт для проверки китайского модуля dds на AD9850/9851
file DDS control board.zip
https://yadi.sk/d/leM0yhyVnN2H2

14 supervolens   (17.01.2016 18:58) [Материал]
Вот развёл плату для китайского модуля с алиэкспресс за 1000 руб
http://ru.aliexpress.com/item/DDS-Signal-Generator-Module-0-70MHz-AD9851-2-Sine-Wave-and-2-Square-Wave/32334296317.html?spm=2114.41010308.4.2.ehbH39
для Mega 8 в DIP корпусе с внешним кварцем.
https://yadi.sk/d/7keyVeXcnCHe7 плата в sprint layuot 6.

13 supervolens   (16.01.2016 05:43) [Материал]
Скомпилировал исходники и сравнил hex файл с выложенным на сайт - отличия в нескольких
байт в нескольких местах.Вероятно исходники подправили. Просьба выслать подправленные исходники на адресс:supervolens@yandex.ru

12 supervolens   (13.01.2016 00:26) [Материал]
У кого есть разведенная печатная плата поделитесь.

11 alec220   (23.08.2014 13:17) [Материал]
удалил, разобрался

10 Aleks8383   (21.07.2012 17:22) [Материал]
Да лучше уже для трансивера 9951 поставить,она по спектру намного лучше 9851,если что могу даже примерчик подкинуть для неё.Я покупал тут http://www.ebay.com/itm....8630fad всё удоаольствие 600руб и доставка безплатная(кстати кто покупает на EBAY у этого продовца самые низкие цены среди китайцев и хороший асортимент)

9 SypH3r   (21.07.2012 09:47) [Материал]
да думаю ДДСку тоже использовать синтезатором в трансивере, вовремя нарвался на эту статью, поможет надеюсь

+1   Спам
8 pchela5   (10.07.2012 18:11) [Материал]
Неточность возникает при умножении чисел. Но это вторично и в данном случае естественно основное влияние - уход опорной частоты при прогреве и т.п. Основное - переполнение при частоте больше 75 МГц (точное значение не помню).

7 Aleks8383   (10.07.2012 16:38) [Материал]
Больше 50Мгц я не гонял ненужно было,а про какую вы неточность говорите.Точность установки частоты для неё 0.04 герца.Вся неточность выходит от неправельной установки частоты опоры.При точности установки опоры хотябы до десятков герц,точность оень высокая до 1 герца точно во всём диапазоне перестройки,а вот при неточной установке там да показания начинают сильно отличатся.

6 pchela5   (10.07.2012 16:18) [Материал]
При таком способе максимальная частота - около 75 Мгц, дальше идет переполнение. Это раз. Второе - где-то я вычитывал - из-за неточности умножения больших с малым чисел возникает погрешность. Я проверял - действительно, так оно и есть. В данном случае погрешность меньше.

5 Aleks8383   (10.07.2012 15:13) [Материал]
Чегото слишком перемудрёно,я делал так

Dim A As Long
Dim B As Single
Dim C As Long

C = 23.8609294 '2^32/180000000= 23.8609294
A = 10000000
B = A * C
B = Hex(b)

Чтото некопируется с пояснениями,опишу так С это коэф получается из 2 в с тепени 32 делёное на частоту тактового генератора(у меня стоит 180Мгц(это максимальная частота генератора) тк тактовый генератор стоит на 30Мгц и програмно я его умножаю на 6,смотреть даташит.)А, это выходная частота в герцах у меня 10Мгц для примера(к стати с приличным сигналом может выдавать в половину от тактовой те до 90 мгц,может и поболее выдавать но качество сигнала резко ухудшится)Далее перемножаем А и С и получаем выходную частоту,только сначало надо перевести в HEX.Ну а далее можно выводить в DDS либо последовательно либо паралельно,я выводил через SHIFTOUT последовательно.Вроде всё.

4 sherman   (10.07.2012 00:29) [Материал]
Спасибо! Интересно взглянуть на получившийся в итоге девайс.

+1   Спам
3 pchela5   (07.07.2012 11:18) [Материал]

2 niko-lay   (07.07.2012 00:29) [Материал]
Снова радуете обновлениями, спасибо! :) Ну тогда ждем продолжения! А что за осциллограф на второй фотке?

+3   Спам
1 pchela5   (06.07.2012 22:08) [Материал]
Ну, собственно, программа была немного переписана, схема переделана и в итоге удалось в одной схеме совместить два генератора - НЧ разной формы и DDS AD9851, но об этом в следующей статье. Печатка, кстати, готова для корпуса TQFP, плата запаяна и проверена. Так что, to be continued.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация