Свежие обсуждения
Измерения

DDS-генератор на AVR - нужна помощь

1 174 189

Мужики, для "просто поговорить" есть специальная тема.
Здесь приветствуется только конструктивная критика, подкреплённая конкретными предложениями по усовершенствованию и изготовлению варианта DDS генератора от GM.

А провокаторам - здесь вообще не место.

Vlad_Petr: Интересна общая тенденция усовершенствования этой первоначальной разработки. Исходно, был простейший бюджетный генератор. Простой, дешевый и очень доступный.

И что здесь не естественно?
Уже есть простейший вариант - собирайте, кому хочется.
Мне (и не только) в простейшем варианте кое-чего не хватает, по этому я буду делать хоть и сложнее, но пофункциональнее.

Vlad_Petr: Именно в этом, его несомненное и большое достоинство!

DOS - одно из простейших ПО. Раз это достоинство, почему Вы лично его не используете? Небось, Висту или "Семёрку" юзаете?..
Есть простейший ОУ, и есть простейший ЦПУ. Но ни кому не приходит в голову сравнивать их между собой по простоте. В нашем случае простота разных вариантов так же имеет разную степень.

 

DWD: DOS - одно из простейших ПО. Раз это достоинство, почему Вы лично его не используете? Небось, Висту или "Семёрку" юзаете?.. это когда как.. и DOS сейчас иногда пользую. Сохранил я и первый пень с ISA шиной и всякими стандартными для DOS "устаревшими" портами. Во многих случаях очень помогает в отладке цифровых устройств в реальном времени. Старенький комп с DOS,- как логический анализатор!. Разумеется, все на писишном ассме.. Сейчас, для отладки существуют отдельные анализаторы, буферизирующие данные в реальном времени и сбрасывающие информацию на комп через USB. Но они, по разумным ценам, появились (пока с простыми алгоритмами) не так давно, поэтому DOS, таким образом, меня до сих пор выручает, избавляя от головной боли при отладке контроллерных девайсов. Получается, что для тех, кто на ассме может писать, отладочные средства просто под ногами валяются..
А если конкретно "в тему", то легко на DOS пентюхе создать и через один LPT порт вытолкнуть DDS выходные коды обсуждаемого тут генератора, чтобы практически отлаживать ЦАПы и выходные фильтры.. Это дает возможность оптимизировать разработку в целом (в части применимости вариантов ЦАП в диапазоне частот, порядка и конструкции выходного фильтра, параметров выходного усилителя... и т.д.) не путем "проб и ошибок" а прямым моделированием реального процесса. Полагаю, все понимают, что на любой Винде (Висте) такие возможности писишного железа не реализуются.

 

GM: Но, как уже говорил, оказывается одного порта маловато будет. Исходя из сказанного - используем последовательный регистр. Вталкиваем туда данные по клокам и защёлкиваем на выход - 3 ноги.

GM, подправил вариант с регистрами на HC595. Лежит здесь.
Посмотрите, так или нет?

Для управления уровнем и смещением выходого сигнала используется 3 байта, выводимые с МК на вход "Data", последовательно продвигаемые по регистру импульсами на входе "Shift" и после заполнения защёлкиваемые импульсом по входу "Store".
Так?

Первыми загняются в регистр два байта амплитуды, соответственно отрицательной и положительной полуволн выходного напряжения (или смещения при отличии кода в этих двух байтах), затем ещё два бита - переключение аттенюатора (0дБ или -48дБ) и выбор КУ выходного усилителя мощности для получения выходного напряжения уровнями 0дБ или +20дБ.
Порядок загрузки регистра можно обговорить. Вдруг изменение порядка упростит программу или оптимизирует код.

Осталось в резерве ещё 6 бит третьего байта...

Управление выходным напряжением производится по следующему алгоритму (грубо).
По умолчанию, любой набор цифр на клавиатуре означает набор частоты.
В связи с этим не понимаю, зачем я нарисовал и кнопку "F"-Частота?.. Ну да убрать не долго.
Несколько функциональных кнопок показаны на схеме.

