Здраствуйте! Вот собрал себе генератор на mega8535 и AD7524. Помогите пожалуйста в написании программы на С++, для генерации синуса от нескольких Гц до нескольких МГц. Схема рабочая, проверено, написал для нее код чтобы генерировать пилообразный сигнал.
а вот пилообразный, это вы имеете просто треугольный или как в строчной развертке? можете дать сайт, где все об этой схеме написано?
Об этой схеме ни наодном сайте вы не найдете описание на данный момент. поскольку я её сам придумал)))))))
Пилообразный, это треугольный. Сначала сигнал нарастает в течении определенного промежутка времени, а потом в течении такого же промежутка времени спадает.
По схеме если что то надо, то спрашивайте у меня, я отвечу. А если вы владеете языком Си, подскажите мне:)
_________________ Все гениальное - просто!!!!!!!!!
до нескольких мегагерц - это вы немножко завысили требования... если писать исключительно на ассемблере - можно выжать под сотню килогерц синус... на чистом С или С++ даже это будет сложновато...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Эта схему устраивает если необходим генератор просто как генератор., а мне надо просто реализовать его с бОльшими функциями на базе тех компонентов что имеются в наличии у меня, это часть моей дипломной работы.
_________________ Все гениальное - просто!!!!!!!!!
Не всё простое гениально...
Если выдавать отсчеты синусоиды на ЦАП с помощью м/к, то частотная шкала будет неудобной - при 16МГц тактовой, двухбайтном делителе этой тактовой и тридцатидвух отсчетах на период синусоиды, распределение частот на шкале будет примерно таким:
То есть, самая высокая - 62'500Гц, следующая - 31'250Гц, и так далее...
до нескольких мегагерц - это вы немножко завысили требования... если писать исключительно на ассемблере - можно выжать под сотню килогерц синус... на чистом С или С++ даже это будет сложновато...
Хотелось бы как можно больше выжать.
А почему не получится "до нескольких мегагерц", можно чуть поподробней? Чем С так ограничивает? Я просто не так давно этим стал заниматся и интересно)
_________________ Все гениальное - просто!!!!!!!!!
...частотная шкала будет неудобной - при 16МГц тактовой, двухбайтном делителе этой тактовой и тридцатидвух отсчетах на период синусоиды...
То есть, самая высокая - 62'500Гц, следующая - 31'250Гц, и так далее...
Вы хотите сказать что "при 16МГц тактовой" нельзя сделать плавной регулировки частоты на частотном диапазоне? А если взять другой кварц? Или дело не только в нем?
_________________ Все гениальное - просто!!!!!!!!!
А почему не получится "до нескольких мегагерц", ... Чем С так ограничивает?
Это не Си ограничивает - это возможности кристалла ограничены.
Арнаутов Юрий писал(а):
Вы хотите сказать что "при 16МГц тактовой" нельзя сделать плавной регулировки частоты на частотном диапазоне?
Напиши хотя бы приблизительно тот участок программы, которым собираешься выводить эту синусоиду на ЦАП, даже без окружения - только сам цикл, и подумай - как ты будешь менять скорость вывода отсчетов на выход м/к, сам всё и увидишь.
Арнаутов Юрий писал(а):
А если взять другой кварц?
А больше 16МГц этот м/к не позволяет. Да и другие м/к того же класса не намного лучше - 20МГц. Они для другого сделаны, их задача - работать сложно и гибко (то есть - по программе), а не быстро.
Твое решение для этой задачи не годится. Совсем - так как оно из другой оперы.
>>А почему не получится "до нескольких мегагерц", можно чуть поподробней?
Прикинь, на каждую инструкцию 1-3 такта ситстемной синхронизации:
загрузить значение синуса из таблицы;
передать значение в порт;
инкрементировать адрес индекса;
перейти по метке.
Сколько машинных циклов, во столько раз и надо делить тактовую частоту. И это макс. что получится.
Тема конечно интересная..
А теперь углубимся в процесс ЦАП-а - у нас есть бинарное значение на входе - на выходе уровень про частоту ничего.. при переходе с одного значения на другое ЦАП соответственное меняет значение как и всё в мире не мгновенно, а затрачивая на это время. В итоге на выходе мы получаем что-то..
Теперь к вашей задаче - надо получить сигнал определённои формы!
Любая форма описывается чем:
В математике - формулои, а в информатике - определённым числом точек.. Так вот из этого вопросы:
- сколько же точек у вас сеичас на пилу..
- сколько точек хотите на Синусоиду??
Понятное дело чем больше точек тем меньше максимальная частота..
И конечноже - чем больше расчетов на каждуу точу - тем максимальная частота ещё уменьшается, а сигнал - тем более ступенчатый (Это случай когда у вас не хранятся заготовленные - расчитаные точки в памяти).
Теперь о синусоиде - расчет её грамоздок и требует математику с плавающей точкои, легче брать заготовленные константы. и скажу сразу для удобства расчет идёт от 0 до 90 градусов.. а остальное преобразование - или негатив или спад.. и т.д.
А если нужна формула расчета синуса (относительно точно) http://en.wikipedia.org/wiki/Sine#Sine (есть ссылак на русский - там есть формула расчета через ряды)
...
Для многих вероятно не очень, но для меня в данный момент очень актуальная)
Для пилы я брал 255 точек на подъем и 255 на спад, поскольку она выводилась не с очень большой частотой, то этого кол-ва точек много небыло.
Сколько я хочу точек в синус?... Есть идея формировать их столько, чтобы на низких частотах сигнал был более точный, а с повышением, их количество уменьшать.
Насчет заготовления констант на синус, я думал, но меня это не сильно привлекает... это по свойму ограничивает. Есть задумка просчитать синус, получить нужное количество точек и занести их в массив, а после этого выводить на ЦАП. Если частота сильно большая, просчитать меньшее количество точек, чтобы МК успел их вывести и получить нужную частоту. Скорость в ущерб качеству:)
За формулу для синуса спасибо. Я с математикой дружу. если расчитываь на бумаге, а если тоже самое на С, то это для меня как подводный камень.
В языке С есть такие функции как asin(x) и sinh(x), но что то не получается с ними работать. Может кто сталкивался и у него получалось?
_________________ Все гениальное - просто!!!!!!!!!
Ну вот нафига в этой задаче - расчет синуса?! Эта таблица один раз рассчитывается и потом выдается на выход в разных темпах...
Почему же? Я думаю расчет синуса то что нужно! Ведь можно использовать меньшее количество значений, чем есть в таблице, которую вы хотите один раз расчитать, тем самым увеличить частоту сигнала, конечно при этом пострадает его качество, и он будет сильно дискретным.
_________________ Все гениальное - просто!!!!!!!!!
Может поставить тудыть паралельную рамку, на адресную шинку которой синтезатор частоты. А на выход цап r2r. Контролером же заполнять рамку и управлять синтезатором. Хоть гигагерцы, если такую память найдете. Я б посоветовал срам от старых материнок (кеш для пня).
Если уж настолько актуально. А МК это не для этого. Это для другого (с) мой
Почему же? Я думаю расчет синуса то что нужно! Ведь можно использовать меньшее количество значений, чем есть в таблице, которую вы хотите один раз расчитать, тем самым увеличить частоту сигнала, конечно при этом пострадает его качество, и он будет сильно дискретным.
Не нужен здесь расчет синуса, и вообще смысл делать из меги генератор, тем более сигналов различной формы. Даже если брать один синус, то тоже не нужен расчет. Для того чтобы получить сигнал с большей частотой нужно "проредить" таблицу синуса (т. е. скакать чез 2, 3 и более отсчтетов), естественно это будет в ущерб качеству. Теперь о максимальной частоте, если теоретически предположить, что максимальная скорость выдачи отсчета микроконтроллером будет составлять 6 циклов (для меги можно читать тактов генератора), и на период синуса нужно будет вывести хотя бы 12 отчетов, то максимальная частота генерируемого сигнала будет 20МГц/(6*12) = 277 кГц. Но чтобы так сделать придется постараться. При этом ничем другим контроллер заниматься просто не сможет, и о С тоже можно забыть.
Не нужен здесь расчет синуса, и вообще смысл делать из меги генератор, тем более сигналов различной формы...
Спасибо, я понял ваше мнение. Я повторюсь, это часть моей дипломной работы. А в целом там кроме генератора еще чет есть) Ну и в конце концов надо же студенту что то делать на диплом, вот и решил сворганить такую нехитрую штуку
_________________ Все гениальное - просто!!!!!!!!!
Я думаю расчет синуса то что нужно! Ведь можно использовать меньшее количество значений, чем есть в таблице, ...
Рассуждения верные... но - по отношению к какой-то другой ситуации.
С одной стороны, никто не мешает брать значения из заранее рассчитанной таблицы не подряд, а через 1, через 2, через 3, уменьшая дискретность, а если частоты выдачи некратны, то подготовить разные таблицы синуса.
С другой стороны, даже если процессор будет молотить только на выдачу синуса наружу, максимум, чего удастся добиться от него - 60 килогерц, и это не при 255 отсчетах на период, а всего-лишь при 32-ух! Если же его заставить еще и синусы на ходу рассчитывать - то даже звукового диапазона не получится. Да и глупо это - N раз в секунду повторять одни и те же вычисления, вычисления с заведомо константным результатом.
Так-что - синус должен быть табличным и только!
PS А, кстати, мысль, что этот "перестраиваемый" генератор между двумя "соседними" частотами будет молча проскакивать половину своего диапазона - показалась несущественной?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения