Генерация синусоидальной волны в большом диапазоне частот

Я хочу построить схему, которая может генерировать синусоидальные волны на частотах, контролируемых компьютером или микроконтроллером. Я хотел бы снизить частоту до 0,01 Гц (допустимо снижение до 0,05 Гц) и до 100 кГц; Мне нужно как минимум 10 частот на декаду, что соответствует разрешению примерно 12 мГц в нижней части шкалы (или 60 мГц, если нижняя граница составляет 0,05 Гц). Выходное напряжение не обязательно должно быть высоким — я все равно потом прогоню его через операционные усилители.

Каков стандартный способ сделать это? Подходит ли DDS (используя либо таблицу поиска синуса на uC, либо IC, такую ​​​​как AD9850)? Есть ли простое аналоговое решение, которое мне не хватает?

Я хотел бы придерживаться деталей со сквозными отверстиями, если смогу.

Моей рефлекторной реакцией было бы использовать для этого DDS. Кстати, какое желаемое разрешение по частоте?
Да, для низкочастотного конца вы можете забыть об аналоге. Всегда есть переходный процесс/включение аналогового генератора. Прослужит как минимум несколько циклов. За ~ 400 долларов Rigol делает хороший сигнал. ген. это делает от миллигерц до 20 МГц.
У TI AN-263 Sine Wave Generation Techniques есть хорошее «меню» на стр. 4, из которого вы можете выбрать свой любимый в зависимости от частоты. диапазон. Для вас возможно несколько дизайнов. Искажение и стабильность также входят в число факторов, которые следует учитывать при выборе решения (но вы не коснулись этого).
@NickAlexeev: я добавил некоторую информацию о разрешении. Мне нужно как минимум 10 точек на декаду, поэтому вторая нижняя точка примерно на 12 мГц выше, чем самая нижняя.
Увы, ваше требование иметь развертку 10M:1 (именно так я интерпретирую «управление компьютером») как бы исключает большинство однокристальных аналоговых классиков, таких как XR-2206, ICL8038 и т. д. (большинство из которых устарело их производителей, но их все равно можно найти в избытке)... если только вы не можете жить с несколькими горшками с адъюментами, как показано, например, на youtube.com/watch?v=KPtsgFw5Fno . Предположительно, вы могли бы построить микроуправляемые эквиваленты этих горшков, но это не так просто, как отправка битов на ЦАП. С другой стороны, эти старички доступны в DIP.
Если я правильно понимаю «диапазон охвата», я думаю, что это то, что мне нужно. Я представляю, как микроконтроллер отправляет пару битов и появляется синусоидальная волна, пока UC не сообщит ему об изменении частоты. Горшки с ручным управлением здесь бесполезны, а горшки с цифровым управлением звучат как отличный источник разочарования.
Спасибо за все усилия @Fluff! Я внимательно рассмотрю эти варианты, как только у меня будет возможность.

Ответы (4)

Вы можете легко сделать очень гибкую DDS на плате STM32F4 Discovery примерно за 15 долларов, используя внутренний ЦАП, DMA, таймер и таблицу поиска синуса. Люди пишут в блогах примеры подобных вещей, если вы их ищете.

Чтобы получить требуемую частоту (ЦАП STM32F4xx может выдавать только 300 тыс./с при полном размахе, что соответствует ~1 В/сек. мю s) вам нужно будет ограничить диапазон ЦАП.

Для синусоиды максимальная скорость нарастания (в В/с) равна 2 π × ф × А . Вставив значения из требований OP и предполагая, что Vref ЦАП составляет 3,3 В (что, если я правильно помню, имеет место для STM32F4Disco), синусоидальная волна 3,3 В пик-пик при 100 кГц, максимальная скорость нарастания 2 π × 10 5 × 3.3 / 2 "=" 1036726 В/с, или 1.04 В/ мю с.

Чтобы соответствовать этому ограничению, амплитуда синусоиды должна быть ограничена от 3.3 V к 3.3 × 1 / 1.04 "=" 3.18 В.

Теперь это приводит к очевидной проблеме ограничения 300 ksps на ЦАП STM32F4. Этот предел - фурфи. Я не знаю, каков реальный физический верхний предел, но подозреваю, что это скорость шины APB1. Я знаю (потому что сам так делал), что вы можете записать на ЦАП не менее 2 Мбит/с, и пока вы соблюдаете скорость нарастания 1 В/мкс, он будет вести себя предсказуемо. Таким образом, вы можете сделать 16 выборок за цикл для синусоидальной волны 100 кГц, частоты обновления 1,6 Мвыб/с, если вы ограничите амплитуду синусоидальной волны до 3,18 В вместо 3,3 В.

В какой-то момент вам, вероятно, придется иметь дело с цифровыми потенциометрами, потому что реальность такова, что если вам нужен ровный, непрерывный выходной сигнал, особенно на низкой скорости, вам придется пропустить DDS через фильтр. и этот фильтр должен быть регулируемым - вы не можете просто поставить на него LPF 100 кГц и ожидать, что он будет полезен на частотах ниже 1 Гц.

