Модуль генератора сигналов GEN01
Часть 1 – разработка схемы модуля

Описание набора модулей для звукотехнических измерительных приборов начнем с генератора синусоидальных сигналов или, проще говоря, со звукового генератора. Требования к его характеристикам просты – звуковой (или немного более широкий) диапазон частот, фиксированное выходное напряжение (далее, при необходимости, оно будет повышаться или понижаться другими модулями) и синусоидальная форма выходного сигнала. Хотелось бы, конечно, иметь как можно более низкий коэффициент гармоник у сигнала на выходе модуля, но стремиться довести его до тысячных долей процента мы не будем. Как уже было сказано во вступительной статье, мы стараемся сделать наши конструкции достаточно дешевыми и доступными для повторения, а потому будем, насколько это возможно, упрощать схемные решения и применять самую незатейливую элементную базу.
И, разумеется, для того, чтобы этот модуль, как и другие модули нашего набора, вписался в общую концепцию, он не должен иметь всякого рода ручек и кнопок управления, а должен управляться исключительно сигналами от микроконтроллера. Учитывая, что напряжение и форма выходного сигнала модуля, о котором идет речь, всегда остаются неизменными, микроконтроллеру в данном случае остается управлять только частотой выходного сигнала и далее мы увидим, как это можно сделать.
Обсуждаем принцип действия модуля
Построить генератор синусоиды, частота которой задается микроконтроллером, можно, как минимум, двумя разными способами:
- Способ 1-й - использовать прямой цифровой синтез (DDS). В этом случае форма выходного сигнала формируется цифро-аналоговым преобразователем (ЦАП) из последовательности отсчетов синусоиды, записанных в ПЗУ, а частота определяется частотой перебора адресов ПЗУ,
- Способ 2-й - вначале при помощи ЦАП преобразовать цифровой код, поступающий от микроконтроллера, во что-нибудь аналоговое, например, в постоянное напряжение соответствующей величины, а затем подать это напряжение на вход генератора, управляемого напряжением (ГУН), получив на его выходе синусоиду заданной частоты.
Каждый из этих способов имеет свои плюсы и свои минусы – в первом случае можно легко получить высокую точность установки частоты выходного сигнала и ее стабильность, но сигнал на выходе DDS-синтезатора имеет не синусоидальную, а ступенчатую форму и для получения чистой синусоиды требуется его дополнительная фильтрация. Выполнить такую фильтрацию оказывается довольно затруднительно, учитывая, что частота сигнала меняется в очень широких пределах – от единиц герц до десятков килогерц.
Второй способ проще и дешевле в реализации, позволяет получить меньший коэффициент гармоник, но не может похвастаться такой же точностью установки частоты и ее стабильностью, как в случае DDS-синтеза.
Для наших целей мы вполне можем допустить небольшие отклонения частоты генератора от установленного значения, поэтому выбираем второй способ и для его реализации будем использовать недорогие и широко распространенные микросхемы 12-разрядного ЦАП MCP4725 и управляемого генератора XR-2206.
Рисуем структуру модуля
С первого взгляда кажется, что достаточно соединить выход ЦАП со входом управления частотой микросхемы генератора, и мы получим то, что нам надо. Однако, при внимательном изучении технической документации выбранных микросхем выясняются некоторые дополнительные обстоятельства.
Во-первых, микросхема MCP4725, как и положено ЦАП, вырабатывает на выходе напряжение, зависящее от записанного в его рабочий регистр кода, а частота сигнала, генерируемого микросхемой XR-2206 зависит не от напряжения на входе управления частотой, а от тока, протекающего в цепи этого входа. Таким образом, нам потребуется добавить преобразователь (конвертер) напряжения в ток, включив его между выходом ЦАП и управляющим входом генератора.
Во-вторых, хотя микросхема XR-2206 в принципе может перекрыть весь требуемый диапазон частот без каких-либо переключений во времязадающей цепи (документация обещает перекрытие по частоте в 2000 раз), но более детальное изучение вопроса показывает, что при этом в нижней части диапазона частот регулировка окажется слишком грубой и установить требуемое значение частоты можно будет только с очень большой погрешностью. Читатели, желающие более детально понять, почему так происходит, могут найти разъяснение под спойлером ниже, а все остальные могут поверить нам на слово, что весь диапазон генерируемых частот лучше разбить на два – диапазон низких частот, например, от 16 до 640 Гц, и диапазон высоких частот, в нашем случае от 600 Гц до 24000 Гц. При таком разбиении перекрытие в каждом диапазоне будет всего около 40 раз и это позволит управлять частотой генератора с необходимой точностью.
Предположим, что мы хотим перекрыть весь интервал частот от 16 Гц до 25 кГц одним диапазоном, без каких-либо переключений. Реально нам надо будет иметь даже несколько более широкий диапазон с учетом запаса на разброс параметров микросхемы и элементов времязадающей цепи, а также на уход частоты от температуры и напряжения питания. Ну, скажем, мы хотим иметь диапазон от минимальной частоты до максимальной шириной 28000 Гц.
Теперь обратим свой взгляд на ЦАП. Он имеет разрядность 12, что означает, что на его выходе есть возможность установить 212 = 4096 уровней напряжения. Зависимость частоты на выходе генератора от кода, записанного в рабочий регистр ЦАП – линейная, поэтому приращению кода в регистре ЦАП на одну единицу соответствует всегда одинаковое (в Гц) приращение частоты на выходе генератора. В нашем случае величина этого приращения будет составлять 28000 Гц / 4096 или около 7 Гц и не будет зависеть от того, в какой части диапазона частот оно происходит.
Иными словами, соответствие между кодами в регистре ЦАП и частотой сигнала на выходе генератора будет выглядеть примерно так:
Код в регистре ЦАП | Частота, Гц |
---|---|
. . . | . . . |
0002 | 14 |
0003 | 21 |
0004 | 28 |
. . . | . . . |
0100 | 700 |
0101 | 707 |
0102 | 714 |
. . . | . . . |
3500 | 24500 |
3501 | 24507 |
. . . | . . . |
Видно, что если в средней и в верхней части диапазона шаг изменения частоты составляет доли процента от ее текущего значения, что нас вполне устраивает, то в нижней части диапазона изменение кода на единицу может вызвать приращение частоты сразу на 50% (от 14 до 21 Гц), что никак нас обрадовать не может.
Чтобы решить эту проблему, разбиваем диапазон частот на два, в каждом из которых отношение верхней частоты к нижней составляет около 40. Параметры времязадающих цепей генератора выбираем так, чтобы каждый поддиапазон перекрывался при изменении кодов в регистре ЦАП примерно от 100 до 4000 (тоже в 40 раз). При этом в самом худшем случае, на нижней границе диапазона, приращение частоты на единицу кода не превысит одного процента от текущего значения частоты.
С учетом сказанного, структура модуля будет выглядеть следующим образом:

