Построить синус на микроконтроллере?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Scorpline
Открыл глаза
Сообщения: 45
Зарегистрирован: Пн окт 01, 2007 00:12:57
Откуда: СПб

Построить синус на микроконтроллере?

Сообщение Scorpline »

Собственно интересует вопрос как можно программно описать синусоидальный сигнал на контроллере? Алгоритм хотя бы...
К тому же так как в цифровой технике нет отрицательных потенциалов, каким же образом можно их описать(отрец. полуволна)
Я так понимаю без "аналога" не обойтись?
Может кто знает хорошие ссылки с описанием..?
Реклама
Аватара пользователя
Migray
Потрогал лапой паяльник
Сообщения: 305
Зарегистрирован: Чт июн 07, 2007 12:05:08
Откуда: Санкт-Петербург, Россия
Контактная информация:

Сообщение Migray »

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

Алгоритм будет зависеть от того, что будет использоваться для формирования, ЦАП или ШИМ

Отрицательный сигнал всегда должен отсчитываться от какого-то уровня. С выхода МК "нулевым" уровнем будет половина "опоры"

Соответственно убирая постоянную составляющую, можно получить "чистую" синусоиду.
Реклама
Аватара пользователя
john_rise
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн дек 17, 2007 13:15:43

Сообщение john_rise »

Если требуется довольно высокочастотный синусоидальный сигнал, то лучше отказаться от идеи алгоритма и делать выборку дискретных значений синуса из массива. Таким образом ядро не будет грузится "выдумыванием" значений sin.
Боишся - не делай. Делаешь - не бойся.
Scorpline
Открыл глаза
Сообщения: 45
Зарегистрирован: Пн окт 01, 2007 00:12:57
Откуда: СПб

Сообщение Scorpline »

Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VIRGO
Друг Кота
Сообщения: 3268
Зарегистрирован: Вс июл 23, 2006 01:32:05
Откуда: г.Москва

Сообщение 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.
Реклама
lexmulya
Встал на лапы
Сообщения: 124
Зарегистрирован: Ср авг 29, 2007 10:42:31
Контактная информация:

Сообщение lexmulya »

http://telesys.ru/electronics/projects.php?do=p035
вот например, вообще смотри что такое DDS, в инете куча проектов...

З.Ы. я надеюсь свой на арме тоже когда-нить доделаю...
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Scorpline писал(а):Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
прежде чем задавать такие вопросы, сформулируй свои требования: диапазон частот, допустимые искажения и т.п. Иначе, согласись, твой вопрос лишен смысла.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
JusTalionis
Родился
Сообщения: 10
Зарегистрирован: Вс янв 20, 2008 11:31:56
Откуда: Россия

Сообщение JusTalionis »

Scorpline писал(а):Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
Ты, наверное, имел ввиду разрядность массива, а не размер?
То есть, массив однобайтных переменных?
Тогда синус твой будет поделен на 256 ступенек по высоте. Достаточно ли это "коряво" для твоих задач?

Кстати, в Бейсике для PIC-ов есть встроенная функция синуса, которую можно использовать.

А с отрицательным потенциалом - проще всего. Формируешь "приподнятую" волну и пропускаешь через конденсатор большой емкости - вот тебе и отрицательный получится))
Аватара пользователя
VIRGO
Друг Кота
Сообщения: 3268
Зарегистрирован: Вс июл 23, 2006 01:32:05
Откуда: г.Москва

Сообщение VIRGO »

Сформулируйте задачу поконкретнее. Диапазон частот и требования к выходному сигналу. Плиииззз!
Scorpline
Открыл глаза
Сообщения: 45
Зарегистрирован: Пн окт 01, 2007 00:12:57
Откуда: СПб

Сообщение Scorpline »

Вообще надо получить синус 420Гц ампл.=10в
На счет искажений не знаю... просто не сталкивался еще с таковыми в цифровых сигналах :oops:
Мне бы пока с этим разобраться.
Потом данный сигнал надо промодулировать(АМ) частотой в 8Гц,
с возможностью его плавного изменения от 0.5в до 10в
Вот собственно и все.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25275
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Scorpline писал(а):Вообще надо получить синус 420Гц ампл.=10в
На счет искажений не знаю... просто не сталкивался еще с таковыми в цифровых сигналах :oops:
Мне бы пока с этим разобраться.
Потом данный сигнал надо промодулировать(АМ) частотой в 8Гц,
с возможностью его плавного изменения от 0.5в до 10в
Вот собственно и все.
Опаньки! Да тут еще и два синуса... Тогда и глубину модуляции надо знать. А так чистота синтеза сигнала будет в основном зависеть от джиттера программного цикла при выводе на ШИМ или в ЦАП. Ступенчатость сигнала можно достаточно легко убрать приличным ФНЧ, а вот паразитную ЧМ(ФМ) уже никуда не денешь...
Последний раз редактировалось КРАМ Пн фев 04, 2008 00:01:52, всего редактировалось 1 раз.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25275
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

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 градусов и правильной работы с косвенной адресацией массива, а также переключатель знака(при необходимости, например в преобр. Фурье).
Scorpline
Открыл глаза
Сообщения: 45
Зарегистрирован: Пн окт 01, 2007 00:12:57
Откуда: СПб

Сообщение Scorpline »