Отличная информация. Вы правы насчет фильтра нижних частот - мне придется поэкспериментировать и посмотреть, что работает для диапазона ниже 1 Гц.
Хм, а Rigol и другие недорогие комплекты действительно пытаются использовать LPF в миллигерцах? В 10 бит, какой TC мне нужен для 1 Гц? (~ 1 мс?) И разве фильтр не делает фазовый сдвиг?
@GeorgeHerold У меня нет информации о том, как (или если) Rigol справляется с фильтрацией. ТС?
О, извините, конечно, нет. Кто-нибудь фильтрует синусоидальные волны DDS миллигерц? TC = постоянная времени. (R*C) (Завтра посмотрю на ригол.)
Я думал, вы имели в виду постоянную времени, но лучше быть уверенным ... короткий ответ чертовски длинный! Касательно фазового сдвига, да, конечно, но основным является чистый тон (за исключением случаев, когда вы меняете частоты), поэтому фазовый сдвиг не должен иметь значения. Хотя это зависит от приложения.
Ну, я не могу сказать, что мне не нравится это решение, потому что вы превращаете его в программную проблему. DDS также состоит из поиска синуса и ЦАП, но в основном имеет «программное обеспечение» для очистки таблиц, жестко запрограммированное в его ASIC. Если у вас уже есть совместимый UC, DDS на печатной плате или плате обойдется всего около 5 долларов... но, с другой стороны, если у вас уже есть UC со встроенным ЦАП, стоимость составит 0 долларов (поскольку программное обеспечение бесплатное).
Если подумать об этом еще немного, кажется, что есть серьезная проблема со скоростью ЦАП. С 300KSPS вы можете выводить не более 3 различных напряжений за период на частоте 100 кГц. И я не понимаю, как можно формировать разумно выглядящую синусоиду с такой низкой частотой дискретизации. В лучшем случае это будет треугольная форма. Я не понимаю, как это можно исправить с помощью последующих аналоговых каскадов, если только вы не реализуете преобразователь треугольника в синус... который в основном делает спорным использование ЦАП.
@RespawnedFluff ЦАП может работать только со скоростью 300 тыс/с при полном размахе , поэтому при Vref=3,3 В он имеет максимальную скорость нарастания ~ 1 В/мкс. Синусоида 3,3 В пик-пик при частоте 100 кГц имеет скорость нарастания ~ 1,04 В/мкс, поэтому, ограничивая ее диапазоном 3 В пик-пик, можно достичь предела 1 В/мкс. Я действительно упомянул об этом (менее подробно) в своем посте; Я отредактирую его, чтобы расширить точку.
Что касается фильтрации, можно использовать фиксированную частоту lpf, настроенную на высокие частоты, и дизеринг низкочастотного случая на высокой частоте. То есть, если выходное значение должно быть, скажем, 4,3 lsb, выведите 4454454445 на dac. Это также увеличивает разрешение.
@NicolasD Это хорошее использование сигма-дельта, отличная идея.
Кстати, у ST есть примечание к приложению #AN3126 , как делать именно это (генерация сигналов, включая синусоидальные волны) с использованием STM32.

Вот мой (РФ) грубый обзор решения DDS, которое изначально было предложено Ником Алексеевым. Я помечаю это как вики сообщества, поэтому не стесняйтесь улучшать детали и т. д.

Используя калькулятор AD , чтобы получить желаемый баланс между частотным разрешением 12 МГц (которое я просто округлю до 10 МГц) и безупречно гладкой кривой на выходе 100 кГц, вам потребуется от 10 до 40 МГц тактовой частоты DDS, при этом 20 МГц выглядят как хорошие. середина. При тактовой частоте ниже 10 МГц выход DDS на частоте 100 кГц начинает выглядеть довольно шумно. При тактовой частоте выше 40 МГц разрешение становится слишком грубым; при тактовой частоте 40 МГц вы получаете изменение чуть менее 0,01 Гц для каждого бита настройки, конечно, в нижнем диапазоне; слово настройки, являющееся делителем часов, дает нелинейную частотную кривую.

Что касается практических решений, то можно найти микросхемы DDS, уже установленные на платах, совместимых с Arduino (кажется, примерно за 5 долларов); Однако загвоздка в том, что они могут поставляться с фиксированными (и, возможно, неподходящими высокими) часами, но это можно улучшить с помощью некоторой доработки платы.

Также стоит упомянуть, что если вы используете микроконтроллер (uC), который имеет встроенный и достаточно быстрый ЦАП, то добавление DDS (который в основном представляет собой ASIC, очищающий таблицу поиска синуса и отправляющий это индексированное значение в ЦАП) довольно бессмысленно, поскольку поиск синуса может быть реализован в программном обеспечении UC. Подробнее об этом интегрированном ЦАП-подходе см. в ответе markt.