Однократное нажатие на функциональную кнопку "А"-Усилитель производит только переключение (триггерное) коэффициента усиления усилителя мощности (КУ УМ). Для этого в передаваемом коде нужно выставить бит "КУ УМ" либо в "0" - для получения калиброванного выхода 0дБ (0.775В) или в "1" - для получения на выходе напряжения +20дБ (7.75В). Потом конкретнее определимся по уровню +20дБ...

При нажатии кнопки "U"-Амплитуда или Напряжение (может назвать лучше "АT"-Аттенюатор?), дальнеший набор цифр на клавиатуре будет означать задание величины выходного напряжения. Удобно при необходимости ввода конкретного значения, например, "250мВ" или "-40дБ".
Нужно обсудить, как определять (или задавать), что ввод идёт в "В", "мВ" или в "дБ"...

Можно эту кнопку сделать с двойным назначением: при однократном её нажатии и наборе цифр - выставляется конкретное значение выходного напряжения, а если цифры не трогать, а снова нажать её же, то происходит переключение аттенюатора - каждое повторное нажатие этой кнопки по кругу выставляет аттенюатор в "0дБ", "-20дБ", "-40дБ" и т.д. по отношению к уже заданному значению выходного напряжения. Величину шага можно обсудить...
Думаю, это будет удобно.
И саму кнопку нужно тогда переименовать, например, в "U/At"-Амплиуда/Аттенюатор.

Ух ты!.. Для себя лично я именно так бы и делал! Понравилось...

Нажатие кнопки "S"-Смещение и наборе цифр на клавиатуре означает установку постоянного смещения в выходном напряжении. Для этого первые два байта кода загружаются в регистр не одинаковыми.
Например, если будут заданы одинаковые значения по 1В, то на выходе будет симметричное по отношению в нулю переменное напряжение величиной 1В. А если задать в первом байте величину 1В, а во втором - 0В, то на выходе получим уже пульсирующее напряжение амплитудой от нуля до +1В.
Если значения кодов первых двух байт поменять местами, то смещение будет таким же по величине, но отрицательным.
Минимальный шаг смещения равен шагу уровня - 20мВ.
Так как значение этих двух байт кода однозначно привязано к уровню сигнала, то, думаю, перевод заданного значения постоянного смещения в величину напряжения труда не составит...

Ну и остался валкодер - для плавной регулировки выходного уровня. Каждый импульс с него увеличивает или уменьшает (в зависимости от направления вращения) амплитуду выходного напряжения с самым мелким шагом (пока - 20мВ). При этом МК считает импульсы - при переполнении первых двух байт кода (или значения 255) он сам выдаёт команду на переключение бита аттенюатора в "1" (для переключения выходного аттенюатора в -48дБ) и продолжает заполнять указанные байты уже с нулевого значения. Соответственно - наоборот при уменьшении уровня - выставляет бит аттенюатора в "0" и выдаёт код байтов 255 с дальнейшим декрементом.

Таким образом пролучится плавная (с заданным дискретом) регулировка уровня от минимума до максимума в зависимости от состояния бита коээфициента усиления усилителя мощности ("КУ КМ"): если этот бит равен "0", то плавная регулировка осуществляется в диапазоне 0...-96дБ, а если этот бит установлен в "1", то регулировка будет уже в диапазоне +20...-96дБ.

Для сохранения прежнего шага регулировки МК должен уже будет сам определять моменты переключения не только аттенюатора, но и "КУ УМ", ориентируясь на флаг текущего состояния бита "КУ УМ": если был задан уровень коэффициента усиления "0дБ", то при плавной регулировке бит "КУ УМ" не трогается, а если был выставлен "КУ УМ" в положение "+20дБ", то при плавной регулировке МК в нужные моменты сам корректирует бит "КУ УМ".

Пока вроде бы всё...
Мне почему-то кажется, что алгоритм регулировки достаточно прост, не требует математических операций при программировании и для опытного программиста труда не составит.

Да и сама схема для реализации такого варианта регулировки не сложная и не содержит дорогих или недоступных деталей.

Основная сложность - в получении относительно стабильного источника опорного напряжения величиной +5В (пока такое значение), а после изготовления - настройка двух ЦАП уровня для получения симметричности вырабатываемых ими напряжений.

