http://elm-chan.org/junk/mdds_ipol/report.htmlКоэффициент загрузки обработки функции DDS, сколько процессорного времени занимает служба прерывания DMA, составил всего 45% при частоте процессора 72 МГц, частоте дискретизации 1Msa/sec и одноканальной конфигурации. Двухканальная конфигурация потребляет 85% мощности ЦП, а в трехканальной конфигурации необходимо снизить частоту дискретизации до 720ksa/sec. Это неплохо, если учесть, что максимальная частота дискретизации ЦАП составляет 1Msa/sec. Поскольку большинство программных проектов DDS реализуются на 8-битном микроконтроллере с низкой вычислительной мощностью, форма волны синтезируется без какой-либо интерполяции данных LUT (дробная часть значения фазы просто округляется). В этом проекте DDS реализован на мощном 32-битном микроконтроллере, так что он может получить плавную форму волны за счет использования интерполяции даже с короткой (грубая выборка) волновой таблицей.
Котуинко
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Не спорю на STM32 можно и 3-х канальный DDS - японский Чен делал на STM32F3 с интерполяцией
- Реклама
Для генерации меандра с помощью DDS таблица в принципе не требуется.
Достаточно инверсии выхода ири переполнении на удвоенной частоте или "виртуальной таблицы" из 0 и 1, возможно в ОЗУ.
А это значительно снижает нагрузку на программу и ее размер.

Достаточно инверсии выхода ири переполнении на удвоенной частоте или "виртуальной таблицы" из 0 и 1, возможно в ОЗУ.
А это значительно снижает нагрузку на программу и ее размер.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
из википедии
т.е. без ЦАП будет не совсем DDS. А на ЦАП проще имхо из таблички во флэше. В ОЗУ сформировать еще надо, это хоть и не значительно, но повышает нагрузку на программу и ее размерЦифровой вычислительный синтезатор (ЦВС), известный еще как схема прямого цифрового синтеза (DDS) — электронный прибор, предназначенный для синтеза сигналов произвольной формы и частоты из единственной опорной частоты, поставляемой генератором тактовых импульсов. Характерной особенностью ЦВС является то, что отсчеты синтезируемого сигнала вычисляются цифровыми методами, после чего передаются на цифро-аналоговый преобразователь (ЦАП), где и происходит их преобразование в аналоговую форму (напряжение или ток).
В STM большой расход времени на вход/выход в прерывание. Можно попробовать крутить DDS в основном цикле синхронизируясь с каким нибудь таймером, следить за битом UIF например. В прерывании обрабатывать уставки. Естественно в этот момент генерация будет срываться. Может получится и более 2Мсемпл/сек (менее 36 тактов на круг). На AVR c прерываниями у меня уходило 38 тактов. Таблица в ОЗУ. Пробовать нужно.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
у Чена DDS на STM32F3, 72Мгц тактовая - успевает в прерывании еще и синтезировать форму сигнала
ЦА преобразование запускается выходом таймера и дает выходной сигнал без дрожания. DAC может генерировать прерывание или запрос DMA при каждом преобразовании, чтобы получить следующие данные для вывода. Поскольку скорость преобразования ЦАП до 1 Msa/sec (72 такта ЦП на передачу) слишком высока для обработки прерывания, в этом проекте данные ЦАП передаются с помощью контроллера DMA. Контроллер DMA выбирает значение выборки из буферной памяти и записывает его в регистр DAC при каждом запросе DMA. Контроллер DMA настроен в циклическом режиме для перезапуска передачи данных с вершины буфера, когда он достигает конца буфера. Он также генерирует прерывание на половину передачи и последнюю передачу. Подпрограмма обслуживания прерывания DMA синтезирует форму волны и каждый раз заполняет половину буфера DMA. Таким образом, контроллер DMA используется в качестве буфера FIFO для потоковой передачи данных формы волны в ЦАП.
- Реклама
Так мне ж и меандра достаточно.
Собственно сам принцип "наращивания" для малоразрядного таймера берем из DDS,
только "расширения" табличного не делаем.
И запускаем два генератора - один на Т1 (классика), второй на Т0 (извращенный DDS)...
Воть попробую чего нашкарябать для тиньки2313 из интереса...

