Страница 1 из 2

sin, mega8535, AD7524 и WinAVR. Как реализовать синусоиду?

Добавлено: Вт апр 28, 2009 17:41:57
Арнаутов Юрий
Здраствуйте! Вот собрал себе генератор на mega8535 и AD7524. Помогите пожалуйста в написании программы на С++, для генерации синуса от нескольких Гц до нескольких МГц. Схема рабочая, проверено, написал для нее код чтобы генерировать пилообразный сигнал.

Заранее спасибо!

Добавлено: Вт апр 28, 2009 17:57:22
Arlleex
а вот пилообразный, это вы имеете просто треугольный или как в строчной развертке?
можете дать сайт, где все об этой схеме написано?

Добавлено: Вт апр 28, 2009 18:23:59
Арнаутов Юрий
Stalker46 писал(а):а вот пилообразный, это вы имеете просто треугольный или как в строчной развертке?
можете дать сайт, где все об этой схеме написано?


Об этой схеме ни наодном сайте вы не найдете описание на данный момент. поскольку я её сам придумал)))))))

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

По схеме если что то надо, то спрашивайте у меня, я отвечу. А если вы владеете языком Си, подскажите мне:)

Добавлено: Вт апр 28, 2009 18:45:32
Arlleex
я Учу Си))) так что на данный момент не помогу...

Добавлено: Вт апр 28, 2009 18:55:25
saschai
Не знаю, может туплю, а чем это не устраивает http://radiokot.ru/circuit/digital/measure/20/ ?
На предмет расширения диапозона можно к автору постучаться.... :))

Добавлено: Вт апр 28, 2009 19:02:04
ARV
до нескольких мегагерц - это вы немножко завысили требования... если писать исключительно на ассемблере - можно выжать под сотню килогерц синус... на чистом С или С++ даже это будет сложновато...

Добавлено: Вт апр 28, 2009 19:15:26
Арнаутов Юрий
saschai писал(а):Не знаю, может туплю, а чем это не устраивает http://radiokot.ru/circuit/digital/measure/20/ ?
На предмет расширения диапозона можно к автору постучаться.... :))


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

Добавлено: Вт апр 28, 2009 19:16:42
Yellow Tiger
Не всё простое гениально...
Если выдавать отсчеты синусоиды на ЦАП с помощью м/к, то частотная шкала будет неудобной - при 16МГц тактовой, двухбайтном делителе этой тактовой и тридцатидвух отсчетах на период синусоиды, распределение частот на шкале будет примерно таким:
Изображение
То есть, самая высокая - 62'500Гц, следующая - 31'250Гц, и так далее...

Добавлено: Вт апр 28, 2009 19:19:02
Арнаутов Юрий
ARV писал(а):до нескольких мегагерц - это вы немножко завысили требования... если писать исключительно на ассемблере - можно выжать под сотню килогерц синус... на чистом С или С++ даже это будет сложновато...


Хотелось бы как можно больше выжать.

А почему не получится "до нескольких мегагерц", можно чуть поподробней? Чем С так ограничивает? Я просто не так давно этим стал заниматся и интересно)

Добавлено: Вт апр 28, 2009 19:26:29
Арнаутов Юрий
Yellow Tiger писал(а):...частотная шкала будет неудобной - при 16МГц тактовой, двухбайтном делителе этой тактовой и тридцатидвух отсчетах на период синусоиды...

То есть, самая высокая - 62'500Гц, следующая - 31'250Гц, и так далее...


Вы хотите сказать что "при 16МГц тактовой" нельзя сделать плавной регулировки частоты на частотном диапазоне? А если взять другой кварц? Или дело не только в нем?

