Генератор с длительностью импульсов 20us с частотой 80Khz

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

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение oleg110592 »

примерчик генерации синуса AN1523 на PIC10F322, скомпилированный онлайн компилятором, работает в протеусе
Изображение
ошибка, указанная ранее Zhuk72, в другой теме, похоже проявляется
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Dimon456 »

MikroC PRO for PIC установил, на нем собрал.
В протеусе, да идеально, насколько в протеусе этот модуль программно описан.
Синус AN1523 не интересует, он использует PWM, а не NCO модуль. PWM в любом контроллере есть, На нем не получить шаг в 1Гц и меньше. Я думал что можно как то с генерировать синус с помощью частотной модуляции.

А NCO в pic10f322 построен на сумматоре с выводом переполнения, ни каких там фазовых подстроек нет.

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

FOVERFLOW = NCO_Clock_Frequency * Increment_Value
К сожалению в Атмеге аппаратного сумматора нет.
А программный сумматор почему-то проскакивает и в результате наблюдается фазовое дрожание. Я всяко пробовал, на asm не пробовал. Попробовать собрать код в CVAVR, в нем свой компилятор.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение oleg110592 »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3981730#p3981730"]Синус AN1523 не интересует, он использует PWM, а не NCO модуль.[/uquote]
написано - Using
Sine Wave Generator Using Numerically Controlled Oscillator Module
AN1523
This application note focuses on the use of the NCO module for designing a Sine Wave Generator.
https://www.microchip.com/wwwAppNotes/A ... e=en561389
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Reflector »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3981740#p3981740"]написано - Using[/uquote]
Похоже они просто меандр фильтруют... Причем показательно, что меандр должен быть 1KHz, но даже этого NCO не может, т.к. нужно поделить 16MHz на 8000, а 2^20 нацело на 8000 не делится :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение oleg110592 »

в ан написано
ПРЯМОЙ ЦИФРОВОЙ СИНТЕЗ (DDS) И NCO
Прямой цифровой синтез - это метод генерации аналоговой формы волны, обычно синусоидальной формы, из изменяющегося во времени сигнала в его цифровой форме и ЦАП. Модуль NCO работает по принципу DDS, многократно добавляя фиксированное значение в аккумулятор. Аккумулятор имеет длину 20 бит, и сложение происходит с входной тактовой частотой, которая может составлять максимум около 16 МГц. Аккумулятор будет периодически переполняться с установленным битом переноса, и это приведет к переходу на выходе модуля NCO. Модуль NCO может работать в двух режимах: фиксированный рабочий цикл PWM и частотно-регулируемый импульсный режим. При таком расположении отклик будет очень линейным в широком диапазоне частот, в пределах от 0 кГц до 500 кГц с использованием тактовой частоты 16 МГц. Частотное разрешение, которое может быть получено, является точным и составляет 15 Гц во всем частотном диапазоне. Линейное управление частотой и повышенное частотное разрешение являются ключевыми отличительными факторами по сравнению с традиционным управлением частотой на основе ШИМ.
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Dimon456 »

oleg110592 писал(а):в ан написано
AN1523 я не читал, но что oleg110592 показал для синуса, ни разу не использует регистры модуля NCO1xxx,
все что он сделал это

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

// Timer2 configuration for PWM
PR2 = 99; // PWM period register for 40 kHz
T2CON = 0x04; // Timer2 on
// PWM 1 configuration
PWM1CON = 0xC0; // PWM1 on, PWM 1 output enable
PWM1DCH = 50; // PWM duty initialized to 50%
PWM1DCL = 0;
PIE1bits.TMR2IE =1; // Timer2 interrupt enable
INTCON =0xC0; // Global interrupt enable, peripheral interrupt enable
вроде даже подписано все, а потом в прерывании таймера

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

PWM1DCH = SINETABLE[gDutycount]; // Load the duty cycle register according to the sine table
Это любой МК может, другой вопрос с каким разрешением?
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение oleg110592 »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3981905#p3981905"]показал для синуса, ни разу не использует регистры модуля NCO1xxx[/uquote]
в том примере и не говорилось о NCO - см. раздел AN1523 Sine Wave Generation Using the Look-Up Table Method. Просто проба это скомпилить онлайн т.к. был вопрос - "какой самый минимальный компилятор...". В AN1523 есть второй пример где NCO генерирует меандр. Если все внимательно читать - КРАМ даже писал:
Каждое переполнение модуля NCO помимо генерации импульса настроенной длительности, генерируется прерывание, в котором и следует перегрузить очередное значение сигнала из таблицы в PWM или DAC.
Таким образом, на крошечном и дешевом PIC10F322 можно сделать настоящий DDS.
тут писал
https://www.radiokot.ru/forum/viewtopic ... 3#p3826573
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25328
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение КРАМ »