Данные для записи в рабочий регистр ЦАП поступают от микроконтроллера по шине I2C, обозначенной на схеме как Code, а диапазон частот выбирается логическим сигналом Range, также поступающим от микроконтроллера. Сочетание этих данных позволяет установить любое необходимое значение частоты выходного сигнала OUT.
Рассматриваем принципиальную схему модуля
На рисунке ниже вы видите принципиальную электрическую схему модуля генератора. Внимательно прочитавшим предыдущие разделы здесь практически все должно быть понятно. Код от микроконтроллера по цепям SCL и SDA (шина I2C) поступает на вход ЦАП U1, а сигнал выбора диапазонов Range с того же разъема JP1 – на вход переключателя T1 – Q1. Транзистор T1 нужен для преобразования уровня входного логического сигнала Range (0…+5V или 0...+3.3V в) в уровни 0...+12V для управления ключом на MOSFET транзисторе Q1, а этот ключ, в свою очередь, нужен для подключения/отключения конденсатора C3 ко времязадающей цепи управляемого генератора.
Преобразователь уровня на транзисторе T1 инвертирует входной сигнал Range, это значит, что при подаче логического 0 на его вход транзистор T1 закрыт, напряжение на его коллекторе и на затворе MOSFET ключа Q1 равно +12V, ключ открыт и конденсатор C3 подключен параллельно C4, переводя тем самым генератор в поддиапазон НЧ. При подаче на вход логической 1 транзистор T1 открывается, MOSFET ключ Q1 закрывается, а во времязадающей цепи генератора остается только конденсатор C4. Это переводит генератор в поддиапазон ВЧ.
Конвертер выходного напряжения ЦАП в ток выполнен по классической схеме на операционном усилителе (ОУ) IC1 и транзисторе T2. Резистор R9 в эмиттерной цепи транзистора T2 является датчиком выходного тока, а благодаря отрицательной обратной связи и огромному коэффициенту усиления ОУ, ток коллектора транзистора с высокой точностью равен напряжению на неинвертирующем входе ОУ деленному на сопротивление резистора R9.
Микросхема управляемого генератора XR-2206 включена по типовой схеме, рекомендованной ее изготовителем. Подстроечные резисторы R7 и R8 позволяют добиться минимальных искажений синусоиды, а R11 – установить необходимый уровень выходного сигнала.
Кроме выхода сигнала синусоидальной формы (Sin Out, разъем JP2) мы на всякий случай решили вывести наружу также и выход сигнала прямоугольной формы (SQR Out, разъем JP3), благо он у микросхемы имеется. На этом выходе присутствует меандр по частоте и фазе совпадающий с синусоидой на выходе Sin Out, а амплитуда меандра зависит от напряжения питания, поданного на резистор R10. Этот сигнал впоследствии можно будет использовать для синхронизации горизонтальной развертки осциллографа или подключить к нему частотомер, а может, он и для чего-нибудь еще полезного пригодится.
Для питания модуля необходимо двухполярное напряжение +12V/-12V, а напряжение питания микросхемы ЦАП формируется маломощным линейным стабилизатором IC3.
Показанная на схеме конфигурация предназначена для работы с 5-вольтовым микроконтроллером, например, с ATMega328 (Arduino Nano, Arduino Pro Mini), но, благодаря тому, что ЦАП MCP4725 имеет диапазон напряжений питания от 2.7V до 5V, он столь же успешно работает и с 3.3-вольтовыми микроконтроллерами (STM32, ESP-32 и другими). Для того, чтобы согласовать модуль генератора с 3.3-вольтовой логикой, нужно заменить два элемента схемы в соответствии со следующей таблицей:
Напряжение питания микроконтроллера | 3,3V | 5.0V |
---|---|---|
Тип м/сх регулятора IC3 | 78L33 | 78L05 |
Номинал резистора R3 | 180k | 330k |
После такой замены на входы SCL, SDA и Range можно будет подавать сигналы от 3.3-вольтового микроконтроллера, а напряжение на выходе SQR Out также приобретет 3.3-вольтовые логические уровни.
Назовем этот модуль GEN01, имея в виду, что когда-нибудь в будущем нам, возможно, потребуется разработать и другие разновидности генераторов, например, генераторов, использующих принцип прямого цифрового синтеза (DDS), или генераторов сигналов несинусоидальной формы, и тогда мы, не мудрствуя лукаво, назовем их GEN02, GEN03 и так далее. А сейчас переходим ко 2-й части этой публикации, где мы будем изготавливать модуль генератора.