Главная » Статьи » Проекты |
автор: Pchelа5
Примеров генераторов DDS достаточно много и я,
ничтоже сумняшеся, решил скомпилировать из них что-то свое на нашем любимом
Бейсике для проверки работоспособности платы. Интерфейс управления был взят из звукового
генератора DDS итальянского коллеги, расчет и управление микросхемой – немецкого. Смотрим ниже: Расчет генерируемой частоты
Программа скопипастилась быстро – используя CtrlC-CtrlV, но тут я от собственной жадности решил сэкономить память камня Atmega8 в расчете на дальнейший апгрейд ПО и схемы вообще. Итак, индусский код в моем исполнении:
...
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(i + 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 МГц. Я, правда, не уверен, что данная платка его вытянет, и пока не проверял в железе. Результат всех трудов можно скачать ниже: И напоследок несколько фоток процесса: Все это испытывалось на оригинальной отладочной плате, которая совмещает в себе блок питания 5 и 12 вольт, частотомер и генератор, программатор и сом-порт, а на крышке сверху - макетная плата.
| |
Просмотров: 22558 | Комментарии: 15
| Теги: |
Всего комментариев: 15 | |||||||||||||||
| |||||||||||||||
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |