Страница 1 из 2
Построить синус на микроконтроллере?
Добавлено: Чт янв 24, 2008 23:56:54
Scorpline
Собственно интересует вопрос как можно программно описать синусоидальный сигнал на контроллере? Алгоритм хотя бы...
К тому же так как в цифровой технике нет отрицательных потенциалов, каким же образом можно их описать(отрец. полуволна)
Я так понимаю без "аналога" не обойтись?
Может кто знает хорошие ссылки с описанием..?
Добавлено: Вт янв 29, 2008 13:16:46
Migray
Прежде всего нужно определиться с параметрами сигнала, в частности частота самой синусоиды, частота "отсчетов" и разрядность.
Алгоритм будет зависеть от того, что будет использоваться для формирования, ЦАП или ШИМ
Отрицательный сигнал всегда должен отсчитываться от какого-то уровня. С выхода МК "нулевым" уровнем будет половина "опоры"
Соответственно убирая постоянную составляющую, можно получить "чистую" синусоиду.
Добавлено: Вт янв 29, 2008 14:24:34
john_rise
Если требуется довольно высокочастотный синусоидальный сигнал, то лучше отказаться от идеи алгоритма и делать выборку дискретных значений синуса из массива. Таким образом ядро не будет грузится "выдумыванием" значений sin.
Добавлено: Ср янв 30, 2008 22:21:15
Scorpline
Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
Добавлено: Пт фев 01, 2008 21:54:00
VIRGO
Вот массив в десятичке:
128 (0 град. 2.5 вольт)
148, 167, 185, 200, 213, 222, 228
230 (90 град. 4.5 вольт)
228, 222, 213, 200, 185, 167, 148
128 (180 град. 2.5 вольт)
108, 89, 71, 56, 43, 34, 28
26 (270 град. 0.5 вольт)
28, 34, 43, 56, 71, 89, 108
Можно использовать ШИМ с последующим RC фильтром второго порядка. А можно матрицу R-2R.
Добавлено: Пт фев 01, 2008 23:32:09
lexmulya
http://telesys.ru/electronics/projects.php?do=p035
вот например, вообще смотри что такое DDS, в инете куча проектов...
З.Ы. я надеюсь свой на арме тоже когда-нить доделаю...
Добавлено: Сб фев 02, 2008 09:45:24
ARV
Scorpline писал(а):Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
прежде чем задавать такие вопросы, сформулируй свои требования: диапазон частот, допустимые искажения и т.п. Иначе, согласись, твой вопрос лишен смысла.
Добавлено: Сб фев 02, 2008 10:40:34
JusTalionis
Scorpline писал(а):Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
Ты, наверное, имел ввиду разрядность массива, а не размер?
То есть, массив однобайтных переменных?
Тогда синус твой будет поделен на 256 ступенек по высоте. Достаточно ли это "коряво" для твоих задач?
Кстати, в Бейсике для PIC-ов есть встроенная функция синуса, которую можно использовать.
А с отрицательным потенциалом - проще всего. Формируешь "приподнятую" волну и пропускаешь через конденсатор большой емкости - вот тебе и отрицательный получится))
Добавлено: Сб фев 02, 2008 17:36:25
VIRGO
Сформулируйте задачу поконкретнее. Диапазон частот и требования к выходному сигналу. Плиииззз!
Добавлено: Вс фев 03, 2008 14:23:21
Scorpline
Вообще надо получить синус 420Гц ампл.=10в
На счет искажений не знаю... просто не сталкивался еще с таковыми в цифровых сигналах

Мне бы пока с этим разобраться.
Потом данный сигнал надо промодулировать(АМ) частотой в 8Гц,
с возможностью его плавного изменения от 0.5в до 10в
Вот собственно и все.
Добавлено: Вс фев 03, 2008 18:21:43
КРАМ
Scorpline писал(а):Вообще надо получить синус 420Гц ампл.=10в
На счет искажений не знаю... просто не сталкивался еще с таковыми в цифровых сигналах