[uquote="Reflector",url="/forum/viewtopic.php?p=3981748#p3981748"]но даже этого NCO не может, т.к. нужно поделить 16MHz на 8000, а 2^20 нацело на 8000 не делится :)[/uquote]
А нужно делить нацело? :) Все DDS-ы нацело ничего не делят. Просто скользит фаза перехода через ноль, создавая некий джиттер, который можно размывать путем последующего деления частоты. На выходе NCO традиционно есть два устройства - риппл-таймер и делитель на 2. Один для фиксированной длительности импульсов, а другой для меандра.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Dimon456 »

Меня не волнует что там перешло через 0.
Меня волнует дрожание фазы:
Допустим, я заказал частоту 9512Гц, число в сумматоре у меня 7792, на выход ровно придет 9512 импульсов в 1 секунду (я проверил), но проблема в том что ширина импульса постоянно меняется то 50мкс то 56мкс.
Прибор DM90A в этом случае показывает процент заполнения отличный от 50%, не чистый меандр.
А все потому что 65536 не делится на цело число 7992.
Делится на цело число 8192, что на выходе дает 10кГц идеальный меандр.

Думаю, уверен, что NCO модуль в PIC будет давать ту же погрешность, принцип работы тот же.

Вот картинка меандр 2МГц с AD9833
СпойлерИзображение
Начиная с 1 МГц - джиттер, на 2 МГц его видно на осциллограмме.
Последний раз редактировалось Dimon456 Ср фев 17, 2021 10:23:07, всего редактировалось 1 раз.
linkov1959
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение linkov1959 »

А в Протеусе нельзя проверить работу NCO?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Dimon456 »

linkov1959 писал(а):А в Протеусе нельзя проверить работу NCO?
Нет, в протеусе эти модули описаны программно, насколько это близко к реальному железу - не знаю.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3982308#p3982308"]Допустим, я заказал частоту 9512Гц, число в сумматоре у меня 7792, на выход ровно придет 9512 импульсов в 1 секунду (я проверил), но проблема в том что ширина импульса постоянно меняется то 50мкс то 56мкс.[/uquote]
Оно так и должно работать. Если замерять частоту для достаточно продолжительного сигнала, то частотное разрешение, как писал oleg110592, будет в пределах 15Hz, а сами периоды или полупериоды могут друг от друга отличаться на 5% и более. На STM32 с более быстрыми таймерами можно для меандра получить большую точность, но придется периодически выполнять коррекцию, хотя все равно в итоге свободных ресурсов останется больше, чем у PIC16.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25328
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение КРАМ »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3982308#p3982308"]Вот картинка меандр 2МГц с AD9833[/uquote]
Картинка ни о чем. Я такую могу показать даже на кварцевом генераторе... :)))
При задержке синхронизации на сотню периодов мы увидим стабильность синхронизации осциллографа, а не исследуемого сигнала.
Но если по делу, то я вам несколько ранее говорил на счет соотношения частот...

Добавлено after 19 minutes 30 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3982308#p3982308"]Меня не волнует что там перешло через 0.
Меня волнует дрожание фазы[/uquote]
Вообще то переход через 0 и есть условно нулевая фаза. Та самая, которая дрожит.
Правда есть вопрос к тому, почему вы так озаботились джиттером?
Так для накачки в 16 МГц и упомянутой частоты 9512 Гц джиттер составит всего 65 нс.
НАНОСЕКУНД, Карл!!!
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Dimon456 »

КРАМ писал(а):Правда есть вопрос к тому, почему вы так озаботились джиттером?
Это вас заботит этот джиттер[uquote="КРАМ",url="/forum/viewtopic.php?p=3979459#p3979459"][uquote="Dimon456",url="/forum/viewtopic.php?p=3979249#p3979249"]Что?
Timer Period: 6,25 us[/uquote]
этошуткатакой? :)))
То есть вы всерьез полагаете, что при накачке такого DDS частотой 160 кГц можно получить вменяемый меандр с частотой в десятки килогерц? :facepalm:
Кроме тотального и лютого джиттера вы там больше ничего не увидите...[/uquote]Надо на stm32f030 попробовать, разогнать до 72МГц или сколько там позволит.