Собственно сам принцип "наращивания" для малоразрядного таймера берем из DDS,
только "расширения" табличного не делаем.
И запускаем два генератора - один на Т1 (классика), второй на Т0 (извращенный DDS)...
Воть попробую чего нашкарябать для тиньки2313 из интереса...
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
лайфак - простейшая псевдоDDS, для одной ноги (меандра)
частота регулируется количеством nop
Код: Выделить всё
loop:
sbi PINB, 5
nop
nop
....
jmp loopАга!
И больше нихрена с того МК не плучить - основной цикл единственный (если охота хоть чуток стабильности).
А прерывание и приклеенные к ним прожки будут "портить картинку".

И больше нихрена с того МК не плучить - основной цикл единственный (если охота хоть чуток стабильности).
А прерывание и приклеенные к ним прожки будут "портить картинку".
[uquote="BOB51",url="/forum/viewtopic.php?p=3977292#p3977292"]Так мне ж и меандра достаточно.[/uquote]
Для меандра как раз один только NCO без проблем выдаст частоту переполнения своего аккумулятора вплоть до задающей, например 32МГц от внутреннего генератора, с независимым от ядра дерганьем вывода порта каждое переполнение, выдавая 16МГц меандр. Также вместо меандра можно выдавать импульсы.
Для меандра как раз один только NCO без проблем выдаст частоту переполнения своего аккумулятора вплоть до задающей, например 32МГц от внутреннего генератора, с независимым от ядра дерганьем вывода порта каждое переполнение, выдавая 16МГц меандр. Также вместо меандра можно выдавать импульсы.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="BOB51",url="/forum/viewtopic.php?p=3977388#p3977388"]И больше нихрена с того МК не плучить - основной цикл единственный[/uquote]
дык так и сделаны DDSы на AVR (примеры выше были) - установка новой частоты кнопкой или по юарт в прерывании это джиттер, потом устаканивается. На слух, если это tone, этот джиттер можно и не услышать. Надо круче - используйте типа RTOS или спец. микроконтроллеры или внешние, так называемые СБИС.
дык так и сделаны DDSы на AVR (примеры выше были) - установка новой частоты кнопкой или по юарт в прерывании это джиттер, потом устаканивается. На слух, если это tone, этот джиттер можно и не услышать. Надо круче - используйте типа RTOS или спец. микроконтроллеры или внешние, так называемые СБИС.
Вот например в G030 я не смог обычную фоновую обработку с DMA для выдачи сигнала подружить с АЦП для обработки захвата. Вешался модуль АЦП. Пока отложил.
Так речь не о полноценном DDS, а о варианте с всего-то генератором меандра с минимизированным шагом перестройки частоты.
Вообще-то весьма интересное решение напрашивается - НО... требует проверки...
Так что пока отвлекусь на "тест нашкрябать"...

Вообще-то весьма интересное решение напрашивается - НО... требует проверки...
Так что пока отвлекусь на "тест нашкрябать"...
подкину идейку:занесли в Z адрес TBL+T (где Т - величина, определяющая длительность полупериода), вычисленный по нужному значению ПОЛУПЕРИОДА требуемого меандра, и переходим на LOOP, начинается генерация меандра на PORTB1. теперь в прерываниях перерасcчитываем Z - и период меняется. максимальная частота будет F_CPU/12, шаг изменения периода 2/F_CPU, минимальная частота зависит только от количества памяти, занятой NOP-ами 
Код: Выделить всё
LOOP:
IJMP
TBL:
NOP
NOP
... ; еще куча NOP-ов
SBI PINB, 1
JMP LOOPесли рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=3977873#p3977873"]теперь в прерываниях перерасcчитываем Z - и период меняется. максимальная частота будет F_CPU/12[/uquote]
Как в такую схему вписываются хотя бы пара кнопок(шаг вперед/назад)?
Как в такую схему вписываются хотя бы пара кнопок(шаг вперед/назад)?
нормально вписывается, если допускаем "джиттер" в моменты нажатий на кнопки. в случае чисто программной генерации иначе и не выйдет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Во нашел DDS -> меандр для экономии времени BOB51
можно в принципе засунуть в прерывание с целью уменьшения джиттера
Если выводить на 1 бит в порту, то получилось 11 циклов:
Код: Выделить всё
lds r24,{Fincr+0} 'LSB passa incremento frequenza
lds r25,{Fincr+1} 'usa 24 dei 32 bit
lds r26,{Fincr+2} 'MSB
Gen:
add r28, r24 ' 1 cycle
adc r29, r25 ' 1 cycle
adc r30, r26 ' 1 cycle
sbrc r30,7 ' 1/2
rjmp m1 ' 2/0
cbi PortD,0 ' 0/2
rjmp m2 ' 0/2
m1:
sbi PortD,0 ' 2/0
sbic Pinb,0 ' 1/0 проверка на выход из подпрограммы
m2:
rjmp Gen ' 2 cycles totale 11 ciclihttps://www.radiokot.ru/forum/viewtopic ... 6#p1145786sbic Pinb,0 пропускаю в одном случае для выравнивания веток по времени.
можно в принципе засунуть в прерывание с целью уменьшения джиттера
У меня немного более садистский подход...
(один лишь генератор не столь интересен)
Хотя основа в принципе та же.

