Генератор с регулируемоей частотой на ардуино.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kloker, как написать вывод я знаю.  Подумать надо что можно сделать полезного на этой основе, и главное потом этот код встроить малой кровью в мою программу :)

Вот уже накатал примерчик: ГКЧ 20 Гц..20кГц,  (Для частот >20кГц  придёться уменьшать массив). В лупе меняется тактовая с таймера, и что-то типа примитивной экспоненты что-б на НЧ подолгу не зависало. Вывод через DMA в GPIOA для резисторного цапа.

#include <dma_private.h>
uint8_t wave[256]; //массив синусоиды
void setup() {
GPIOA_BASE->CRL = 0x33333333;// pa0-pa7  выход
for(uint16_t n=0; n<256; n++){wave[n]=255*(sin(TWO_PI*float(n)/256)+1)/2 ;}// заполнение синусом
TIMER2_BASE->DIER=(1<<8); //пинать DMA при событии Update
TIMER2_BASE->ARR=7000;// Freq_min примерно 20 Гц ( = 36MHz /256 /6999 )
TIMER2_BASE->CR1=1;
dma_init(DMA1);
dma_setup_transfer(DMA1,DMA_CH2,(uint8_t*)&GPIOA->regs->ODR,DMA_SIZE_8BITS, (uint8_t*)wave, DMA_SIZE_8BITS, (DMA_MINC_MODE|DMA_CIRC_MODE|DMA_FROM_MEM) );
dma_set_num_transfers(DMA1, DMA_CH2, 255);
dma_enable(DMA1, DMA_CH2);
}
void loop() {  
for (int n=7000; n>5; n-- ) { n/=1.005;  TIMER2_BASE->ARR=n; delay(5);}
for (int n=5; n<7000; n++ ) { n*=1.005; TIMER2_BASE->ARR=n; delay(5); }
}

Но встроить это в программу легко при условии что никакие параметры не будут регулироваться. Иначе куча рассчётов.. Можно сделать ещё лучше -  избавится от лупа и сделать ещё один массив ARR-значений для таймера, тактирующего вывод через DMA. Для этого понадобится ещё один таймер, в общем функция разрастётся в длинную портянку вычислений. Заниматься этой рутиной вообще не тянет (=

Ещё рождается новый вариант  синтеза dds -можно тактировать  DMA через таймер от внешнего сигнала с Si5351 Появиться преимущество - сильно снизиться джиттер, который довольно ощутимый есть в том алгоритме, что я использую сейчас. И за счёт линейности генерирования тактовой от si5351 можно будет получить довольно линейную регулировку выходной частоты dds , но есть и минусы -возникнет необходимость пересчитывать массив для разных диапазонов частот, ( с объёмом  массива 256 байт как в примере выше в принципе нельзя получить частоты выше ~23 кГц (=samplerate 6MHz/256) ) Правда тут ещё сложность -все входы тактирования заняты (A0,А12,А15).. разве что как то перехватывать вход частотометра А15. Но мудрить с переключением тоже не лучший выход.

В общем вот такие вот думки..

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kloker, кстати намедни на радиокоте выложили проект генератора на F303, видели?  Он конечно в разных весовых категориях с моим. По всем возможностям обходит мой, его смело можно отнести в категорию "измерительный прибор" ибо и аппаратно и программно соответствует, таких широких возможностей у самоделок я вообще никогда раньше не видел (!). Автор основательно поработал.  Но в отличии от моей поделки  в сборке  сложен, - требует изготовления печатных плат,  подетальной пайки, в общем только для опытных радиолюбителей.  Пробежавшись по характеристикам всё таки нашёл узкое место- частота дискретизации в режиме DDS всего 1.4МГц   . (У моего 4,5 МГц при  F_CPU= 72MHz &&  выводе в встроенный цап ). А ещё немаловажно, что обещает автор - проект будет развиваться.

kloker
Offline
Зарегистрирован: 01.01.2019

 

dimax, спасибо за ссылку, почитаю обязательно! потолок всего 1.4МГц действительно выглядит странно, надо спросить у автора о причинах.. 

ps/ в статье о ГА71 не нашел ника автора, и ветки на форуме. ссылка ведет на корень форума. кто знает, где почитать подробнее, и следить за развитием проекта?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kloker, наверно причина низкого битрейта  в накрученных алгоритмах. У него ж 2 аналоговых канала, которые и суммироваться и умножаться, и модулироваться могут. Ну и конечно потому, что dds-алгоритм наверняка на "Си", а не ассемблере :)     Да, контактов автора почему-то нету. Наверное главкоту стоит написать, kot@radiokot.ru  что б  дал контакты  автора прибора.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

К теме как отличить настоящий МК, сфоткал сейчас свой блюпил, у меня надписи читаются без труда (фотка кликабельна).

venus
venus аватар
Offline
Зарегистрирован: 08.10.2019

