Котуинко

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

Re: Котуинко

Сообщение BOB51 »

СБИС в смысле специализированных больших микросхем.
А сколько там транзисторов - как в МП/МК или чуток поменьше - лишь бы больше, чем в "средней рассыпухе" было.
8)
Я исходил из простейшего варианта генератора меандра, без дополнительных супертаблиц.
Так что там в принципе совсем мало надо.
8)
Единственно стабильность у DDS таки пониже, чем у счетчика...
То уж выбираем чего нам удобнее - или примитив с высокой стабильностью и "грубым" шагом или навороченный "мягколапый" вариант с дополнительными фильтрами.
Или уж совсем навороченный специализированный кристалл...
:roll:
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

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

Re: Котуинко

Сообщение Zhuk72 »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3976870#p3976870"]

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

void interrupt Timer2_ISR(void)
{
    if (TMR2IF)
    { 
        ++gDutycount;                                 // Increment the counter variable by 1
        if(gDutycount == 39)
        {
            gDutycount = 0;
        }
        PWM1DCH = SINETABLE[gDutycount]; // Load the duty cycle register according to the sine table
        TMR2IF = 0;
    }
}
[/uquote]
Вместо 39 должно быть 40. Иначе последний элемент массива теряется.
Либо загрузку в ШИМ переместить до проверки.
Последний раз редактировалось Zhuk72 Пн фев 08, 2021 16:43:13, всего редактировалось 1 раз.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Котуинко

Сообщение Reflector »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3976870#p3976870"]синус в принципе не сложно см. AN1523[/uquote]
Не сложно, но медленно. Прикинь сколько времени будет выполняться обработчик прерывания на PIC учитывая, что CPU относительно STM32G0 медленнее в 8 раз только по тактовой... При этом для STM32 подобная работа по прерываниям будет раза в 3 медленнее, чем с DMA, т.к. дополнительно ~30 тактов тратятся на каждый вызов, а полезной работы в обработчике тактов на 10-15. Итого STM32 без NCO на генерации синуса будет в 5-10 раз быстрее PIC с NCO, что не так и удивительно.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение 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
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

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

Re: Котуинко

Сообщение oleg110592 »

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

Re: Котуинко

Сообщение Sergi »

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

Re: Котуинко

Сообщение oleg110592 »

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

Re: Котуинко

Сообщение BOB51 »

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

Re: Котуинко

Сообщение oleg110592 »

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

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

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

Re: Котуинко

Сообщение BOB51 »

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

Re: Котуинко

Сообщение Zhuk72 »

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

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

Re: Котуинко

Сообщение oleg110592 »

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

Re: Котуинко

Сообщение BOB51 »

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

Re: Котуинко

Сообщение Sergi »

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

Re: Котуинко

Сообщение BOB51 »

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

Re: Котуинко

Сообщение 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-ами :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Re: Котуинко

Сообщение Reflector »

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

Re: Котуинко

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

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