реклама на сайте
подробности

 
 
> загвоздка в написании DDS, О жизненых проблемах электроники
Frox_SzC
сообщение Oct 28 2009, 19:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



И так, начнем по порядку:

На работе зашел разговор о DDS'никах АналогДивайса, ну и я как обычно плюнул и сказал: "а че тут делать то, было бы желание"..... Как говориться мужик сказал мужик сделал.....Все бы нечего.... Весь алгоритм работы ДДС прозрачен и абсолютно понятен.......
Но вот загвостка:
Перечитав КУЧУ информации по ДДС никак не нашел: что же из себя представляет "код частоты", поступающий на вход......Понял что возможно два варианта развития событий:
1) "код частоты" - есть готовый инкремент фазового аккумулятора....тогда все просто....но возникает другой вопрос: кто его должен подавать на вход???где его считать???
2) "код частоты" - есть численное выражение требуемой частоты в двоичном исчеслении......тогда расчет инкремента фазового аккумулятора необходимо сделать в модуле ДДС.....Отлично!!!
Выбрав второй путь....я написал ДДС....в котором инкремент считается по формуле: dph=((2^n)*Request_freq)/Fclk; где 2^n есть число точек фазы на весь период......
немного подумав....объединяю 2^n/Fclk в одну константу и получаю (при n=32 и Fclk=100МГц) 42,949....
И здесь начался .....хм хм.......плохо короче....
Число которое получается в итоге.....дробное.....Вопрос....Критично ли повлияет его округление навыходной сигнал???.....Если да то придется реализововать умножение на дробное число, что приведет к увеличение площади кристалла и потребления....Как быть??? Спасибо!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Oct 29 2009, 23:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Попробую еще раз "на пальцах" и в цифрах. Допустим
имеем:
частота тактирования - 1Мгц,
таблица синуса - 36 отсчетов на период,
дискретность изменения амплитуды 1/256 (ЦАП - 8 разрядов).
хотим:
получить выходную частоту 23кГц.
Таблица у нас с приращением фазы 10 градусов для частоты сэмплирования 1МГц/36=27777,7(7)Гц
а) считаем требуемое приращение фазы 23кГц/(1МГц/36)=0,828, если просто округлим до целых получим 0, если правильно округлим, то получим 1. Облом-с. Тогда отсчеты у нас будут строго по таблице и выходная частота получится, не 23кГц, а 27,777кГц. Ошибка выходной частоты при этом будет (1МГц/36-23кГц)/23кГц*100%=+20,77%. Чтобы уменьшить погрешность вычисления фазы отсчетов увеличим разрядность фазового аккумулятора. Для этого при расчете фазового приращения домножим его значение на 256 и получим 256*23кГц/(1МГц/36)=211,968. После округления будем иметь фазовое приращение dph=212. Поскольку у нас всего 36 элементов в таблице, то для аккумулятора фазы хватит 6-и разрядов. Но мы еще должны учесть 8-и битное расширение приращения фазы. Поэтому для аккумулятора фазы возьмем (6+8)>=16 разрядов. Берем пример исходного когда из википедии и немного дорабатываем его.
Код
#include <stdint.h>

#define SINTBLSIZE 36U    //размер таблицы синуса
#define TBLIDXPRD (256U*36U)    //период фазового аккумулятора

uint8_t sinTbl[SINTBLSIZE]=
{ 128, 150, 171, 191, 209, 225, 238, 247, 253, 255,
  253, 247, 238, 225, 209, 191, 171, 150, 128, 105,
  84, 64, 46, 30, 17, 8, 2, 0, 2, 8,
  17, 30, 46, 64, 84, 105
]; // таблица синуса

uint8_t next_amp(uint16_t dph)
{   static uint16_t phase=0;
    uint8_t amp;
    unsigned int idx;
    phase+=dph;
    while(phase>TBLIDXPRD)
        phase-=TBLIDXPRD;
    idx=phase>>8;
    amp=sinTbl[idx];
    return amp;
}

Результатом работы при dph=212 будет такая последовательность
Код
128    128    150    171    191    209    209    225    238    247
253    255    255    253    247    238    225    209    209    191
171    150    128    105    105    84    64    46    30    17
17    8     2     0     2     2     8     17    30    46
64    64    84    105
                  127    150    171    171    191    209
225    238    247    247    253    255    253    247    238    238

Отступом я выделил период, который равен 44 отсчетам. Считаем период получившейся частоты. 1МГц/44=22727,27(27)Гц. Ошибка формирования выходной частоты составляет (1МГц/44-23кГц)/23кГц*100%=--1,19%. Сравните с исходной погрешностью +20,77% Улучшение точности выше, чем на порядок!
Такой пример вам будет понятен? laughing.gif Еще в дополнение замечу, что поскольку в моем примере разрядность фазового аккумулятора была 16, а требуемая разрядность индекса таблицы отсчетов составляла всего 6 разрядов, то легко можно было домножать не на 2^8=256, а на 2^10=1024. Точность вычисления фазы была бы еще выше. Правда для выбранных условий это не очень актуально, т.к. выходная частота и табличная частота сэмплирования слишком близкие.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Frox_SzC   загвоздка в написании DDS   Oct 28 2009, 19:29
- - rezident   Что-то не совсем осознал суть проблемы. Не хочется...   Oct 28 2009, 21:23
|- - Frox_SzC   Цитата(rezident @ Oct 29 2009, 00:23) Что...   Oct 29 2009, 05:10
|- - _Anatoliy   Цитата(Frox_SzC @ Oct 29 2009, 07:10) ......   Oct 29 2009, 10:36
|- - Сергей Борщ   Цитата(Frox_SzC @ Oct 29 2009, 08:10) нав...   Oct 29 2009, 14:01
||- - Frox_SzC   Цитата(Сергей Борщ @ Oct 29 2009, 17:01) ...   Oct 29 2009, 15:59
|- - rezident   Цитата(Frox_SzC @ Oct 29 2009, 10:10) но ...   Oct 29 2009, 16:18
|- - Frox_SzC   Цитата(rezident @ Oct 29 2009, 19:18) Вы ...   Oct 29 2009, 16:54
|- - rezident   Цитата(Frox_SzC @ Oct 29 2009, 21:54) Реб...   Oct 29 2009, 19:08
- - Fat Robot   Так обычно делают. Кто подавать и где считать: вне...   Oct 29 2009, 10:50
- - Frox_SzC   Возьмите хоть 42разрядный аккумулятор.....разницы ...   Oct 29 2009, 18:03
- - Frox_SzC   Возьмите хоть 42разрядный аккумулятор.....разницы ...   Oct 29 2009, 18:03
- - rsv   есть же готовая корка от ксайлинкса, там в описани...   Oct 29 2009, 18:28
- - Frox_SzC   Ну я думаю никто не будет спорить что фаза являетс...   Oct 29 2009, 20:49
- - rezident   Frox_SzC, так вы синус формируете или сигнал произ...   Oct 29 2009, 21:38
- - Frox_SzC   Полностью с Вами согласен.... Увеличение фазового ...   Oct 30 2009, 06:04
|- - ANV   Цитата(Frox_SzC @ Oct 30 2009, 08:04) В е...   Nov 4 2009, 22:09
- - Frox_SzC   Спасибо за Вашу помощь товарищи!!!   Nov 8 2009, 05:56
- - Михаил_K   Когда-то вот здесь http://electronix.ru/forum/inde...   Nov 9 2009, 05:19
- - Frox_SzC   Цитата(Михаил_K @ Nov 9 2009, 08:19) Когд...   Nov 11 2009, 05:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 18:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016