Кстати, ЦАП-ы уровня М1 и М2 (на схеме) так же резистивные, на матрице R-2R. ОУ DA1 и DA2 приводят напряжения с ЦАП к требуемому значению и полярности. Нужное значение можно выставить резисторами R2,R5 или R3,R6 в зависимости от величины выбранного источника опорного напряжения. На схеме приведены зачения для опорного +5В.

Думаю, вполне хватит стабильности обычного линейного стабилизатора типа 78L05 для применения его в качестве опорного.
Абсолютное значение величины опорного напряжения роли не играет, так как его можно скорректировать резисторами R2,R5 или R3,R6, а температурная нестабильность в диапазоне температур +10...+50 градусов составляет доли мВ. То есть, при комнатной температуре точность поддержания опорного напряжения должна быть достаточна. Если нет, то придумаем/возьмём что-то по-стабильнее...

Для ЦАП лучше брать ОУ с малым напряжением смещения (принимаются варианты), но моделирование показывает, что и простой LM358 даёт приемлемую точность. Его изначальное смещение можно скорректировать резисторами R1 и R3.
Можно сразу взять что-то типа OP07. Он не на много дороже и так же доступен. Но, опять же, вакансия свободна - предлагайте варианты.

 

Vlad_Petr: ...это когда как.. и DOS сейчас иногда пользую.

Но Вы поняли, что я имел в виду под сравнением DOS с современными ОС.

Vlad_Petr: А если конкретно "в тему", то легко на DOS пентюхе создать и через один LPT порт вытолкнуть DDS выходные коды обсуждаемого тут генератора, чтобы практически отлаживать ЦАПы и выходные фильтры..

Я для этой цели хотел просить GM, что бы он написал какой-то отладочный блок либо в рабочей прошивке, либо в виде отдельной прошивки, используемой только для наладки. Как, например, он делал в начальном варианте DDS одну функцию ГКЧ от нуля до максимума для настройки фильтра.

Но можно сделать то же и на "пентюхе", только кто этим займётся?..

 

DWD: Лежит здесь.

Мягко говоря, достойный труд (почтенно). Не добавить не убавить...

DWD: Нужно обсудить, как определять (или задавать), что ввод идёт в "В", "мВ" или в "дБ"...

За себя скажу, мне удобнее в mV.

DWD: Можно эту кнопку сделать с двойным назначением: при однократном её нажатии и наборе цифр - выставляется конкретное значение выходного напряжения, а если цифры не трогать, а снова нажать её же, то происходит переключение аттенюатора

Это из соображений экономии выводов портов мастера или удобства управления?

DWD: Для ЦАП лучше брать ОУ с малым напряжением смещения (принимаются варианты), но моделирование показывает, что и простой LM358 даёт приемлемую точность. Его изначальное смещение можно скорректировать резисторами R1 и R3.
Можно сразу взять что-то типа OP07. Он не на много дороже и так же доступен. Но, опять же, вакансия свободна - предлагайте варианты.

Не принципиально в разумных пределах, сделать разводку под 358, а там каждый поставит, что считает нужным. Наверное половина спаренных операционников схожи по распиновке. Есть ведь спарки и прецизионные.AD712

Слово за GM.

 

explorer: Не добавить не убавить...

Добавлять ещё много - блокировочные конденсаторы, продумав ёмкости, типы и количество, номиналы просчитать...
Это только суть, набросок.
Но в принципе схема, на мой взгляд, пока не сложная вырисовывается.
Нужно, что бы GM утвердил...
explorer: За себя скажу, мне удобнее в mV.

Пожалуй, для основной работы да, когда максимальный уровень не превышает 1В.
Но, думаю, приятной фичей будет возможность ввода и индикации ещё и в дБ.

explorer: Это из соображений экономии выводов портов мастера или удобства управления?

Экономия - вряд ли, так как для кнопки нужно использовать либо отдельный порт, либо свободную пару в матрице.
Скорее - удобство, так как многие, наверно, привыкли уже к стандартной функции любого генератора - аттенюатора с шагом 10-20дБ.
При наличии возможности оперативной установки конкретного ослабления с любым шагом в нашем варианте, стандартный аттенюатор, может быть, и не нужен, но его реализация вряд ли окажется трудной, а фича - полезная. Почему бы не реализовать?..