Добавлено: Вт апр 28, 2009 19:49:37
Yellow Tiger
Арнаутов Юрий писал(а):А почему не получится "до нескольких мегагерц", ... Чем С так ограничивает?
Это не Си ограничивает - это возможности кристалла ограничены.
Арнаутов Юрий писал(а):Вы хотите сказать что "при 16МГц тактовой" нельзя сделать плавной регулировки частоты на частотном диапазоне?
Напиши хотя бы приблизительно тот участок программы, которым собираешься выводить эту синусоиду на ЦАП, даже без окружения - только сам цикл, и подумай - как ты будешь менять скорость вывода отсчетов на выход м/к, сам всё и увидишь.
Арнаутов Юрий писал(а):А если взять другой кварц?
А больше 16МГц этот м/к не позволяет. Да и другие м/к того же класса не намного лучше - 20МГц. Они для другого сделаны, их задача - работать сложно и гибко (то есть - по программе), а не быстро.

Твое решение для этой задачи не годится. Совсем - так как оно из другой оперы.

Добавлено: Вт апр 28, 2009 20:15:46
uk8amk
>>А почему не получится "до нескольких мегагерц", можно чуть поподробней?

Прикинь, на каждую инструкцию 1-3 такта ситстемной синхронизации:
загрузить значение синуса из таблицы;
передать значение в порт;
инкрементировать адрес индекса;
перейти по метке.
Сколько машинных циклов, во столько раз и надо делить тактовую частоту. И это макс. что получится.

Добавлено: Вт апр 28, 2009 20:46:21
Pe3ucTop
Тема конечно интересная..
А теперь углубимся в процесс ЦАП-а - у нас есть бинарное значение на входе - на выходе уровень :) про частоту ничего.. при переходе с одного значения на другое ЦАП соответственное меняет значение как и всё в мире не мгновенно, а затрачивая на это время. В итоге на выходе мы получаем что-то..
Теперь к вашей задаче - надо получить сигнал определённои формы!
Любая форма описывается чем:
В математике - формулои, а в информатике - определённым числом точек.. :)
Так вот из этого вопросы:
- сколько же точек у вас сеичас на пилу..
- сколько точек хотите на Синусоиду??
Понятное дело чем больше точек тем меньше максимальная частота..
И конечноже - чем больше расчетов на каждуу точу - тем максимальная частота ещё уменьшается, а сигнал - тем более ступенчатый (Это случай когда у вас не хранятся заготовленные - расчитаные точки в памяти).
Теперь о синусоиде - расчет её грамоздок и требует математику с плавающей точкои, легче брать заготовленные константы. и скажу сразу для удобства расчет идёт от 0 до 90 градусов.. а остальное преобразование - или негатив или спад.. и т.д.
А если нужна формула расчета синуса (относительно точно) http://en.wikipedia.org/wiki/Sine#Sine (есть ссылак на русский - там есть формула расчета через ряды)
...

Добавлено: Вт апр 28, 2009 21:51:10
Yellow Tiger
Pe3ucTop писал(а):А если нужна формула расчета синуса ...
Ну вот нафига в этой задаче - расчет синуса?! :))) Эта таблица один раз рассчитывается и потом выдается на выход в разных темпах... :)))

Pe3ucTop писал(а): ...там есть формула расчета через ряды...
Ильф и Петров писал(а):Остапа несло...

Добавлено: Вт апр 28, 2009 22:36:39
Арнаутов Юрий
Pe3ucTop писал(а):Тема конечно интересная..
...

Для многих вероятно не очень, но для меня в данный момент очень актуальная)

Для пилы я брал 255 точек на подъем и 255 на спад, поскольку она выводилась не с очень большой частотой, то этого кол-ва точек много небыло.

Сколько я хочу точек в синус?... Есть идея формировать их столько, чтобы на низких частотах сигнал был более точный, а с повышением, их количество уменьшать.

Насчет заготовления констант на синус, я думал, но меня это не сильно привлекает... это по свойму ограничивает. Есть задумка просчитать синус, получить нужное количество точек и занести их в массив, а после этого выводить на ЦАП. Если частота сильно большая, просчитать меньшее количество точек, чтобы МК успел их вывести и получить нужную частоту. Скорость в ущерб качеству:)

За формулу для синуса спасибо. Я с математикой дружу. если расчитываь на бумаге, а если тоже самое на С, то это для меня как подводный камень.

