Генератор выполнен на основе AVR - микроконтроллера и представляет собой DDS (Direct Digital Synthesizer), реализованный программно. Генератор имеет следующие параметры:
Низкочастотный генератор синусоидального напряжения является одним из наиболее распространенных приборов в измерительной лаборатории. Генераторы промышленного производства имеют большие габариты и вес, а к тому же, немалую стоимость. Кроме того, аналоговые генераторы обладают целым рядом недостатков: недостаточной точностью установки и стабильностью частоты и амплитуды, относительно большим коэффициентом гармоник.
Существуют цифровые методы синтеза синусоидального напряжения. Самым очевидным из них является метод, который схематически показан на рисунке:
С задающего кварцевого генератора G сигнал поступает на делитель частоты с переменным коэффициентом деления DIV. Коэффициент деления задается внешней схемой управления, например, микропроцессором. С выхода делителя частоты сигнал поступает на двоичный счетчик CT. Этот счетчик формирует адрес для постоянного запоминающего устройства ROM, содержащего таблицу функции sin. К выходам ROM подключен цифро-аналоговый преобразователь DAC, который формирует синусоидальное напряжение. После фильтрации с помощью фильтра нижних частот LPF оно поступает на выход генератора. Такой метод синтеза обладает рядом недостатков. Во-первых, шаг перестройки зависит от частоты. Для получения приемлемой точности установки частоты вверху рабочего диапазона требуется выбирать частоту опорного генератора очень большой. Во-вторых, при изменении выходной частоты меняется и частота дискретизации, которая связана с выходной частотой соотношением:
Этот факт затрудняет построение аналогового LPF, так как его частота среза должна быть переменной.
Гораздо логичнее для формирования синусоидального сигнала подавать на входы DAC мгновенные значения функции sin с постоянной частотой дискретизации. Непосредственное вычисление значений функции sin затруднено, так как закон, по которому она изменяется не линеен и непосредственно трудно реализуем. Намного проще вычислять мгновенные значения фазы (аргумент функции sin), которая изменяется линейно, а затем преобразовывать ее в значения функции с помощью перекодировочной таблицы в ROM. Поскольку фаза изменяется линейно, ее вычисление сводится к прибавлению в каждом такте некоторой добавки к текущему значению фазы. Величина приращения фазы определяет частоту сигнала:
Этот метод синтеза называют методом накопления фазы. Схематически реализация этого метода показана на рисунке:
Имеется регистр фазы RG2, содержимое которого в каждом такте увеличивается на величину приращения фазы. Величина приращения фазы хранится в регистре RG1. В каждом такте к содержимому регистра RG2 с помощью сумматора SM прибавляется содержимое регистра RG1. Таким образом, происходит линейное увеличение (накопление) мгновенной фазы. Увеличение фазы не может происходить неограниченно, так как любое реальное цифровое устройство имеет конечную разрядность и, соответственно, ограниченный диапазон представления чисел. Например, если накопитель фазы имеет разрядность 24 бита, то код фазы может принимать значения в диапазоне от 0 до 2 в степени 24 минус единица. При формировании синусоидального сигнала имеет смысл вычислять фазу только в диапазоне от нуля до двух пи. За пределами этого диапазона синусоида периодически повторяется. Тогда частота сигнала (f) и шаг ее перестройки (дельта f) соответственно равны:
Значение мгновенной фазы преобразуется в мгновенное значение синусоидального сигнала с помощью перекодировочной таблицы, хранящейся в ROM. Код мгновенной фазы используется как адрес ROM, а выходной код ROM представляет собой мгновенное значение синусоидального сигнала. Этот код подается на вход DAC. Нет необходимости использовать все 24 бита мгновенного значения фазы, потому что в ошибке значений выходного сигнала доминирует составляющая ошибки квантования DAC. Максимальное требуемое число разрядов адреса ROM - это число разрядов примененного DAC плюс два. При дальнейшем увеличении объема ROM качество сигнала практически не улучшается [1]. На выходе DAC формируется синусоидальный сигнал, который после низкочастотной фильтрации поступает на выход генератора.
Такой принцип формирования синусоидального сигнала применяется в DDS (Direct Digital Synthesizer), например, AD7008 фирмы Analog Devices. Однако, микросхемы DDS относительно дороги. С появлением быстродействующих микроконтроллеров стало возможным реализовать всю цифровую часть такого генератора сигналов программно. При этом стоимость генератора, при вполне приемлемых параметрах, получается очень низкой. Один из вариантов практической реализации генератора описан ниже.
Основой генератора является микроконтроллер AT90S2313 фирмы Atmel. Быстродействия этого контроллера оказалось достаточным, чтобы программно реализовать 28-разрядный накопитель фазы, работающий на частоте 250 КГц. При этом шаг сетки равен примерно 0.001 Гц. Реально используется шаг сетки 0.01 Гц, что позволило ввести цифровую калибровку опорной частоты.
Алгоритм целиком реализован внутри прерывания таймера, которое возникает с частотой 250КГц, т.е. каждые 4 мкс. Столь малое значение времени потребовало предельной оптимизации обработчика. Микроконтроллер имеет память программ объемом 2Кбайт. Половина этого объема отведена для хранения таблицы функции sin. Для экономии места хранится только 1/4 часть периода, так как функция sin обладает свойствами симметрии. Однако, в результате несколько усложнился алгоритм. Для увеличения скорости работы в таблице хранятся 8-разрядные отсчеты. Поскольку на 1/4 периода знак функции не меняется, это позволило знаковый разряд в таблице не хранить. Знак восстанавливается программно, поэтому фактически на DAC поступают 9-разрядные отсчеты. В генераторе применен дешевый 10-разрядный DAC типа КР572ПА1, работающий в 9-разрядном режиме. Максимальная частота выходного сигнала зависит от многих факторов, в том числе от характеристик LPF. Можно сказать, что в любом случае должно соблюдаться неравенство: отношение частоты дискретизации к максимальной выходной частоте должно быть больше четырех [1]. Поэтому для данного генератора максимальная выходная частота равна 50 КГц.
В разных четвертях периода синуса обработчик прерывания работает по различным веткам. Очень важно при этом обеспечить равное время выполнения каждой ветки. Текст обработчика прерывания приведен ниже:
Поскольку в системе используется только одно прерывание, оказалось возможным расположить обработчик, начиная с адреса вектора. Это позволило обойтись без команды rjmp в начале обработчика. Мгновенная фаза хранится в регистрах PhaseK, L, M, N. Из 32 бит используются только 28 младших. Приращение фазы (код частоты) хранится в регистрах FreqK, L, M, N. Поскольку таблица функции sin имеет размер 1024 байта, необходим 10-разрядный адрес. Он формируется из разрядов 16 - 25 мгновенной фазы:
Разряд 26 определяет, длится первая или вторая половина полупериода. На второй половине полупериода направление изменения функции должно меняться на противоположное, для чего в этом случае адрес инвертируется. Разряд 27 определяет, длится положительный или отрицательный полупериод. По сути это знаковый разряд. Поэтому он поступает непосредственно на разряд DAC.9. Кроме того, на отрицательном полупериоде все другие разряды DAC должны быть проинвертированы. Для устранения выбросов (glitches) на главном переходе DAC, при нарастании сигнала вначале переключается разряд DAC.9, а потом DAC1..8. На спаде все происходит в обратной последовательности. Логичнее было бы выводить на DAC старшие разряды одновременно, а затем один младший. Но при этом увеличивается объем кода и, как следствие, время выполнения обработчика прерывания. Не смотря на все принятые меры, для выполнения основной программы осталось всего 22.5% ресурсов. Однако, этого вполне достаточно, поскольку основная программа занята интерфейсом с пользователем, где высокое быстродействие не требуется.
В качестве опорного источника для DAC применена микросхема регулируемого стабилитрона U3 типа TL431. Для питания микроконтроллера применена микросхема интегрального стабилизатора U2 типа 78LR05, которая имеет встроенный монитор питания. Она формирует сигнал RESET, когда напряжение питания падает ниже нормы. Монитор питания обязателен, так как иначе у AVR при включении/выключении питания портится внутренний EEPROM данных (возможны и другие неприятности).
Поскольку DAC работает в однополярном режиме, потребовалась схема сдвига уровня. Она выполнена на ОУ U5B и резисторах R5, R6, R8. За ней включен активный LPF на ОУ U5C, U5D. Нужно отметить, что смещение нуля на выходе LPF может быть довольно значительным. Примененный недорогой быстродействующий ОУ TL082 имеет довольно большое смещение нуля. К тому же, схема сдвига уровня должна быть выполнена на прецизионных резисторах, иначе она не точно выполняет сдвиг, что проявляется в виде повышенного смещения нуля. В данном случае постоянная составляющая сигнала в тракте всегда должна быть равна нулю (синусоидальный сигнал). Это сделало возможным применить схему компенсации смещения нуля. Она построена на прецизионном (но достаточно медленном) ОУ U6 типа OP07. С помощью фильтра нижних частот R17C11 из сигнала выделяется постоянная составляющая, которая подается на вход активного интегратора. Выходное напряжение интегратора через резистор R7 подается в точку суммирования. Таким образом, постоянная составляющая сигнала на выходе активного LPF (выход ОУ U5D) будет поддерживаться равной нулю с точностью до напряжения смещения ОУ U6. В тракте генератора нигде нет разделительных емкостей. Это позволяет в случае необходимости работать на инфранизких частотах. Снизу ограничение на диапазон частот накладывает схема компенсации смещения нуля. С указанными на схеме номиналами на частоте 1 Гц будет спад около -2 dB. Диапазон частот можно расширить вниз, увеличив емкости конденсаторов C11 и C12.
В качестве активного LPF применен фильтр Баттерворта 4-го порядка. Существует много методик расчета фильтров. Наиболее распространеные из них предлагают вначале выбрать номиналы резисторов (все резисторы одинаковые), а затем, используя табличные значения коэффициентов, рассчитать емкости конденсаторов. Такой метод расчета вряд ли является целесообразным. Чтобы получить реальные характеристики фильтра, близкие к расчетным, необходимо номиналы элементов выдержать с хорошей точностью (для фильтра 4-го порядка желательно не хуже 1 - 2%). Поскольку прецизионные конденсаторы являются более дефицитными элементами по сравнению с прецизионными резисторами, целесообразнее вначале выбрать емкости конденсаторов (из имеющихся), а затем рассчитать номиналы резисторов. В обычной структуре фильтра Sallen & Key с коэффициентом передачи, равном единице, номиналы конденсаторов не могут быть одинаковыми, так как значения сопротивлений должны быть действительными. Однако, если коэффициент передачи фильтра в полосе пропускания выбрать равным двум, то становится возможным применить одинаковые номиналы. К тому же, в этом случае расчетные формулы значительно упрощаются. Для звена 2-го порядка (см. схему в окне программы расчета фильтра, которое приведено ниже) формулы имеют следующий вид [2]:
Емкость конденсаторов C выбирают заранее, для этого можно воспользоваться приблизительной формулой:
Резисторы обратной связи Rfb целесообразно выбрать так, чтобы значения сопротивлений, приведенные к разным входам ОУ, были одинаковыми и компенсировали смещение, вызванное входными токами. Для этого сопротивления резисторов (для K = 2 они одинаковые) раcсчитывают по формуле:
Коэффициенты a и b для фильтра Баттерворта 2-го, 4-го и 6-го
порядков приведены в таблице:
|
2-pole |
4-pole |
6-pole |
|||
a |
1.4142 |
1.8478 |
0.7654 |
1.9319 |
1.4142 |
0.5176 |
b |
1.0000 |
1.0000 |
1.0000 |
1.0000 |
1.0000 |
1.0000 |
fi /f |
1.000 |
0.719 |
1.390 |
0.676 |
1.000 |
1.479 |
Q |
0.71 |
0.54 |
1.31 |
0.52 |
0.71 |
1.93 |
В двух последних строчках таблицы преведено отношение частоты среза звена к частоте среза фильтра и добротность звена.
Чтобы получить порядок фильтра больше 2-го, звенья соединяют последовательно. Порядок следования звеньев фильтра может быть произвольным. Для получения наилучшего отношения сигнал/шум звенья включают в порядке снижения частоты среза. Но в генераторе фильтр работает при большом сигнале и критерием является максимальная перегрузочная способность. Дело в том, что звенья с большей частотой среза имеют как правило большую добротность полюсов и, соответственно, могут иметь довольно значительный подъем АЧХ вблизи частоты среза. Это создает условия для возникновения перегрузки. Поэтому в генераторе звенья LPF расположены в порядке возростания частоты среза (в таблице они идут в таком же порядке).
Во многих случаях гораздо важнее получить нужную форму АЧХ фильтра, чем обеспечить точность частоты среза. Вначале планировалось применить фильтр с частотой среза 60 КГц. Но при расчетах частота варьировалась так, чтобы номиналы резисторов оказались как можно ближе к стандартному ряду. В итоге удалось получить фильтр, который построен полностью на стандартных номиналах из ряда Е24, хотя частота среза получилась несколько другой: 57.4 КГц. Такое отклонение частоты практически не влияет на работу генератора. Расчет фильтра производился с помощью специально написанной программы:
Реальная АЧХ фильтра из-за отклонений номиналов резисторов и конденсаторов будет несколько отличаться от рассчитанной теоретически. Однако, даже при использовании элементов с допуском +/-5% характеристики фильтра остаются в допустимых пределах. Измеренная АЧХ фильтра приведена на рисунке:
На выходе LPF включен регулятор уровня выходного сигнала генератора R20. Подстроечный резистор R19 служит для калибровки выходного уровня.
Генератор должен иметь достаточно низкое выходное сопротивление. Для этого на выходе включен буферный усилитель. Поскольку нагрузка генератора может быть сложной, от буферного усилителя требуется устойчивая работа на емкостную нагрузку. Этим требованиям удовлетворяет схема, представляющая собой повторитель на ОУ U7 с двухтактным эмиттерным повторителем на транзисторах VT1 - VT4. Эмиттерный повторитель выполнен составным на транзисторах разной структуры. В такой схеме падения напряжения на переходах база-эмиттер разных транзисторов компенсируют друг друга. Автоматически получается смещение для всех транзисторов, поэтому ток покоя выходного каскада не равен нулю. Это обеспечивает малый коэффициент гармоник. Дополнительно, с помощью резисторов R23, R24 введена местная ООС. Еще эти резисторы вместе с R25 обеспечивают защиту от короткого замыкания на выходе.
На выходе буферного усилителя включен аттенюатор П-типа. По сравнению с простым делителем он требует меньшего диапазона сопротивлений применяемых резисторов, но имеет несколько большее выходное сопротивление на нижних пределах. В аттенюаторе применены резисторы стандартного ряда, в результате погрешность составляет до 3%. Если требуется меньшая погрешность, то нужно рассчитать точные номиналы резисторов R26 - R32 и применить прецизионные резисторы.
В качестве индикатора использован 10-разрядный LCD с контроллером HT1613. Его питание осуществляется от параметрического стабилизатора, выполненного на резисторе R33 и диодах VD1 и VD2. Согласование логических уровней выполнено с помощью делителей R34 - R37. Управление LCD осуществляется по двум линиям: SCK и DI. Для того, чтобы индикатор не переходил в режим таймера, на линии SCK между операциями обмена поддерживается низкий логический уровень.
Питание генератора осуществляется от любого маломощного источника питания с двухполярным стабилизированным выходным напряжением +/-12 В и током нагрузки до 300 мА. Простейший источник питания можно построить с использованием небольшого трансформатора, выпрямительного мостика с конденсаторами фильтра по 2200 мкФ и интегральных стабилизаторов 7812 и 7912. Генератор собран в стандартном пластмассовом корпусе типоразмера Z-4 (50 x 130 x 150 мм). Примерный дизайн передней панели генератора показан на рисунке:
Ниже приведено краткое описание функций управления генератором:
Frequency Control (управление частотой)
Управление частотой генератора осуществляется с помощью 4-х кнопок. Две из них, LEFT и RIGHT, служат для выбора шага перестройки частоты. При этом соответствующий разряд на индикаторе начинает мигать. Первое нажатие кнопок заставляет мигать текущий регулируемый разряд. И лишь следующее нажатие изменит положение этого разряда. Кнопками UP и DOWN осуществляется перестройка частоты с шагом, соответствующем весу выбранного разряда. Значения всех разрядов справа от выбранного при регулировке обнуляются. Если регулировка не проводится более 10 сек, то мигание прекращается.
Read Presets (чтение предустановок)
Если мигает крайний левый разряд, а кнопку LEFT нажать еще раз, на индикаторе появятся символы P0. Это режим чтения пресетов. Номер пресета можно выбрать кнопками UP и DOWN. Значение частоты, которое хранится в соответствующем пресете, сразу отображается на индикаторе в мигающем виде (если значение пресета не совпадает с текущей частотой), но на выходе не устанавливается. Когда нужный пресет выбран, нужно нажать кнопку RIGHT. Генератор перестроится на эту частоту. Если никакие кнопки не нажимаются более 10 сек, генератор выходит с режима чтения пресетов без изменения текущей частоты. При включении генератора автоматически считывается пресет 0.
Save Presets (сохранение предустановок)
Если мигает крайний левый разряд, а кнопку LEFT нажать два раза, то на индикаторе появятся символы F0. Это режим сохранения пресетов. Номер пресета можно выбрать кнопками UP и DOWN. Когда нужный пресет выбран, нужно нажать кнопку RIGHT. Та частота, которая на индикаторе, запишется в этот пресет. Если никакие кнопки не нажимаются более 10 сек, генератор выходит с режима сохранения пресетов без записи. Для того, чтобы при включении генератор настроился на определенную частоту, ее необходимо запомнить на пресете 0.
Mute (выключение выхода)
Если одновременно нажать кнопки LEFT и RIGHT, то значение частоты на индикаторе начнет мигать. При этом выходной сигнал генератора будет полностью выключен. Выйти из этого режима можно нажатием любой кнопки. Выключение сигнала происходит с минимальным скачком фазы. Перед выключением программа ждет изменения знакового разряда, которое свидетельствует о переходе сигнала через ноль. Сразу после перехода прерывания запрещаются, регистр фазы обнуляется, а на DAC выдается код нулевого напряжения. Поскольку регистр фазы обнулен, то при включении рост выходного напряжения начинается от нуля.
Calibration (калибровка)
Для калибровки частоты генератора предусмотрена специальная процедура. Для входа в режим калибровки необходимо в момент включения питания удерживать нажатой кнопку LEFT. На выходе генератора будет установлена частота 15625 Гц, а на индикатор выведено значение калибровочного коэффициента (от -99.99 до +99.99). Единицы калибровочного коэффициента примерно равны герцам на частоте калибровки. Таким образом, процедура калибровки способна изменять частоту в пределах примерно 15625+/-100 Гц. Изменяя с помощью кнопок UP и DOWN значение калибровочного коэффициента, необходимо добиться значения выходной частоты как можно ближе к 15625 Гц. Для этого нужно контролировать выход генератора образцовым частотомером. Значение калибровочной частоты выбрано не случайно. Легко заметить, что оно совпадает со значением строчной частоты телевизионного сигнала. Это сделано для того, чтобы калибровку генератора можно было провести в домашних условиях, без применения эталонных приборов. Точность частоты строк в телевизионном сигнале, передаваемом по эфиру, очень хорошая. Ставнение частот можно произвести, например, по фигурам Лиссажу на экране осциллографа. После завершения процесса калибровки необходимо нажать кнопку RIGHT. При этом новый калибровочный коэффициент запоминается в EEPROM, и генератор переходит в нормальный режим работы.
Полную версию этой статьи можно найти в журнале "Схемотехника", №2 за 2001 год.
Литература:
1. А.Н.Морозевич, Б.Б.Трибуховский, А.Н.Дмитриев.
Гармонические сигналы в цифровых системах контроля и испытаний. Минск, НАВУКА I
ТЭХНIКА, 1990.
2. В.С.Гутников. Фильтрация измерительных сигналов. ЭНЕРГОАТОМИЗДАТ, 1990.
Download:
dds.asm (16 Kb) - исходный текст демонстрационной версии программы (без поддержки режимов preset, mute, calibration). Его можно оттранслировать с помощью AVR Studio 3.2.
sin4.asm (7 Kb) - таблица синуса (1/4 периода).
dds.hex (6 Kb) - уже оттранслированный HEX-файл.
lpf2.exe (283 Kb) - программа расчета фильтров.
Автор проекта: Ридико Леонид Иванович (E-mail: wubblick@yahoo.com)
Страница статьи: http://www.radioland.net.ua/sxemaid-446.html
URL сайта: http://www.radioland.net.ua
© Radioland