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

Запускаем генератор 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
Просмотров: 14699 | Комментарии: 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.

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






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
Спасибо) Я принцип действия понял, а вот откуда взялась именно цифра 195 не поня...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
pchela5, ну так это в военное, а у нас в мирное время все примерно)) Наше...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - pchela5:
> Полуволна в нашей электросети по времени длится примерно 10 мс

...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
Чтобы понять откуда взялась цифра 195 надо сначала въехать в принцип работы: ког...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
А почему минимальный накал при 195? Насколько минимум можно занизить Wt?
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.