Генератор с регулируемой частотой на Arduino Due.
- Войдите на сайт для отправки комментариев
Пт, 02/09/2016 - 13:56
Собрал генератор с регулируемой частотой на Arduino Due по этому проекту
https://www.arduino.cc/en/Tutorial/DueSimpleWaveformGenerator
На выходе 170 Hz - для контроллера с генератором тактовой частоты 84 МГц как то бледно выглядит.
Как поднять частоту и получить прямоугольный сигнал с регулировкой частоты и скважности на выходе хотя бы в пределах от 0 до 2 MHz?
Вот есть тема, там все про это написано. Лучше б Вы по ней собирали. Не патриот Вы нашего форума :)))
Вот есть тема, там все про это написано. Лучше б Вы по ней собирали. Не патриот Вы нашего форума :)))
DUE со своими то 84МГц должна шагать помельче.
Ну, так, адаптируйте его для due. Все основные идеи там отлично изложены. В чём проблема-то?
Ardudue, всё это делается на аппаратных таймерах. Если не найдёте готового проекта для DUE - придётся Вам изучить аппаратные таймеры микроконтроллера SAM3X8E. Зато сможете сделать свой собственный генератор с блекджеком и шл...
DUE только что прикупил. Пока еще смотрю чем отличается код. До этого пользую промини на атмеге 328.
Тут и библиотеки -то не подходят -дисплей 5110 уже не подключить.
Ardudue, всё это делается на аппаратных таймерах. Если не найдёте готового проекта для DUE - придётся Вам изучить аппаратные таймеры микроконтроллера SAM3X8E. Зато сможете сделать свой собственный генератор с блекджеком и шл...
Тут и библиотеки -то не подходят -дисплей 5110 уже не подключить.
Конечно не подходят, если там низкоуровневая работа с микроконтроллером. В отличие от других ардуин с 8-битным МК AVR, Arduino DUE - 32-битный МК ARM Cortex-M3.
Тут и библиотеки -то не подходят -дисплей 5110 уже не подключить.
Конечно не подходят, если там низкоуровневая работа с микроконтроллером. В отличие от других ардуин с 8-битным МК AVR, Arduino DUE - 32-битный МК ARM Cortex-M3.
Тема интересная. Я тоже как то смотрел на дуе что бы сделать нормальный ген . Я так понял, что надо писать на С++ иначе не заставить дуе выдавать прямоугольник на мегагерцовых частотах. Я так понял на русскоязычных сайтах такие дорогие ардуины почти никто не юзает . Нищета наша не позволяет. Вот и нет проектов.
Посмотри вот здесь, чувак гонял на мегагерцах http://www.kerrywong.com/2014/09/21/on-arduino-due-pwm-frequency
Ну, так, адаптируйте его для due. Все основные идеи там отлично изложены. В чём проблема-то?
Да Евгений в чем проблема-то, Вы же владелец дуе подсобили бы челу.
Да, не вопрос, пусть выкладывает свой скетч, посмотрим, подсобим. Пока же я вижу только запрос для "Ищу исполнителя". А я в том разделе не тусуюсь. Вернее, иногда читаю и обсуждаю, но коммерческих предложений никому ещё не делал.
Да Евгений в чем проблема-то, Вы же владелец дуе подсобили бы челу.
Да, не вопрос, пусть выкладывает свой скетч, посмотрим, подсобим. Пока же я вижу только запрос для "Ищу исполнителя". А я в том разделе не тусуюсь. Вернее, иногда читаю и обсуждаю, но коммерческих предложений никому ещё не делал.
так он же в первом посте дал ссылку на проект, (я глянул там скетч есть,)
Вы читать умеете? Я же ясно написал: "пусть выкладывает свой скетч". А если у него есть только ссылка на буржуйский проект, пусть идёт в "ищу исполнителя" и пишет: "хачу как тама!". Я готов помогать начинающему коллеге, который бьётся над задачей и у него не получается. А помогать всем, кому чего-то хочется - у меня помогалка не такая большая. Если у Вас достаточная, так помогите человеку - зачтётся Вам.
Господа да не ссоритесь вы. В моем случае это увлечение, да и Arduino задумывался как открытый проект.
И форум что бы обмениваться информацией и что-то получалось ну для души и другим пригодилось, может быть.
Я полагал, что темы такой нет, и она разовьется для созидания, но не для ссоры.
ОГО, какие страсти-мордасти.
Женя, а чем Вам не нравится, как Вы выразились "буржуйский проект" может Вам DUE выкинуть она-то тоже буржуйская. Ардуино действительно открытый проект для увлеченных. Это только здесь превращают его в бизнес и придумали -"ищу исполнителя".
Я так понял здесь самые увлеченные bodriy2014 и dimax. За что им низкий поклон от старика.
Ardudue, тема не разовьётся, ибо никому кроме вас это не интересно. По очень простой причине -тот генератор на меге328 полностью занимает свою нишу ("из говна и палок"), DUE не принесёт существенных изменений, -шаг будет чуть мельче, -да, максимальная частота повыше, но старые проблемы останутся. - в due всё тот-же 16-битный таймер, и так-же неприемлимо на нём будет возрастать шаг перестройки частоты и скважности. Следующий технически более совершенный уровень генераторов -это готовый чип DDS-синтезатора.
Ардуино действительно открытый проект для увлеченных.
Увлеченные делают сами и приходят на форум с непонятками и шишками. Увлечённые сами откажутся, если им предложат сделать за них, т.к. в этом нет никакого кайфа. Если Вам это непонятно, значит мы по-разному понимаем слово "увлечённость".
Вот код, которым я формировал PPM сингнал на Due при помощи прерываний. В данном примере сформирован пакет состоящий из 9 периодов, первые 8 периодов - "0" 0.3мс, "1" 0.7-1.7мс; последний период - "0" 0.3мс, "1" 6.5-14.5мс - чтобы получить общую длину пакета 22,5мс. Если вы разобрались с прерываниями на avr, то и с этим кодом разберетесь.
Приведённый в первом посте код только с толку сбивает, он для генерации синуса. Для прямоугольных импульсов никакой Arbitrary Waveform или DDS не нужен. Вариантов 3:
1. Таймер, на дуе они 32-битные, скачки по частоте будут, там деление 42МГц / N, т.е. 42/21 -2; 42/22 - 1.909090909; и т.д.
2. ШИМ (PWM), лучше, там делится 84/N, т.е. 84/42 -2; 84/43 - 1.953488372; и т.д.
Примеры здесь: http://www.jaxcoder.com/Article/SinglePost?postID=1976469335
гугл, кстати, и переводить умеет, если что.
3. Внешний ФАПЧ, Si5351 например, можно модуль найти, там точность до сотых герца и почти 300 МГц (проверено) верхняя граница.
так он же в первом посте дал ссылку на проект, (я глянул там скетч есть,)
Вы читать умеете? Я же ясно написал: "пусть выкладывает свой скетч". А если у него есть только ссылка на буржуйский проект, пусть идёт в "ищу исполнителя" и пишет: "хачу как тама!". Я готов помогать начинающему коллеге, который бьётся над задачей и у него не получается. А помогать всем, кому чего-то хочется - у меня помогалка не такая большая. Если у Вас достаточная, так помогите человеку - зачтётся Вам.
Про помогалку. Нет у меня дуи =отлаживать не начем. Я же писал нищита. В гАндурасе жижа упала в цене бабло тютю . Вот бульба вырасла мож реализацию сделаю не в убыток так мож чего у китайцев и прикуплю.
Приведённый в первом посте код только с толку сбивает, он для генерации синуса. Для прямоугольных импульсов никакой Arbitrary Waveform или DDS не нужен. Вариантов 3:
1. Таймер, на дуе они 32-битные, скачки по частоте будут, там деление 42МГц / N, т.е. 42/21 -2; 42/22 - 1.909090909; и т.д.
2. ШИМ (PWM), лучше, там делится 84/N, т.е. 84/42 -2; 84/43 - 1.953488372; и т.д.
Примеры здесь: http://www.jaxcoder.com/Article/SinglePost?postID=1976469335
гугл, кстати, и переводить умеет, если что.
3. Внешний ФАПЧ, Si5351 например, можно модуль найти, там точность до сотых герца и почти 300 МГц (проверено) верхняя граница.
Ardudue, посмотри еще здесь на буржуйском теперь там живет добрая душа
https://ko7m.blogspot.ru/2015/02/high-frequency-due-waveform-output.html
https://ko7m.blogspot.dk/2015/01/arduino-due-timers-part-1.html
http://forum.arduino.cc/index.php?topic=130423.msg1179077#msg1179077
Реально получить и 84МГц на DUE.
У меня больше похож сигнал на синус. Щуп видимо .
В 9-м посте есть линк, на страницу с картинками, так там тоже сплошной синус.
Вот здесь чувак выложил библиотеки для таймеров DUE
https://github.com/ivanseidel/DueTimer
Тема интересная. Я тоже как то смотрел на дуе что бы сделать нормальный ген . Я так понял, что надо писать на С++ иначе не заставить дуе выдавать прямоугольник на мегагерцовых частотах. Я так понял на русскоязычных сайтах такие дорогие ардуины почти никто не юзает . Нищета наша не позволяет. Вот и нет проектов.
Посмотри вот здесь, чувак гонял на мегагерцах http://www.kerrywong.com/2014/09/21/on-arduino-due-pwm-frequency
AVGN, это где такой шаг скважности нужен? Сколько пользуюсь, мельче чем 1% шаг делать надобности не возникало.
dimax, создание и отстройка всякого рода силовых резонансных источников. Например, отстройка резонансных трансформаторов сварочного аппарата или компактного и экономичного блока питания для светодиодов.
Когда подаете импульсы различной скважности на трансформатор (в качестве сердечника ферриты) много всяких полезных эффектов присутствует.
Добрый день. Пытаюсь сделать регулируемый генератор на прерываниях и таймерах Ардуино DUE.
Если коротко то длинна импульса должна быть пропорциональна напряжению на АЦП .
АЦП сконфигурировал – все работает на очень приличной скорости.
Таймер для отсчета длинны импульса работает отлично, но есть большое но:
Вот рабочий код , писал по памяти для примера - может чтото не учел, забыл:
Но стоит с T1 произвести какие либо манипуляции, например T1++; if (T1>1000){T1=0;}, или математические действия, как таймер перестает работать , ну или прерывание прекращается.
Может кто знает как с этим бороться.
Спасибо.
Так же выложу фото, на нем показано импульсом( на 13 ноге (желтый)) работу АЦП в автоматическом режиме , считываетпо прерываниям показания с 5 разных ножек.
Код так же примерный:
Вроде разобрался с портами на DUE, глядишь так и до таймеров доберусь)
Написал обработчик энкодера, уже что-то. Можно начинать регистры крутить )
Разобрался с таймером-счётчиком на Дуе в режиме генерации частоты . Тут всё не так, как на меге328. Возможностей гораздо больше, и настраивается всё иначе. Я бы сказал почти ничего общего. Таймер можно использовать как PWM генератор, это при том, что в МК есть специализированный PWM-генератор, в котором функций ещё больше. Но туда соваться пока страшно :) Реально тактироваться может от 42МГц. Можно и на 84 разогнать, пробовал, но на этой частоте перестаёт работать Serial. Наверняка ещё что нибудь отвалится. Коллега MagicianT писал, то специализировагнный PWM таймер как раз может работать штатно на 84Мгц шине, но до него пока не добрался. В качестве разминки написал римейк вот этого скетча , теперь вариант для DUE. В сериале можно запросить частоту в Герцах, программа ответ какую частоту реально сгенерила. Максимум 21000000 герц.
Частично разобрался с PWM Таймером DUE. Таймер тактируется по умолчанию от 84МГц, стало быть макс. частота без извращений -42Мгц. А вот разрядность ШИМ всего лишь 16 бит оказалась, а не 32 как я думал. По основному назначению, - делать PWM, настроить как выяснилось не очень трудно, но там есть ещё куча регистров, которые пока для меня непонятны. Надеюсь всё же разобраться со временем.
Написал аналогичный предыдущему скетч, но с регулировкой скважности. Параметры такие: минимальная частота 2 Гц, максимальная -42МГц. Шаг скважности -1% после частоты 840кГц шаг падает. Кол-во шагов скважности нетрудно узнать разделив 84E6 на нужную частоту. Высокие частоты генерятся с большими промежутками, тоже нетрудно узнать деля 84E6 на целочисленные делители. ( 42МГц, 28МГц,21МГц,16.8МГц,14МГц, и.т.д.)
Использование: -В терминалке послать цифру частоты в герцах, в ответ придёт сколько реально таймер смог сделать. В качестве опции через пробел можно указать дьюти(скважность) в процентах. Например: 1000 20. Отправка без второго числа делает скважность автоматом 50%.
Простой DDS генератор на Arduino DUE.
Изучал работу ЦАПа, попутно написал программульку. Представляет собой классический DDS -синтезатор, с 32-битным аккумулятором фазы. Таблица синуса 14-битная, автоматически рассчитывается и разворачивается в памяти, занимает 16кБ, а что жалеть то? Коли памяти вагон :) Возможный шаг изменения частоты очень маленький, специально не считал, но не хуже 0,1Герц
Использование : В первую строчку подставлять нужную частоту (float/int без разницы), на выходе DAC0 -эта частота появится. Ограничений не ставил, но после 10кГц уже потихоньку начинает падать качество. на картинке 20кГц, -ещё прилично. Но если задирать ещё выше -то синус будет совсем ступенчатый. Изменение частоты на ходу не предусмотрено, т.к. процесс съедает почти 100% ресурсов. Можно в принципе крутить энкодером, сидящем на прерывании (пост#31 например), а в прерывании пересчитывать, но если разрешить прерывания то существенно усилится джиттер. Да и небыло собссно цели сделать какое-то законченное устройство, ибо генератор на меге328 из соседней темы вполне решает все задачи.
dimax, неплохой шаг 0.1. С таким шагом уже можно эксперементировать с трансформаторами. Но лучше генерить прямоугольник до 2МГц с шагом 0.1 и с изменяемой скважностью с шагом 0,1%.
Я собрал Ваш генератор на атмеге328, но у него шаг перестройки грубый.
AVGN, что б генерить прямоугольник 2 МГц с шагом скважности 0,1% нужно таймеру работать на тактовой частоте 4 ГГц. Генератор по цене автомобиля будет :)) А вот менять частоту с шагом 0,1Гц вполне может бюджетный синтезатор AD9850.
Простой DDS генератор на Arduino DUE.
... Да и небыло собссно цели сделать какое-то законченное устройство, ибо генератор на меге328 из соседней темы вполне решает все задачи.
Ничего немножко требуется передышка... всегда. Верю в Вас. Пытливый ум не даст Вам бросить то, что уже начато с DUE.
В Чайна уже сориентировались и предлагают набор по цене DUE (+дисплей+энкодер+кнопочка со скетчем многофункционального генератора с частотомером. Я не брал, по отзывам сыроват скетч - плохо работает энкодер.
Каждый раз проверяя какую-нибудь новую возможность поражаюсь, насколько же в АРМ контроллерах всё доведено до ума. Раньше нопример считал, что считать длительность импульса/частоту в меге 328 очень удобно через ICP-прерывание. Так вот , в сравнении с ДУЕ это извращение! Тут всё гибче и продуманней, тут настраиваешь таймер на захват, и никаких прерываний не нужно, просто забираешь из регистров готовые измеренные значения частоты и скважности (в тактах контроллера разумеется). А 32-битная разрядность позволяет считать частоты от 0,1 Герца вообще без прескалеров. В общем очередной примерчик, -скетч считает частоту измеряя длительность импульса, этот алгоритм не позволяет считать высокие частоты, высокая точность измерения примерно до 100кГц, средняя точность до 1МГц, выше уже слишком существенные ошибки начнутся.
Привет! dimax
Перебираетесь на 32битные камни.
Подскажите кроме даташитов используете еще материалы, если да поделитесь пожалуйста.
bodriy2014, только даташит. К сожалению хороших материалов нет нигде. Гуглежом что-то полезное изредка встречалось, например сколько я не раскуривал даташит -так и не мог понять, как правильно кидать байты в ЦАП через ДМА. Гугл привёл толи на gaw.ru, то ли на микросин.ру, где из крохотной заметки, написанной довольно убогим формальным языком наконец с трудом понял как всё это устроено. В принципе всё искусство работы с периферией заключается в глубоком знании принципов её работы. Очень большую роль сыграло то, что с устройством таймеров avr я основательно разобрался в своё время. Думаю без этой "базы" не за что бы не осилил ARM таймеры, т.к. примеров низкоуровнего доступа к периферии DUE нет вообще нигде, только редкие примеры на функциях из библиотеки CMSIS, которые все правят под себя, но мало кто понимает как это работает.
bodriy2014, только даташит. К сожалению хороших материалов нет нигде. Гуглежом что-то полезное изредка встречалось, например сколько я не раскуривал даташит -так и не мог понять, как правильно кидать байты в ЦАП через ДМА. Гугл привёл толи на gaw.ru, то ли на микросин.ру, где из крохотной заметки, написанной довольно убогим формальным языком наконец с трудом понял как всё это устроено. В принципе всё искусство работы с периферией заключается в глубоком знании принципов её работы. Очень большую роль сыграло то, что с устройством таймеров avr я основательно разобрался в своё время. Думаю без этой "базы" не за что бы не осилил ARM таймеры, т.к. примеров низкоуровнего доступа к периферии DUE нет вообще нигде, только редкие примеры на функциях из библиотеки CMSIS, которые все правят под себя, но мало кто понимает как это работает.
Спасибо за то, что делитесь наработками!
Я в 32 вьезжаю туго, одно дело в регистре 8 знаков а 32 тяжело визуально запомнить.
Приходится резать тетрадь на блокноты и постоянно наброски делать.!(
Частотометр с другим принципом измерения - один таймер отсчитывает секунду, другой таймер считает количество входных импульсов пришедших на тактовый вход за эту секунду. Точность счёта -1 Герц (без учёта неточности кварца). Что -бы избежать необходимости прерываний пришлось пойти на применение аппаратной петли -нужно связать эти два таймера. (Ради повышения точности измерения, -получаем полностью аппаратный частотомер, не влияющий на загрузку МК). Пин А7 нужно соединить с пином 2. Вход ипульсов подавать на пин А5. Считает частоту от от 1-го Герца и до... даташит говорит, цитата "In all cases, if an external clock is used, the duration of each of its levels must be longer than the peripheral clock period. The external clock frequency must be at least 2.5 times lower than the peripheral clock" то есть по идее не более, чем 16.8 МГц , но я подавал 21МГц -отображалось верно, возможно потому, что сгенерил их на этом же МК :) . В отличие от предыдущего частотомера не измеряет скважность.
Добил DDS-генератор из #34 до завершённого устройства.
Таблицы (синус, треугольник, пила, меандр) рассчитываются программно и забрасываются в массив uint16_t * 16384. Энкодером регулируется частота от 1Гц до 100кГц шагами по 1/10/100/1000 Гц. Кнопка энкодера переключает шаг, дополнительная кнопка переключает таблицы. Использовался стандартный lcd индикатор 1602 c I2C модулем сзади. Библиотека автодетектит адрес LCD, так что указывать его не нужно.
Молодчина! Поставил +!
прикольненько, тут хоть понятно как перепилить под другой дисплей)
Mining, Xumuk Вообще-то сам я очень скептически отношусь к полезности сего творения, т.к. его тех. характеристики не лучше, чем у аналогичного DDS модуля на резисторах из состава генератора версий 2.x По крайней мере на осцилографе выгядит всё так-же. Не смотря на 12 бит разрядность ЦАП. Вернее преимущества есть, но только на низких частотах, менее 5 кГц. А причина тому недостаточно быстрый ЦАП на Дуе. Если не ошибаюсь у него скорострельность ~ 1,7 мегасемпла в секунду. Т.е. что бы отрисовать ПОЛНОСТЬЮ самую простенькую wave - табличку на 256 байт получим исходящую частоту всего лишь 1700000/256 = 6640 Герц! Тут главное удобство в том, что цап встроен, и не нужно ничего паять :)
Mining, Xumuk Вообще-то сам я очень скептически отношусь к полезности сего творения, т.к. его тех. характеристики не лучше, чем у аналогичного DDS модуля на резисторах из состава генератора версий 2.x По крайней мере на осцилографе выгядит всё так-же. Не смотря на 12 бит разрядность ЦАП. Вернее преимущества есть, но только на низких частотах, менее 5 кГц. А причина тому недостаточно быстрый ЦАП на Дуе. Если не ошибаюсь у него скорострельность ~ 1,7 мегасемпла в секунду. Т.е. что бы отрисовать ПОЛНОСТЬЮ самую простенькую wave - табличку на 256 байт получим исходящую частоту всего лишь 1700000/256 = 6640 Герц! Тут главное удобство в том, что цап встроен, и не нужно ничего паять :)
да не генератор на такой ардуинке я делать не собираюсь)))) я думаю повторить Ваш проект на обычной уно))) только под другой дисплей 1.44тфт, но пока нет времени разбитраться)
0
0
Mining, Xumuk Вообще-то сам я очень скептически отношусь к полезности сего творения, т.к. его тех. характеристики не лучше, чем у аналогичного DDS модуля на резисторах из состава генератора версий 2.x По крайней мере на осцилографе выгядит всё так-же. Не смотря на 12 бит разрядность ЦАП. Вернее преимущества есть, но только на низких частотах, менее 5 кГц. А причина тому недостаточно быстрый ЦАП на Дуе. Если не ошибаюсь у него скорострельность ~ 1,7 мегасемпла в секунду. Т.е. что бы отрисовать ПОЛНОСТЬЮ самую простенькую wave - табличку на 256 байт получим исходящую частоту всего лишь 1700000/256 = 6640 Герц! Тут главное удобство в том, что цап встроен, и не нужно ничего паять :)
Не согласен. Не надо по 256-и точкам считать, 1.7 МГц это 500 кГц синуса с нормальным фильтром по выходу. Посмотрите на АД9850, при тактовой 125 МГц, нокого не удивляет паспортное значение 40 МГц по выходу.
Я тут выкладывал ардуино ДУЕ скетч, <правильный> генератор синуса, с использованием ДМА - процессор отдыхает.
https://forum.arduino.cc/index.php?topic=224672.0
dimax помогите тупому и заодно спасите мою дуе от истребления..... я уже на кувалду заглядываюсь и мысленно кайфую от того как буду наносить многочисленные удары кувалдочкой по данному чуду "DUE" сам уже 20 лет живу в макаронии,родина дуины и эта дуе как иее земляки не хило мне нервы потрепала.....
и так задача сверх сложная...
получить синус 50/60Гц формулой,где значение отвечающее за амплитуду будет переменной.чтоб можно было в реал тайм регулировать амплитуду подавая 0 - 3,3в на один вход.
разьесню
это преобразователь напряжения 48-220в регулировка амплитуды нужно для работы обратной связи по напряжению на выходе устройства(220в)
зделал на меге,работает но только мега не успевает динамично пересчитывать формулу(необходимо для работы обратной связи) и получается классный феерверк из выходных IGBT ..... очень прошу помощи....
kekia22, не понятно чем помочь. Раз вы уже делали -так и перенесите свой код на Дуе и всё. Цап работает очень просто, нужно проинитить его , всего 3 строчки:
REG_PMC_PCER1|=1<<6; //включить тактирование "DACC"
REG_DACC_CR=1; //dacc_reset(DACC);
REG_DACC_CHER=1; //channel 0 enable
И потом кидать в REG_DACC_CDR сэмпл.
А вообще я бы не советовал делал программную обратную связь, это всегда чревато "феерверком", лучше всё сделать аппаратно.
Частотометр с другим принципом измерения - один таймер отсчитывает секунду, другой таймер считает количество входных импульсов пришедших на тактовый вход за эту секунду. Точность счёта -1 Герц (без учёта неточности кварца). Что -бы избежать необходимости прерываний пришлось пойти на применение аппаратной петли -нужно связать эти два таймера. (Ради повышения точности измерения, -получаем полностью аппаратный частотомер, не влияющий на загрузку МК). Пин А7 нужно соединить с пином 2. Вход ипульсов подавать на пин А5. Считает частоту от от 1-го Герца и до... даташит говорит, цитата "In all cases, if an external clock is used, the duration of each of its levels must be longer than the peripheral clock period. The external clock frequency must be at least 2.5 times lower than the peripheral clock" то есть по идее не более, чем 16.8 МГц , но я подавал 21МГц -отображалось верно, возможно потому, что сгенерил их на этом же МК :) . В отличие от предыдущего частотомера не измеряет скважность.
Можно по точнее "Пин А7 нужно соединить с пином 2" имеется в виду аналоговый пин? И каким образом будет работатать внешнее тактирование при лог 1 (3.3В) на А5 или можно подтянуть на землю или разницы нет?
В итоге выяснилось что на цифровой пин 2 а жаль.