В языке С есть такие функции как asin(x) и sinh(x), но что то не получается с ними работать. Может кто сталкивался и у него получалось?

Добавлено: Вт апр 28, 2009 22:40:06
Арнаутов Юрий
Yellow Tiger писал(а):
Pe3ucTop писал(а):А если нужна формула расчета синуса ...
Ну вот нафига в этой задаче - расчет синуса?! :))) Эта таблица один раз рассчитывается и потом выдается на выход в разных темпах... :)))


Почему же? Я думаю расчет синуса то что нужно! Ведь можно использовать меньшее количество значений, чем есть в таблице, которую вы хотите один раз расчитать, тем самым увеличить частоту сигнала, конечно при этом пострадает его качество, и он будет сильно дискретным.

Добавлено: Вт апр 28, 2009 22:44:59
_PM_
Может поставить тудыть паралельную рамку, на адресную шинку которой синтезатор частоты. А на выход цап r2r. Контролером же заполнять рамку и управлять синтезатором. Хоть гигагерцы, если такую память найдете. Я б посоветовал срам от старых материнок (кеш для пня).

Если уж настолько актуально. А МК это не для этого. Это для другого (с) мой

Добавлено: Вт апр 28, 2009 23:07:18
smac
Арнаутов Юрий писал(а):Почему же? Я думаю расчет синуса то что нужно! Ведь можно использовать меньшее количество значений, чем есть в таблице, которую вы хотите один раз расчитать, тем самым увеличить частоту сигнала, конечно при этом пострадает его качество, и он будет сильно дискретным.

Не нужен здесь расчет синуса, и вообще смысл делать из меги генератор, тем более сигналов различной формы. Даже если брать один синус, то тоже не нужен расчет. Для того чтобы получить сигнал с большей частотой нужно "проредить" таблицу синуса (т. е. скакать чез 2, 3 и более отсчтетов), естественно это будет в ущерб качеству. Теперь о максимальной частоте, если теоретически предположить, что максимальная скорость выдачи отсчета микроконтроллером будет составлять 6 циклов (для меги можно читать тактов генератора), и на период синуса нужно будет вывести хотя бы 12 отчетов, то максимальная частота генерируемого сигнала будет 20МГц/(6*12) = 277 кГц. Но чтобы так сделать придется постараться. При этом ничем другим контроллер заниматься просто не сможет, и о С тоже можно забыть.

Добавлено: Вт апр 28, 2009 23:31:00
Арнаутов Юрий
smac писал(а):Не нужен здесь расчет синуса, и вообще смысл делать из меги генератор, тем более сигналов различной формы...


Спасибо, я понял ваше мнение. Я повторюсь, это часть моей дипломной работы. А в целом там кроме генератора еще чет есть) Ну и в конце концов надо же студенту что то делать на диплом, вот и решил сворганить такую нехитрую штуку :roll:

Добавлено: Ср апр 29, 2009 09:50:42
Yellow Tiger
Арнаутов Юрий писал(а):Я думаю расчет синуса то что нужно! Ведь можно использовать меньшее количество значений, чем есть в таблице, ...
Рассуждения верные... но - по отношению к какой-то другой ситуации.

С одной стороны, никто не мешает брать значения из заранее рассчитанной таблицы не подряд, а через 1, через 2, через 3, уменьшая дискретность, а если частоты выдачи некратны, то подготовить разные таблицы синуса.

С другой стороны, даже если процессор будет молотить только на выдачу синуса наружу, максимум, чего удастся добиться от него - 60 килогерц, и это не при 255 отсчетах на период, а всего-лишь при 32-ух! Если же его заставить еще и синусы на ходу рассчитывать - то даже звукового диапазона не получится. Да и глупо это - N раз в секунду повторять одни и те же вычисления, вычисления с заведомо константным результатом.

Так-что - синус должен быть табличным и только!

PS А, кстати, мысль, что этот "перестраиваемый" генератор между двумя "соседними" частотами будет молча проскакивать половину своего диапазона - показалась несущественной?