Reflector, а что в stm32 ни чего нет что-бы работало на аппаратном уровне в режиме сумматора и генерировало прерывание, таймер нельзя так настроить?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25328
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение КРАМ »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3982535#p3982535"]Таймер нельзя так настроить?[/uquote]
А подумать и ответить самому на свой вопрос? Вы знаете разницу между двоичным счетчиком и двоичным сумматором? :)))
Конечно можно заставить счетчик инкрементироваться N раз. Беда только в том, что сделает он это не за один клок, а за N клоков... :tea:
А сумматор получит результат суммирования с N ровно за один клок.

Добавлено after 3 minutes 56 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3982535#p3982535"]Надо на stm32f030 попробовать, разогнать до 72МГц или сколько там позволит.[/uquote]Только вход/выход в прерывание займет около трех десятков машинных циклов. Без всякого суммирования. И из 72 МГц останется меньше 2,5. При этом я не учитываю какие то действия в суперлупе. Контроллер будет загружен на 100%.

Добавлено after 2 minutes 43 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3982535#p3982535"]Это вас заботит этот джиттер[/uquote]
Джиттер в полсотни наносекунд на периоде в 100 микросекунд конечно может заботить, но стоит пояснить почему. Об этом был мой вопрос. А джиттер в 10% от периода - это беда. Вопросы про такой я задавать не буду. :tea:
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3982535#p3982535"]а что в stm32 ни чего нет что-бы работало на аппаратном уровне в режиме сумматора и генерировало прерывание, таймер нельзя так настроить?[/uquote]
Нет, зато у STM32 есть DMA, сам суммируешь и сохраняешь в массиве наперед ряд значений, практически как это делал для WS2812, только таймер будет не шимить, а тоглить.

[uquote="Dimon456",url="/forum/viewtopic.php?p=3982535#p3982535"]Надо на stm32f030 попробовать, разогнать до 72МГц или сколько там позволит.[/uquote]
STM32G030, кстати, уже на али по $1.5 появляются, там в разгоне таймер спокойно на 256 MHz работает :)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25328
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение КРАМ »

[uquote="Reflector",url="/forum/viewtopic.php?p=3982564#p3982564"]Нет, зато у STM32 есть DMA[/uquote]
Причем тут DMA в приложении к задаче прямого синтеза? Кратность полного периода биений между накачкой и выходным сигналом может быть огромной. Никакого ОЗУ на это не хватит. Тем более, что эта кратность плавающая при перестройке частоты.
Поскольку таймер никаким боком к задаче DDS не облокотился, его разгон не имеет никакого смысла.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Reflector »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3982569#p3982569"]Причем тут DMA в приложении к задаче прямого синтеза? Кратность полного периода биений между накачкой и выходным сигналом может быть огромной. Никакого ОЗУ на это не хватит.[/uquote]
Я уже объяснял, причем конкретно тебе. Если нужно каждые 72 такта обновлять ARR таймера, то с прерываниями только на вход/выход потратится тактов 35, т.е. половина, а с DMA в одном прерывании можно сразу наперед сотню значений насчитать, будет быстрее примерно в 3 раза, причем хочешь в массиве ARR сохраняй для генерации меандра, хочешь сразу табличное значение для генерации синусоиды. 72 такта - это для 500 KHz меандра, а для 10 KHz мк будет загружен на несколько процентов...
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Dimon456 »

Reflector писал(а):сам суммируешь и сохраняешь в массиве наперед ряд значений
я в экселе пробовал эту таблицу делать, КРАМ прав, ни какой оперативки не хватит.
КРАМ писал(а):Поскольку таймер никаким боком к задаче DDS не облокотился, его разгон не имеет никакого смысла.
Вообще разгоняется не только таймер но и ЦПУ, с разгоном уменьшается время выполнения машинного цикла, а значит тактировать таймер можно будет от более высокой частоты чем 160кГц.
И не только stm32 32-битный контроллер, в Атмеге я использовал 16-битные расчеты, а здесь можно уже 32-битные использовать, это большой плюс.
Reflector писал(а):а с DMA в одном прерывании можно сразу наперед сотню значений насчитать,
не пойдет, про прерывание забыли при переполнении сумматора.
И если писать под stm32 то прерывание само надо asm описывать, иначе выигрыша в скорости не получить.
Сумматор должен при переполнении генерировать либо импульс на выход либо прерывание.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3982584#p3982584"]не пойдет, про прерывание забыли при переполнении сумматора.[/uquote]
Зачем, что в этом прерывании делать?
Ответить

Вернуться в «AVR»