Концепт-набросок "треглавого змея" пищащего на разные голоса.
схемка теста
https://img.radiokot.ru/files/20529/2fkkt20prf.GIF
архив проекта в наброске заданы три фиксированных частоты...
К сожалению на внутреннем RC у аттини2313 частота 15000 Гц получилась "не очень" - надо б и остатки совести иметь...
Однако в остальном... Весьма интересное применение может иметь место...

(один лишь генератор не столь интересен)
Хотя основа в принципе та же.
Концепт-набросок "треглавого змея" пищащего на разные голоса.
схемка теста
https://img.radiokot.ru/files/20529/2fkkt20prf.GIF
архив проекта в наброске заданы три фиксированных частоты...
К сожалению на внутреннем RC у аттини2313 частота 15000 Гц получилась "не очень" - надо б и остатки совести иметь...
Однако в остальном... Весьма интересное применение может иметь место...
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
маленько офигел от этого, дальше рассматривать не смог:
забыл почему include рассширение txt а не asm inc как положено.
Имхо можно было все в одном asm файле разместить - как тут понять где находится "test_inp" и где reti в векторе подевалась.
типа "треглавого змея" пищащего на разные голоса было же, про RTOS упоминалось
http://www.pic24.ru/doku.php/osa/articles/pk2_osa_piano
Код: Выделить всё
; "irq_avr.txt" файл описания поля векторов прерываний
;
.cseg
.org 0x000
irq_res:
rjmp start ; переход к началу программы инициализации системы
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; блок размещения векторов активных прерываний
.org OVF0addr ; Timer/Counter0 Overflow
irq_t0:
rjmp test_inp
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ***** END OF FILE ******************************************************Имхо можно было все в одном asm файле разместить - как тут понять где находится "test_inp" и где reti в векторе подевалась.
типа "треглавого змея" пищащего на разные голоса было же, про RTOS упоминалось
http://www.pic24.ru/doku.php/osa/articles/pk2_osa_piano
*.asm у моего "слэнга" только один -дабы не путать обработку компилятором с линкером(и запуском с прописями из командной строки). Мы ранее уже в достатке про те условности поцарапсом занимались - смысла повторяться не вижу.
Касательно одного файла - можно и так, но попозже захочется вытянуть в вариант библиотечки - так лучше уж заранее заложить вариант разделения.
В "наброске" только базовый алгоритм теста на три независимых канала генерации с раздельными выходами для каждого из каналов. А как уже ими управлять/куда применять то уже вторично. В отличии от DDS использован только базовый счётчик периода без формирования сигнала через массив данных в ПЗУ.
Главный результат того тест-наброска - независимая генерация меандра по нескольким каналам возможна, запаса по времени вполне достаточно для запуска в фоновом режиме, размер кода весьма скромный.
Параметры выходного сигнала вполне укладываются в "ширпотреб" для любительского применения даже при 8МГц тактовой частоты.

Касательно одного файла - можно и так, но попозже захочется вытянуть в вариант библиотечки - так лучше уж заранее заложить вариант разделения.
В "наброске" только базовый алгоритм теста на три независимых канала генерации с раздельными выходами для каждого из каналов. А как уже ими управлять/куда применять то уже вторично. В отличии от DDS использован только базовый счётчик периода без формирования сигнала через массив данных в ПЗУ.
Главный результат того тест-наброска - независимая генерация меандра по нескольким каналам возможна, запаса по времени вполне достаточно для запуска в фоновом режиме, размер кода весьма скромный.
Параметры выходного сигнала вполне укладываются в "ширпотреб" для любительского применения даже при 8МГц тактовой частоты.