Мне бы пока с этим разобраться.
Потом данный сигнал надо промодулировать(АМ) частотой в 8Гц,
с возможностью его плавного изменения от 0.5в до 10в
Вот собственно и все.
Опаньки! Да тут еще и два синуса... Тогда и глубину модуляции надо знать. А так чистота синтеза сигнала будет в основном зависеть от джиттера программного цикла при выводе на ШИМ или в ЦАП. Ступенчатость сигнала можно достаточно легко убрать приличным ФНЧ, а вот паразитную ЧМ(ФМ) уже никуда не денешь...
Добавлено: Вс фев 03, 2008 18:26:26
КРАМ
VIRGO писал(а):Вот массив в десятичке:
128 (0 град. 2.5 вольт)
148, 167, 185, 200, 213, 222, 228
230 (90 град. 4.5 вольт)
228, 222, 213, 200, 185, 167, 148
128 (180 град. 2.5 вольт)
108, 89, 71, 56, 43, 34, 28
26 (270 град. 0.5 вольт)
28, 34, 43, 56, 71, 89, 108
Можно использовать ШИМ с последующим RC фильтром второго порядка. А можно матрицу R-2R.
Помилуйте, уважаемый, зачем заполнять память пустой информацией... Для синтеза синусоиды ДОСТАТОЧНО таблицы значений на первые 90 градусов и правильной работы с косвенной адресацией массива, а также переключатель знака(при необходимости, например в преобр. Фурье).
Добавлено: Пн фев 04, 2008 00:20:53
Scorpline
КРАМ писал(а):Опаньки! Да тут еще и два синуса... Тогда и глубину модуляции надо знать.
Глубна более 100%. ...вообщем мне надо получать пачки импульсов.
Может и без второго синуса получится.. Просто создавать паузу на выходе ЦАПа (нулевой уровень) ?
Добавлено: Пн фев 04, 2008 08:53:31
КРАМ
Scorpline писал(а):Глубна более 100%. ...вообщем мне надо получать пачки импульсов.
Может и без второго синуса получится.. Просто создавать паузу на выходе ЦАПа (нулевой уровень) ?
Ну собственно пишите таблицу синуса на первые 90 градусов, а затем программу, которая извлекает очередное значение по прерыванию и засылает его в ШИМ или ЦАП. Прерывание делаем по таймеру, причем частота реквестов должна быть равна частоте синтезируемого сигнала умноженой на количество дискретов в синусе ЗА ПЕРИОД(таблица будет вчетверо короче).
Когда получится НЕПРЕРЫВНЫЙ СИНУС, тогда допишите фрагмент импульсной модуляции. Т.е. загрузка основного синуса в ШИМ (ЦАП) будет происходить по флагу, который необходимо инвертировать меандром 8 Гц (стробирование). Этот меандр можно формировать по прерываниям другого таймера или от того же, что и синус, но тогда частоты должны быть кратными (будет не 8 Гц а 8,07 или 7,92). Можно и с одним таймером точно 8 Гц получить, тогда необходимо таймер сделать с частотой у которой 420 и 8 имеют наименьший общий делитель, а затем программным счетчиком ВЫБИРАТЬ ПРЕРЫВАНИЯ, в которых обрабатывать флаг и загрузку в ШИМ/АЦП. Этот вариант самый изящный, но идеологически чуть сложнее. Если есть желание делать настоящую АМ, то придется вместо флага делать УМНОЖЕНИЕ.
Добавлено: Пн фев 04, 2008 11:04:42
ARV
КРАМ все верно говорит, хотя, имхо, шибко накручено...
в реализации четверти периода синуса по таблице есть как плюсы, так и минусы. плюсы:
1. меньше места в памяти занимает таблица
2. для одинаковых по размеру таблиц можно применить более высокую частоту дискретизации, т.е. повысить качество сигнала
1-й плюс, имхо, несущественный, т.к. однобайтных значений отсчетов вполне достаточно для большинства любительских применений, а 256 байт на период будет или 64 - непринципиально, ОЗУ заведомо хватит
2- й плюс более существенный, однако заметное улучшение будет не для однобайтных отсчетов, а для хотя бы 10-битных.
минус:
1. сложность в реализации доступа. время обращения к массиву для каждой из четвертей будут ощутимо разными, что приведет к тому самому джиттеру, о котором сам КРАМ и говорил ранее.
вся морока с прерываниями тоже, имхо, лишняя. ведь я так понимаю, что речь все-же не идет о прецизионной системе, т.к. на AVR-ках действительно высокоточного и высококачественного генератора-модулятора не сделаешь.
если использовать "удобные" размеры таблицы и повысить частоту дискретизации, то джиттер за счет "нестабильности прерываний" от таймера будет несущественным (скажем, менее 0,01% от периода сигнала).
Добавлено: Пн фев 04, 2008 22:07:00
КРАМ
А вот и нет!
Во-первых джиттер в системе с прерываниями зависит ТОЛЬКО ОТ НЕСТАБИЛЬНОСТИ ЛАТЕНТНОСТИ этого прерывания, а времена внутри обработчика естесственно необходимо выровнять.
Второе. Ремапинг массива делается ЭЛЕМЕНТАРНО. Правда для этого нужно изначально массив правильно адресовать.
Что касается точности, то спорить не буду, так как не о чем - автор о требованиях молчит как партизан (партизан - это такой бородатый мужик, который просто не знает о чем его пытают гестаповцы

).
А вообще я сторонник компактных лаконичных кодов, даже если это и лишнее. А индексная косвенная адресация позволяет построить именно такой код. Снобизм, блин спокойно жить не дает...
Добавлено: Ср фев 06, 2008 00:13:14
Scorpline
ARV писал(а):КРАМ все верно говорит, хотя, имхо, шибко накручено...
...я конечно понимаю что джитеры ремапинги и латентности это все хорошо с точки зрения продвинутых програмистов...
Но я пока начинаю осваивать контроллеры(пишу для C8051F120).
...вообщем мне понадобилось написать такую прогу(связано с работой), как можно проще. О качестве сигнала промолчу как партизан

так как пока не каких требований не ставлю. Для начала его надо только построить.
А в дальнейшем подумаю как улучшить....
ШШШпасибо за множество советов!

Добавлено: Ср фев 06, 2008 08:29:22
ARV
Scorpline писал(а):Но я пока начинаю осваивать контроллеры(пишу для C8051F120).
в примерах SiLabs, которые идут в комплекте с диском ПО (который идет в комплекте с комплектом разработчика) есть пример для формирования трехфазной системы синусов - посмотри, там все очень хорошо расписано. в принципе, этот пример можно и с сайта SiLabs скачать, где-то в апноутах он есть. не найдешь - обращайся, вышлю, у меня есть.
Re: Построить синус на микроконтроллере?
Добавлено: Сб ноя 20, 2010 19:55:25
Chip115
всем привет. не много не понял как рассчитать таблицу...
Мне нужно получить ШИМ для формирования синуса с частотой 50 Гц. Снимать планирую с RC цепочки. точность пока значения не имеет.
использую 8-ми битный таймер.
С8051F410
Re: Построить синус на микроконтроллере?
Добавлено: Сб ноя 20, 2010 22:21:29
maglev
Получить значения синуса (в Excel, например - 2 минуты займет), потом вставить в код как массив. Для простоты 256 значений на период синуса. Либо использовать симметрию синуса и хранить в массиве только четверть периода.
Разрядность значений в массиве определяется разрядностью ЦАП-а.
Вычислять синус на лету не нужно.