Построить синус на микроконтроллере?
Построить синус на микроконтроллере?
Собственно интересует вопрос как можно программно описать синусоидальный сигнал на контроллере? Алгоритм хотя бы...
К тому же так как в цифровой технике нет отрицательных потенциалов, каким же образом можно их описать(отрец. полуволна)
Я так понимаю без "аналога" не обойтись?
Может кто знает хорошие ссылки с описанием..?
К тому же так как в цифровой технике нет отрицательных потенциалов, каким же образом можно их описать(отрец. полуволна)
Я так понимаю без "аналога" не обойтись?
Может кто знает хорошие ссылки с описанием..?
- Реклама
- Migray
- Потрогал лапой паяльник
- Сообщения: 305
- Зарегистрирован: Чт июн 07, 2007 12:05:08
- Откуда: Санкт-Петербург, Россия
- Контактная информация:
Прежде всего нужно определиться с параметрами сигнала, в частности частота самой синусоиды, частота "отсчетов" и разрядность.
Алгоритм будет зависеть от того, что будет использоваться для формирования, ЦАП или ШИМ
Отрицательный сигнал всегда должен отсчитываться от какого-то уровня. С выхода МК "нулевым" уровнем будет половина "опоры"
Соответственно убирая постоянную составляющую, можно получить "чистую" синусоиду.
Алгоритм будет зависеть от того, что будет использоваться для формирования, ЦАП или ШИМ
Отрицательный сигнал всегда должен отсчитываться от какого-то уровня. С выхода МК "нулевым" уровнем будет половина "опоры"
Соответственно убирая постоянную составляющую, можно получить "чистую" синусоиду.
Вот массив в десятичке:
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.
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
- Контактная информация:
http://telesys.ru/electronics/projects.php?do=p035
вот например, вообще смотри что такое DDS, в инете куча проектов...
З.Ы. я надеюсь свой на арме тоже когда-нить доделаю...
вот например, вообще смотри что такое DDS, в инете куча проектов...
З.Ы. я надеюсь свой на арме тоже когда-нить доделаю...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
прежде чем задавать такие вопросы, сформулируй свои требования: диапазон частот, допустимые искажения и т.п. Иначе, согласись, твой вопрос лишен смысла.Scorpline писал(а):Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
JusTalionis
- Родился
- Сообщения: 10
- Зарегистрирован: Вс янв 20, 2008 11:31:56
- Откуда: Россия
Ты, наверное, имел ввиду разрядность массива, а не размер?Scorpline писал(а):Для формирования использовать буду ЦАП.
...и достаточно ли использовать размер массива в один байт?
не получится ли "корявый" синус....
То есть, массив однобайтных переменных?
Тогда синус твой будет поделен на 256 ступенек по высоте. Достаточно ли это "коряво" для твоих задач?
Кстати, в Бейсике для PIC-ов есть встроенная функция синуса, которую можно использовать.
А с отрицательным потенциалом - проще всего. Формируешь "приподнятую" волну и пропускаешь через конденсатор большой емкости - вот тебе и отрицательный получится))
- КРАМ
- Друг Кота
- Сообщения: 25270
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Опаньки! Да тут еще и два синуса... Тогда и глубину модуляции надо знать. А так чистота синтеза сигнала будет в основном зависеть от джиттера программного цикла при выводе на ШИМ или в ЦАП. Ступенчатость сигнала можно достаточно легко убрать приличным ФНЧ, а вот паразитную ЧМ(ФМ) уже никуда не денешь...Scorpline писал(а):Вообще надо получить синус 420Гц ампл.=10в
На счет искажений не знаю... просто не сталкивался еще с таковыми в цифровых сигналах
Мне бы пока с этим разобраться.
Потом данный сигнал надо промодулировать(АМ) частотой в 8Гц,
с возможностью его плавного изменения от 0.5в до 10в
Вот собственно и все.
Последний раз редактировалось КРАМ Пн фев 04, 2008 00:01:52, всего редактировалось 1 раз.
- КРАМ
- Друг Кота
- Сообщения: 25270
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Помилуйте, уважаемый, зачем заполнять память пустой информацией... Для синтеза синусоиды ДОСТАТОЧНО таблицы значений на первые 90 градусов и правильной работы с косвенной адресацией массива, а также переключатель знака(при необходимости, например в преобр. Фурье).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.
- КРАМ
- Друг Кота
- Сообщения: 25270
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Ну собственно пишите таблицу синуса на первые 90 градусов, а затем программу, которая извлекает очередное значение по прерыванию и засылает его в ШИМ или ЦАП. Прерывание делаем по таймеру, причем частота реквестов должна быть равна частоте синтезируемого сигнала умноженой на количество дискретов в синусе ЗА ПЕРИОД(таблица будет вчетверо короче).Scorpline писал(а):Глубна более 100%. ...вообщем мне надо получать пачки импульсов.
Может и без второго синуса получится.. Просто создавать паузу на выходе ЦАПа (нулевой уровень) ?
Когда получится НЕПРЕРЫВНЫЙ СИНУС, тогда допишите фрагмент импульсной модуляции. Т.е. загрузка основного синуса в ШИМ (ЦАП) будет происходить по флагу, который необходимо инвертировать меандром 8 Гц (стробирование). Этот меандр можно формировать по прерываниям другого таймера или от того же, что и синус, но тогда частоты должны быть кратными (будет не 8 Гц а 8,07 или 7,92). Можно и с одним таймером точно 8 Гц получить, тогда необходимо таймер сделать с частотой у которой 420 и 8 имеют наименьший общий делитель, а затем программным счетчиком ВЫБИРАТЬ ПРЕРЫВАНИЯ, в которых обрабатывать флаг и загрузку в ШИМ/АЦП. Этот вариант самый изящный, но идеологически чуть сложнее. Если есть желание делать настоящую АМ, то придется вместо флага делать УМНОЖЕНИЕ.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
КРАМ все верно говорит, хотя, имхо, шибко накручено...
в реализации четверти периода синуса по таблице есть как плюсы, так и минусы. плюсы:
1. меньше места в памяти занимает таблица
2. для одинаковых по размеру таблиц можно применить более высокую частоту дискретизации, т.е. повысить качество сигнала
1-й плюс, имхо, несущественный, т.к. однобайтных значений отсчетов вполне достаточно для большинства любительских применений, а 256 байт на период будет или 64 - непринципиально, ОЗУ заведомо хватит
2- й плюс более существенный, однако заметное улучшение будет не для однобайтных отсчетов, а для хотя бы 10-битных.
минус:
1. сложность в реализации доступа. время обращения к массиву для каждой из четвертей будут ощутимо разными, что приведет к тому самому джиттеру, о котором сам КРАМ и говорил ранее.
вся морока с прерываниями тоже, имхо, лишняя. ведь я так понимаю, что речь все-же не идет о прецизионной системе, т.к. на AVR-ках действительно высокоточного и высококачественного генератора-модулятора не сделаешь.
если использовать "удобные" размеры таблицы и повысить частоту дискретизации, то джиттер за счет "нестабильности прерываний" от таймера будет несущественным (скажем, менее 0,01% от периода сигнала).
в реализации четверти периода синуса по таблице есть как плюсы, так и минусы. плюсы:
1. меньше места в памяти занимает таблица
2. для одинаковых по размеру таблиц можно применить более высокую частоту дискретизации, т.е. повысить качество сигнала
1-й плюс, имхо, несущественный, т.к. однобайтных значений отсчетов вполне достаточно для большинства любительских применений, а 256 байт на период будет или 64 - непринципиально, ОЗУ заведомо хватит
2- й плюс более существенный, однако заметное улучшение будет не для однобайтных отсчетов, а для хотя бы 10-битных.
минус:
1. сложность в реализации доступа. время обращения к массиву для каждой из четвертей будут ощутимо разными, что приведет к тому самому джиттеру, о котором сам КРАМ и говорил ранее.
вся морока с прерываниями тоже, имхо, лишняя. ведь я так понимаю, что речь все-же не идет о прецизионной системе, т.к. на AVR-ках действительно высокоточного и высококачественного генератора-модулятора не сделаешь.
если использовать "удобные" размеры таблицы и повысить частоту дискретизации, то джиттер за счет "нестабильности прерываний" от таймера будет несущественным (скажем, менее 0,01% от периода сигнала).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- КРАМ
- Друг Кота
- Сообщения: 25270
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
А вот и нет!
Во-первых джиттер в системе с прерываниями зависит ТОЛЬКО ОТ НЕСТАБИЛЬНОСТИ ЛАТЕНТНОСТИ этого прерывания, а времена внутри обработчика естесственно необходимо выровнять.
Второе. Ремапинг массива делается ЭЛЕМЕНТАРНО. Правда для этого нужно изначально массив правильно адресовать.
Что касается точности, то спорить не буду, так как не о чем - автор о требованиях молчит как партизан (партизан - это такой бородатый мужик, который просто не знает о чем его пытают гестаповцы
).
А вообще я сторонник компактных лаконичных кодов, даже если это и лишнее. А индексная косвенная адресация позволяет построить именно такой код. Снобизм, блин спокойно жить не дает...
Во-первых джиттер в системе с прерываниями зависит ТОЛЬКО ОТ НЕСТАБИЛЬНОСТИ ЛАТЕНТНОСТИ этого прерывания, а времена внутри обработчика естесственно необходимо выровнять.
Второе. Ремапинг массива делается ЭЛЕМЕНТАРНО. Правда для этого нужно изначально массив правильно адресовать.
Что касается точности, то спорить не буду, так как не о чем - автор о требованиях молчит как партизан (партизан - это такой бородатый мужик, который просто не знает о чем его пытают гестаповцы
А вообще я сторонник компактных лаконичных кодов, даже если это и лишнее. А индексная косвенная адресация позволяет построить именно такой код. Снобизм, блин спокойно жить не дает...
...я конечно понимаю что джитеры ремапинги и латентности это все хорошо с точки зрения продвинутых програмистов...ARV писал(а):КРАМ все верно говорит, хотя, имхо, шибко накручено...
Но я пока начинаю осваивать контроллеры(пишу для C8051F120).
...вообщем мне понадобилось написать такую прогу(связано с работой), как можно проще. О качестве сигнала промолчу как партизан
А в дальнейшем подумаю как улучшить....
ШШШпасибо за множество советов!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
в примерах SiLabs, которые идут в комплекте с диском ПО (который идет в комплекте с комплектом разработчика) есть пример для формирования трехфазной системы синусов - посмотри, там все очень хорошо расписано. в принципе, этот пример можно и с сайта SiLabs скачать, где-то в апноутах он есть. не найдешь - обращайся, вышлю, у меня есть.Scorpline писал(а):Но я пока начинаю осваивать контроллеры(пишу для C8051F120).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: Построить синус на микроконтроллере?
всем привет. не много не понял как рассчитать таблицу...
Мне нужно получить ШИМ для формирования синуса с частотой 50 Гц. Снимать планирую с RC цепочки. точность пока значения не имеет.
использую 8-ми битный таймер.
С8051F410
Мне нужно получить ШИМ для формирования синуса с частотой 50 Гц. Снимать планирую с RC цепочки. точность пока значения не имеет.
использую 8-ми битный таймер.
С8051F410
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- maglev
- Потрогал лапой паяльник
- Сообщения: 316
- Зарегистрирован: Пт апр 17, 2009 22:45:42
- Откуда: Minsk
- Контактная информация:
Re: Построить синус на микроконтроллере?
Получить значения синуса (в Excel, например - 2 минуты займет), потом вставить в код как массив. Для простоты 256 значений на период синуса. Либо использовать симметрию синуса и хранить в массиве только четверть периода.
Разрядность значений в массиве определяется разрядностью ЦАП-а.
Вычислять синус на лету не нужно.
Разрядность значений в массиве определяется разрядностью ЦАП-а.
Вычислять синус на лету не нужно.