КРАМ писал(а):Опаньки! Да тут еще и два синуса... Тогда и глубину модуляции надо знать.
Глубна более 100%. ...вообщем мне надо получать пачки импульсов.
Может и без второго синуса получится.. Просто создавать паузу на выходе ЦАПа (нулевой уровень) ?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25275
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Scorpline писал(а):Глубна более 100%. ...вообщем мне надо получать пачки импульсов.
Может и без второго синуса получится.. Просто создавать паузу на выходе ЦАПа (нулевой уровень) ?
Ну собственно пишите таблицу синуса на первые 90 градусов, а затем программу, которая извлекает очередное значение по прерыванию и засылает его в ШИМ или ЦАП. Прерывание делаем по таймеру, причем частота реквестов должна быть равна частоте синтезируемого сигнала умноженой на количество дискретов в синусе ЗА ПЕРИОД(таблица будет вчетверо короче).
Когда получится НЕПРЕРЫВНЫЙ СИНУС, тогда допишите фрагмент импульсной модуляции. Т.е. загрузка основного синуса в ШИМ (ЦАП) будет происходить по флагу, который необходимо инвертировать меандром 8 Гц (стробирование). Этот меандр можно формировать по прерываниям другого таймера или от того же, что и синус, но тогда частоты должны быть кратными (будет не 8 Гц а 8,07 или 7,92). Можно и с одним таймером точно 8 Гц получить, тогда необходимо таймер сделать с частотой у которой 420 и 8 имеют наименьший общий делитель, а затем программным счетчиком ВЫБИРАТЬ ПРЕРЫВАНИЯ, в которых обрабатывать флаг и загрузку в ШИМ/АЦП. Этот вариант самый изящный, но идеологически чуть сложнее. Если есть желание делать настоящую АМ, то придется вместо флага делать УМНОЖЕНИЕ.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

КРАМ все верно говорит, хотя, имхо, шибко накручено...
в реализации четверти периода синуса по таблице есть как плюсы, так и минусы. плюсы:
1. меньше места в памяти занимает таблица
2. для одинаковых по размеру таблиц можно применить более высокую частоту дискретизации, т.е. повысить качество сигнала

1-й плюс, имхо, несущественный, т.к. однобайтных значений отсчетов вполне достаточно для большинства любительских применений, а 256 байт на период будет или 64 - непринципиально, ОЗУ заведомо хватит
2- й плюс более существенный, однако заметное улучшение будет не для однобайтных отсчетов, а для хотя бы 10-битных.

минус:
1. сложность в реализации доступа. время обращения к массиву для каждой из четвертей будут ощутимо разными, что приведет к тому самому джиттеру, о котором сам КРАМ и говорил ранее.

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

если использовать "удобные" размеры таблицы и повысить частоту дискретизации, то джиттер за счет "нестабильности прерываний" от таймера будет несущественным (скажем, менее 0,01% от периода сигнала).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25275
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

А вот и нет!
Во-первых джиттер в системе с прерываниями зависит ТОЛЬКО ОТ НЕСТАБИЛЬНОСТИ ЛАТЕНТНОСТИ этого прерывания, а времена внутри обработчика естесственно необходимо выровнять.
Второе. Ремапинг массива делается ЭЛЕМЕНТАРНО. Правда для этого нужно изначально массив правильно адресовать.
Что касается точности, то спорить не буду, так как не о чем - автор о требованиях молчит как партизан (партизан - это такой бородатый мужик, который просто не знает о чем его пытают гестаповцы :) ).
А вообще я сторонник компактных лаконичных кодов, даже если это и лишнее. А индексная косвенная адресация позволяет построить именно такой код. Снобизм, блин спокойно жить не дает...
Scorpline
Открыл глаза
Сообщения: 45
Зарегистрирован: Пн окт 01, 2007 00:12:57
Откуда: СПб

Сообщение Scorpline »

ARV писал(а):КРАМ все верно говорит, хотя, имхо, шибко накручено...
...я конечно понимаю что джитеры ремапинги и латентности это все хорошо с точки зрения продвинутых програмистов...
Но я пока начинаю осваивать контроллеры(пишу для C8051F120).
...вообщем мне понадобилось написать такую прогу(связано с работой), как можно проще. О качестве сигнала промолчу как партизан :) так как пока не каких требований не ставлю. Для начала его надо только построить.
А в дальнейшем подумаю как улучшить....
ШШШпасибо за множество советов! :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Scorpline писал(а):Но я пока начинаю осваивать контроллеры(пишу для C8051F120).
в примерах SiLabs, которые идут в комплекте с диском ПО (который идет в комплекте с комплектом разработчика) есть пример для формирования трехфазной системы синусов - посмотри, там все очень хорошо расписано. в принципе, этот пример можно и с сайта SiLabs скачать, где-то в апноутах он есть. не найдешь - обращайся, вышлю, у меня есть.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Построить синус на микроконтроллере?

Сообщение Chip115 »

всем привет. не много не понял как рассчитать таблицу...
Мне нужно получить ШИМ для формирования синуса с частотой 50 Гц. Снимать планирую с RC цепочки. точность пока значения не имеет.
использую 8-ми битный таймер.
С8051F410
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
maglev
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk
Контактная информация:

Re: Построить синус на микроконтроллере?

Сообщение maglev »

Получить значения синуса (в Excel, например - 2 минуты займет), потом вставить в код как массив. Для простоты 256 значений на период синуса. Либо использовать симметрию синуса и хранить в массиве только четверть периода.
Разрядность значений в массиве определяется разрядностью ЦАП-а.
Вычислять синус на лету не нужно.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»