MAG-N пишет:
Так я выше сказал - замените на "Hz". Так будет правильнее.

заменил. обновил библиотеки в выложенном комплекте, поправил сдвиги. все работает. спасибо автору за полезный девайс.

а si5351 только меандр умеет выдавать? хотя конечно и цап неплохую форму выдает на довольно приличных частотах, но не на мегагерцах конечно. резисторы в делитель брал smd с допуском 1%.

с другой стороны, на десятках мегагерц у меня осциллографу становится наплевать на форму, все стремится к синусу. :) да и уровень невысок.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

venus, ещё adg704 давит фронты. У него заявлена пропускная способность что-то вроде до  200 МГц, но под этой цифрой подразумевается синус :) Если я когда нибудь буду переносить в другой корпус, то коммутацию сделаю на релюшках, как Mag-N. Может даже шикану, и куплю мелкие вч-релюшки.

PS про Herz я как-то и незадумывался, с буквой t оно даже симметричнее смотрится, надо тоже исправить  :)

MAG-N
MAG-N аватар
Offline
Зарегистрирован: 05.06.2017

venus пишет:

релюшки надо завтра посмотреть, какие есть на работе, может попадутся подходящие.

Я герконовые поставил, у них при пяти вольтах ток срабатывания меньше 10 мА - подключены напрямую к выходам дешифратора 74138. Вот такие:

mataor
Offline
Зарегистрирован: 30.01.2014

по поводу реле - я тоже у себя использовал, в посте 81 писал. хз насколько высокочастотные, но мелкие, с 3.3в питанием и 30ма потреблением, по адекватной цене на али - G6K-2F-Y

да, если разводить - не стоит забывать что они имеют полярность.

MAG-N
MAG-N аватар
Offline
Зарегистрирован: 05.06.2017

В данной конструкции можно любые малогабаритные реле использовать. Это ведь не реле обхода антенного усилителя или РА, где ВЧ напряжение 100-200 В и более.

venus
venus аватар
Offline
Зарегистрирован: 08.10.2019

мне тоже палитра больше от red понравилась, так что в я него просто сдвиги из green добавил в ините.

загрузчик брал последний в теме. он, помнится, boot1 джампер использует вместо ресета, так что можно постоянно плату держать под прошивку. вот только у меня почему-то устройство usb только serial с pid=0004 появляется, а под прошивку pid=0003 упорно отсутствует, в том числе после добавления резистора с A12 на 3.3. и разъем microusb был дрянной родной, пропайка не помогла, поменял, но на usb-устройства само собой не повлияло. так что мне проще stlink'ом пользоваться. хотя в принципе неважно, девайс уже в корпус закинул, выбросив потроха из ростелекомовской iptv-приставки. брендовый девайс получился. :)

вольтметр зацеплен на аккум и немного подвирает, на 2%, на входе резистор больший воткнул без подбора. наверное, стоит коррекцию прямо в коде поставить.

не хватает разве что сохранения параметров и текущего режима. ну и регулируемого выходного напряжения.

MAG-N
MAG-N аватар
Offline
Зарегистрирован: 05.06.2017

Заметил одну особенность : очищаем память контроллера, заливаем загрузчик. Далее прошиваем хоть Блинк, хоть Графиктест или что-то подобное и так раз 20 подряд - всё прошивается без лишних телодвижений. Но стоит прошить любую версию данного генератора, и для следующей прошивки надо давить РЕСЕТ. Если затем опять загрузить что-то другое (через РЕСЕТ), то автоматическая загрузка восстанавливается. Загружаем генератор - и опять те же Я...  Положение джампера BOOT1 никак не влияет.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

MAG-N, я вроде писал про это. В скетче отключается всё лишнее, в том числе прерывания USB, без них не работает USBCDC, который образует ком-порт, без него IDE не может инициировать загрузку бутлоадера.

venus
venus аватар
Offline
Зарегистрирован: 08.10.2019

в режиме pwm, если поставить шаг 1E4, на второе увеличение частота прыгает на 36MHz.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

venus пишет:

в режиме pwm, если поставить шаг 1E4, на второе увеличение частота прыгает на 36MHz.

Это из-за того, что на частотах выше 8кГц нет привязки шага к герцам. Можно ввести доп условие:

  if (tim_arr<10000 && encstep > 10000) encstep=10000; // уменьшать шаг с ростом частоты

И тогда не будет так резко скакать.

venus
venus аватар
Offline
Зарегистрирован: 08.10.2019

чисто для частотометра http://www.radioscanner.ru/forum/topic38601.html

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

MAG-N
MAG-N аватар
Offline
Зарегистрирован: 05.06.2017

