Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

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

Сообщение BOB51 »

Для генерации меандра с помощью DDS таблица в принципе не требуется.
Достаточно инверсии выхода ири переполнении на удвоенной частоте или "виртуальной таблицы" из 0 и 1, возможно в ОЗУ.
А это значительно снижает нагрузку на программу и ее размер.
:roll:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

из википедии
Цифровой вычислительный синтезатор (ЦВС), известный еще как схема прямого цифрового синтеза (DDS) — электронный прибор, предназначенный для синтеза сигналов произвольной формы и частоты из единственной опорной частоты, поставляемой генератором тактовых импульсов. Характерной особенностью ЦВС является то, что отсчеты синтезируемого сигнала вычисляются цифровыми методами, после чего передаются на цифро-аналоговый преобразователь (ЦАП), где и происходит их преобразование в аналоговую форму (напряжение или ток).
т.е. без ЦАП будет не совсем DDS. А на ЦАП проще имхо из таблички во флэше. В ОЗУ сформировать еще надо, это хоть и не значительно, но повышает нагрузку на программу и ее размер
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

В STM большой расход времени на вход/выход в прерывание. Можно попробовать крутить DDS в основном цикле синхронизируясь с каким нибудь таймером, следить за битом UIF например. В прерывании обрабатывать уставки. Естественно в этот момент генерация будет срываться. Может получится и более 2Мсемпл/сек (менее 36 тактов на круг). На AVR c прерываниями у меня уходило 38 тактов. Таблица в ОЗУ. Пробовать нужно.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

у Чена DDS на STM32F3, 72Мгц тактовая - успевает в прерывании еще и синтезировать форму сигнала
ЦА преобразование запускается выходом таймера и дает выходной сигнал без дрожания. DAC может генерировать прерывание или запрос DMA при каждом преобразовании, чтобы получить следующие данные для вывода. Поскольку скорость преобразования ЦАП до 1 Msa/sec (72 такта ЦП на передачу) слишком высока для обработки прерывания, в этом проекте данные ЦАП передаются с помощью контроллера DMA. Контроллер DMA выбирает значение выборки из буферной памяти и записывает его в регистр DAC при каждом запросе DMA. Контроллер DMA настроен в циклическом режиме для перезапуска передачи данных с вершины буфера, когда он достигает конца буфера. Он также генерирует прерывание на половину передачи и последнюю передачу. Подпрограмма обслуживания прерывания DMA синтезирует форму волны и каждый раз заполняет половину буфера DMA. Таким образом, контроллер DMA используется в качестве буфера FIFO для потоковой передачи данных формы волны в ЦАП.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Так мне ж и меандра достаточно.
8)
Собственно сам принцип "наращивания" для малоразрядного таймера берем из DDS,
только "расширения" табличного не делаем.
И запускаем два генератора - один на Т1 (классика), второй на Т0 (извращенный DDS)...
Воть попробую чего нашкарябать для тиньки2313 из интереса...
:write:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

лайфак - простейшая псевдоDDS, для одной ноги (меандра) :)

Код: Выделить всё

loop:
 sbi PINB, 5
 nop
 nop
 ....
 jmp loop
частота регулируется количеством nop
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ага!
И больше нихрена с того МК не плучить - основной цикл единственный (если охота хоть чуток стабильности).
А прерывание и приклеенные к ним прожки будут "портить картинку".
:))
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3977292#p3977292"]Так мне ж и меандра достаточно.[/uquote]
Для меандра как раз один только NCO без проблем выдаст частоту переполнения своего аккумулятора вплоть до задающей, например 32МГц от внутреннего генератора, с независимым от ядра дерганьем вывода порта каждое переполнение, выдавая 16МГц меандр. Также вместо меандра можно выдавать импульсы.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3977388#p3977388"]И больше нихрена с того МК не плучить - основной цикл единственный[/uquote]
дык так и сделаны DDSы на AVR (примеры выше были) - установка новой частоты кнопкой или по юарт в прерывании это джиттер, потом устаканивается. На слух, если это tone, этот джиттер можно и не услышать. Надо круче - используйте типа RTOS или спец. микроконтроллеры или внешние, так называемые СБИС.
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Достаточно обычной фоновой обработки пары таймеров.
8)
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

Вот например в G030 я не смог обычную фоновую обработку с DMA для выдачи сигнала подружить с АЦП для обработки захвата. Вешался модуль АЦП. Пока отложил.
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Так речь не о полноценном DDS, а о варианте с всего-то генератором меандра с минимизированным шагом перестройки частоты.
Вообще-то весьма интересное решение напрашивается - НО... требует проверки...
Так что пока отвлекусь на "тест нашкрябать"...
:roll:
:write:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

подкину идейку:

Код: Выделить всё

LOOP:
  IJMP
TBL:
  NOP
  NOP
  ... ; еще куча NOP-ов
  SBI PINB, 1
  JMP LOOP
занесли в Z адрес TBL+T (где Т - величина, определяющая длительность полупериода), вычисленный по нужному значению ПОЛУПЕРИОДА требуемого меандра, и переходим на LOOP, начинается генерация меандра на PORTB1. теперь в прерываниях перерасcчитываем Z - и период меняется. максимальная частота будет F_CPU/12, шаг изменения периода 2/F_CPU, минимальная частота зависит только от количества памяти, занятой NOP-ами :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3977873#p3977873"]теперь в прерываниях перерасcчитываем Z - и период меняется. максимальная частота будет F_CPU/12[/uquote]
Как в такую схему вписываются хотя бы пара кнопок(шаг вперед/назад)? :)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Во нашел 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 cicli
sbic Pinb,0 пропускаю в одном случае для выравнивания веток по времени.
https://www.radiokot.ru/forum/viewtopic ... 6#p1145786
можно в принципе засунуть в прерывание с целью уменьшения джиттера
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У меня немного более садистский подход...
(один лишь генератор не столь интересен)
Хотя основа в принципе та же.
:twisted:
Концепт-набросок "треглавого змея" пищащего на разные голоса.
схемка теста
https://img.radiokot.ru/files/20529/2fkkt20prf.GIF
архив проекта
ags_t.zip
(41.92 КБ) 282 скачивания
в наброске заданы три фиксированных частоты...
К сожалению на внутреннем RC у аттини2313 частота 15000 Гц получилась "не очень" - надо б и остатки совести иметь...
:?
Однако в остальном... Весьма интересное применение может иметь место...
:roll:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

маленько офигел от этого, дальше рассматривать не смог:

Код: Выделить всё

;         "irq_avr.txt"  файл описания поля векторов прерываний
;
 .cseg
	.org 0x000
 irq_res:
	rjmp start ; переход к началу программы инициализации системы
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; блок размещения векторов активных прерываний
 .org OVF0addr ; Timer/Counter0 Overflow
irq_t0:
  rjmp test_inp
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ***** END OF FILE ******************************************************
забыл почему include рассширение txt а не asm inc как положено.
Имхо можно было все в одном asm файле разместить - как тут понять где находится "test_inp" и где reti в векторе подевалась.
типа "треглавого змея" пищащего на разные голоса было же, про RTOS упоминалось
http://www.pic24.ru/doku.php/osa/articles/pk2_osa_piano
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Вернуться в «Разные вопросы по МК»