explorer: Есть ведь спарки и прецизионные.AD712

Нет, такие ОУ нам не нужны...
Самый дешёвый - $3. Самый дорогой - больше $10!
В то время как более дешёвый OP07 (максимум $1) имеет лучшие характеристики по уровню смещения нуля - 25...75мкВ против 300мкВ...3мВ в зависимости от буквы.

 

DWD: Добавлять ещё много

Это все конечно так, но я про концепцию.

DWD: привыкли уже к стандартной функции любого генератора - аттенюатора с шагом 10-20дБ.

Привыкли. Во, мой рабочий ГЗ-118 - эргономика, ау, где ты, все на галетниках. Прост и надежен как силикатный кирпич.

DWD: Почему бы не реализовать?..

Правильно, максимум автоматики...

DWD: Нет, такие ОУ нам не нужны...

Ок. Разведем под OP07. А то вот еще альтернатива К140УД... УД24 наверное бы подошел идиально.

 

explorer: Привыкли. Во, мой рабочий ГЗ-118 - эргономика, ау, где ты, все на галетниках. Прост и надежен как силикатный кирпич. Мелкий галетник для переключения ослабления с шагом в 10дБ. очень удобен. С его контактов диодный шифратор и на три релюшки..Действительно...просто как кирпич ИМХО функция изменения уровня выхода ИСПОЛЬЗУЕТСЯ МНОГО РЕЖЕ, чем, например, изменение частоты. Да и руки с пальцами у нас достаточно большие.. поэтому стремление реализовать все на нескольких функциональных кнопках с множеством переключений режимов (чтобы размеры морды уменьшить) неудобно при реальной работе с прибором.

 

Vlad_Petr: стремление реализовать все на нескольких функциональных кнопках с множеством переключений режимов (чтобы размеры морды уменьшить) неудобно при реальной работе с прибором
Коли есть у прибора электронные "мозги" пусть автоматика присутствует в его составе по максимуму. imho

 

explorer: А то вот еще альтернатива К140УД... УД24 наверное бы подошел идиально.

Только его импортный аналог.
Не лежит душа у меня к нашим современным компонентам...

Опять же, мне кажется, что напряжение смещения ОУ не будет сильно портить картину.

Скажем, сейчас у нас пока минимальный шаг равен 20мВ.

Напряжение смещения LM358 - 9мВ максимум во всём диапазоне температур и 7мВ при комнатной.
(хотя есть фирмы, у которых эти же мс имеют смещение максимум 5мВ.

Просто включаем этот ОУ без коррекции смещения и получаем ошибку, например, 20+9=29мВ. Выходит, что получив на выходе 29мВ вместо заказанных 20мВ имеем очень большую погрешность.
Но у нас есть выходной аттенюатор на -48дБ, по этому те же 20мВ лучше получить с его помошью - включить его и выставить на ЦАП уровня напряжение 20мВ*255=5100мВ. При том же смещении в 9мВ получим ошибку (5100мВ+9мВ)/255=20.035мВ. То есть такую, о которой можно не беспокоиться.

Или другой пример.
С каждым шагом увеличения выходного напряжения смещение ОУ будет всё меньше давать погрешность. Если выставить на ЦАП уровня напряжение, скажем, 100мВ, то со смещением 9мВ получим на выходе 109мВ/255=0.427мВ вместо заданных 0.392мВ. Ошибка 0.427мВ-0.392мВ=35мкВ. Это уже на уровне шумов.

Получается, что с помошью выходного резиситивного аттенюатора можно получать на выходе достаточно малые напряжения с минимальной ошибкой, так как при этом на ЦАП уровня будет высавлено напряжение, больше на 48дБ, при котором напряжение смещения ОУ просто теряется.

В общем, думаю, достаточно взять ОУ OP-07 с максимальным смещением 75мкВ и вообще не заморачиваться его компенсацией.
По "бедности" можно взять ширпотребовский ОУ LM358 и резистором скомпенсировать его смещение до минимума, который в остоянии увидеть ваш мультиметр. Вряд ли смещение получится больше 1мВ. А этого уже хватит на все случаи жизни.

Если не прав, подскажите в чём ошибка.