Я использовал конструкцию нецифрового генератора, который выдавал приличные синусоиды до частот ниже 0,1 Гц и выше 100 кГц. Теоретически это была параллельно настроенная LC-цепь в цепи обратной связи усилителя. L и C на самом деле были прецизионными схемами гиратора (именно поэтому их можно было настроить на такие смехотворно низкие резонансные частоты). Вы бы никогда не построили его с настоящими катушками индуктивности, и если бы вы это сделали, его нельзя было бы настроить.

И «C», и «L» отслеживались с помощью прецизионного двухклавишного потенциометра, и, если я правильно помню, с потенциометра можно было получить частотный диапазон более 50:1 до замены фиксированных конденсаторов в гираторах.

Конечно, в наши дни банки лучше обслуживать дигипоты, поскольку они могут «отслеживать» гораздо лучше, чем обычные банки. Я уверен, что с осторожностью он может работать до 0,01 Гц.

Индукторный гиратор: -

введите описание изображения здесь

Есть гираторы более высокого качества (лучшая частотная характеристика), и вот еще одна ссылка на документ о гираторах другого типа. Преимущество гиратора с одним операционным усилителем в этом приложении заключается в том, что цепь CR (которая обычно предназначена для использования в качестве паразитной) может эффективно использоваться в качестве секции настройки, соединяющей L и C параллельно с помощью небольших последовательных резисторов.

Я никогда раньше не слышал о гираторах. Это действительно крутая вещь, но звучит намного сложнее, чем решение DDS.
Посмотрите дополнения и ссылку.
Эта ссылка чрезвычайно полезна. Я все еще немного боюсь пытаться сделать это в аналоговом мире, но это похоже на полезную информацию.
Конечно, это одно из нескольких аналоговых решений, которые будут работать... но его будет так же сложно подключить к компьютеру, как XR-2206 и т. д., что Kynit сразу отверг в комментариях под своим вопросом. . Существуют ли гираторы, управляемые ЦАП, которые облегчили бы его применение?
Дигипоты @RespawnedFluff позволят управлять, как сказано в моем ответе.
Думаю, дигипоты здесь бы сработали. Я просто думаю, что был бы счастливее придерживаться таймеров и прерываний, чем что-то, с чем я не знаком. Это выглядит как отличное решение, которое может работать так же, как DDS, для тех, у кого немного больше опыта проектирования фильтров, чем у меня.
@Kynit ваши навыки и опыт, конечно, важный фактор
Думаю, Kynit передумал насчет дигипотов. 17 часов назад он написал: «Кастрюли с цифровым управлением звучат как отличный источник разочарования».
За стоимость около ~5,5 самых дешевых дигипотов (по 40 центов США каждый при 3000+ заказах), поставляемых DigiKey, вы можете купить самый дешевый DDS (около 2,20 долларов за 1500+ заказов, макс. 16 МГц), но который будет работать здесь, поэтому аналог Решение, которым будут управлять дигипоты, должно быть выдающимся, чтобы быть стоящим. (Цены за единицу для заказов DYI/штучных изделий, конечно, выше для обоих... и, конечно, между дистрибьюторами существуют различия в ценах, но я думаю, что это хороший ориентир.) Поэтому, взглянув на относительную стоимость, я посмотрите, почему старые аналоговые микросхемы функционального поколения были вытеснены с рынка.

Одним из подходов было бы синхронизировать 28-битный сумматор/накопитель с тактовой частотой 4 МГц. uController управляет младшими 20 битами с цифровым словом, а старшие восемь битов передают адреса в EROM для таблицы поиска синуса из 256 записей. Биты данных из EROM, суммированные в лестничную диаграмму R2R, будут емкостно связаны с каскадом усиления вашего операционного усилителя. Подайте высокое значение от микро в сумматор, и биты старшего порядка будут циклически выполняться быстрее, для более высокой частоты синусоиды. Низкое значение занимает гораздо больше тактов, чтобы пошаговый счет происходил в восьми старших битах, управляющих СППЗУ. С небольшой дополнительной работой в микропрограммном обеспечении; вы можете уменьшить таблицу EROM, просто сохраняя углы от 0 градусов до 90. Просто прочитайте таблицу вперед для первых 90 градусов (квадрант 1), затем назад для квадранта 2, снова вперед для третьего квадранта и т. д.

Я предполагаю, что «точка продажи» этого решения заключается в том, чтобы избегать покупки/использования микросхемы ЦАП и вместо этого реализовывать ее как лестницу R/2R?
@RespawnedFluff Нет коммерческого предложения. Я просто подумал об этом подходе из-за комментария о сквозных отверстиях.
Что ж, ЦАПы в DIP-корпусе по-прежнему доступны в продаже от разных производителей…
Итак, я использую таймер на борту UC, чтобы увеличить счетчик от UC, чтобы выяснить, какое напряжение выводить? Почему бы не оставить все это на борту? И почему лестница вместо ЦАП?