Собирал я этот формирователь (по номиналам деталей похож на тот, что с Радиосканнера)- и сейчас он работает, но у него нижний предел частоты был порядка нескольких сотен герц. Добился нижнего предела 1 Гц, для чего параллельно С2 поставил керамику 10 мкФ, а параллельно С7 и С10 - электролиты по 100 мкФ. При этом верхний предел упал где-то со 100 до 80 МГц. Мне нижний предел важнее был. А чувствительность - это питания полевику маловато, не зря в "Фрегате" он от 12В питается. В даташите на транзистор явно указано "VHF and UHF applications with 12 V supply voltage"

Tvics
Offline
Зарегистрирован: 12.04.2017

dimax, спасибо за генератор. Хороший приборчик, сделал усилитель на DDS OUT, но пока мучась идут искажения. Время будет доделаю.

ingfa
Offline
Зарегистрирован: 15.09.2018

dimax пишет:

ingfa, какой ещё float? Там все слагаемые целочисленные. И я вам уже писал, что бы сделать частоту выше 23 кГц нужно уменьшать размер массива. Плюс есть ещё ограничение: ARR не должен быть меньше 5.

PS: Вообще 300кГц это слишком много, качество будет никакущим.

Чем же мне генерить синус и другие сигналы? AD9833 внешние таблицы поддерживает? 

venus
venus аватар
Offline
Зарегистрирован: 08.10.2019

MAG-N пишет:
Ардуина ИДЕ вполне себе решает.

я же не про арифметику. неразборчивость приведет к тому, что например для целого freq операция freq += 1E-5 сгенерирует несколько десятков байт совершенно бесполезного кода. хотя прямое присвоение будет отработано оптимизатором на этапе компиляции.

давайте закончим, делайте как вам удобно. я никого собственно и не агитировал что-то менять, просто объяснял, что ошибка была не на ровном месте. у меня привычки после сиротских avr, там потеря 300 байт может выйти боком.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ingfa пишет:

Чем же мне генерить синус и другие сигналы? AD9833 внешние таблицы поддерживает? 

Есть множество вариантов, над которыми можно подумать

1- применить аналоговый способ модификации меандра.

2 -применять более шустрый  МК. Вот тот-же F401 у меня умудряется слать семплы с вдвое большей скоростью, хотя сама тактовая частота мк  всего на 12МГц выше.  Про другие МК я не в курсе.

3 Использовать внешний чип- синтезатор с загрузкой пользовательских таблиц.

4 купить готовый прибор с возможностью загрузки таблиц. Скорее всего будет стоить очень дорого.

shtorm
Offline
Зарегистрирован: 14.12.2017

venus. Благодарю за участие. Перешел на версию ИДЕ 1.6.8. Ошибка и здесь появилась в строке 088. После того как убрал все нолики до строки 100, ошибка перешла на строку 162 с формулировкой: expected unqualified-id before numeric constant. Библиотеку для дисплея брал по ссылке поста #12 'ТУТ'. Если не затруднит, подскажите и направьте на путь истинный, в программировании не силен, больше сориентирован на аналоговые приборы. Уважением.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

shtorm, ничего не надо менять. Код везде рабочий.  Есть подозрение что вы неправильно его копируете . Над кодом справа вверху есть всплывающий ява-скрипт. Вот там есть кнопка "код", которая открывает  окно с кодом без всяких служебных символов, его и надо копировать.

ingfa
Offline
Зарегистрирован: 15.09.2018

Получается AD9833 пойдетдля загрузки внешних таблиц. Но я ни видел никогда примеров кода для этого DDS генератора.   

MAG-N
MAG-N аватар
Offline
Зарегистрирован: 05.06.2017

venus пишет:

MAG-N пишет:
Ардуина ИДЕ вполне себе решает.

 например для целого freq операция freq += 1E-5

1E-5 целым быть не может. 0.00001

А с dimax я согласен, использование 1Е3 и прочих в некоторых случаях вполне оправдано, чтобы нолики в глазах не рябили. Никогда про себя не ругались, вводя какие-нибудь банковские реквизиты с туевой хучей нулей?

Подчистить бы эту ветку, а то флуда развели...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ingfa, не подойдёт.  ad9102 вроде подходит. Но точно сказать не могу, нужно изучать даташит. Вообще эта тема не лучшее место для обсуждения вашего вопроса, тут идёт обсуждение конкретного проекта.

venus
venus аватар
Offline
Зарегистрирован: 08.10.2019

MAG-N пишет:
1E-5 целым быть не может. 0.00001

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

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

MAG-N
MAG-N аватар
Offline
Зарегистрирован: 05.06.2017

venus пишет:

я вроде предлагал закончить это обсуждение.

Вроде всё обсудили. Каждый остался при своём мнении. Подчистить бы эту ветку, а то флуда развели...

shtorm
Offline
Зарегистрирован: 14.12.2017

dimax. Благодарю за дельный и познавательный для меня совет. Все прекрасно скомпиллировалось. Теперь осталось дождаться получения посылки с энкодерами из Чины. Уважением.