# Лабораторная работа: DDS-стенд и исследование фильтров ## Электронные устройства мехатронных и робототехнических систем **Дисциплина:** Электронные устройства мехатронных и робототехнических систем, Б1.В.06 **Специальность:** 15.03.06 «Мехатроника и робототехника» **Семестр:** 5 · **Объём:** 4 часа **Стенд:** RP2040 (Raspberry Pi Pico) + макетная плата > Черновик. Требует проверки преподавателем перед выдачей студентам. --- ## 1. Зачем эта работа В мехатронном модуле сигнал датчика проходит аналоговую обработку: фильтрацию помех, интегрирование, выделение скорости (дифференцирование). Каждое такое звено описывается передаточной функцией, и от его параметров (K, τ) зависит поведение всей системы управления. Чтобы **проверить звено на железе**, нужен генератор с известной частотой и амплитудой. Готового лабораторного генератора со свипом под рукой не оказалось — поэтому в первой части работы вы **сами делаете стенд**: DDS-генератор на RP2040 и скрипт автоматического снятия АЧХ. Во второй части вы этим стендом **исследуете фильтры** — интегратор, дифференциатор и RC-фильтр — и сравниваете эксперимент с расчётом. ### Две части работы | Часть | Что делаем | Результат | |---|---|---| | **A. Стенд** | собираем и настраиваем DDS-генератор | работающий прибор: частота, амплитуда, свип | | **B. Исследование** | снимаем характеристики фильтров | АЧХ/ФЧХ, сравнение с расчётом | Часть A без части B бессмысленна: прибор делается, чтобы им измерять. Часть B без части A невозможна: нечем снимать АЧХ. --- ## 2. Теория кратко ### 2.1. Что должен делать генератор (часть A) **DDS** (Direct Digital Synthesis) — синтез сигнала из заранее посчитанного массива значений. Идея: 1. считаем один период нужной формы — например синуса — в массив из `m` точек; 2. подаём массив в PIO по кругу через DMA; 3. PIO выводит точки в порт с частотой `f_пио`; 4. частота выходного сигнала: `f_вых = f_пио / (CPC · m)`, где `CPC` — число тактов PIO на один сэмпл. Чем больше `m`, тем точнее форма и выше разрешение уровня, но тем ниже максимальная частота. ### 2.2. Точность уровня: битность ≠ разрешение - **Битность** `B` — сколько бит выводится в порт сразу (мгновенный код). - **Эффективная разрядность** — сколько уровней различает **среднее** после фильтра: `(2^B − 1)·m + 1`. При `B = 4` и `m = 256` порт даёт 4 бита, но среднее различает 3841 уровень (~11.9 бит). Так работает дельта-сигма: соседние коды чередуются во времени, а ФНЧ усредняет. ### 2.3. Интегратор на ОУ **Идеальный** (R1 на входе, C1 в ООС): ``` W(s) = −1 / (R1·C1·s) ``` На постоянном токе усиление бесконечно, поэтому **реальный** интегратор всегда содержит резистор утечки R2 параллельно C1 — это превращает его в **апериодическое звено первого порядка**: ``` W(s) = −R2 / (R1 · (1 + R2·C1·s)) = −K / (τ·s + 1) K = R2/R1, τ = R2·C1, f_c = 1/(2π·τ) ``` ### 2.4. Дифференциатор на ОУ C1 на входе, R1 в ООС: ``` W(s) = −R1·C1·s ``` На высоких частотах усиление растёт, поэтому на практике вход ограничивают резистором последовательно с C1. ### 2.5. RC-фильтр нижних частот Пассивный ФНЧ первого порядка: ``` K(f) = 1 / √(1 + (f/f_c)²), f_c = 1/(2π·R·C) наклон за f_c: −20 дБ/дек ``` --- ## 3. Часть A. Сборка и настройка стенда ### Задание A1 (0,5 ч). Прошивка генератора и первый запуск В папке `stub/` три варианта генератора — **выберите один**: | Файл | Платформа | Как формируется синус | |---|---|---| | `01-...ip2040.ino` | Arduino C++ | программный DDS + ШИМ | | `01-...-circuitpython.py` | CircuitPython | программный DDS + ШИМ | | `04-dds-pio-rp2040.py` | CircuitPython | **аппаратный PIO + DMA** | **Рекомендуется вариант на PIO** — он даёт точную частоту и не грузит CPU. 1. Залейте файл на Pico (CircuitPython: переименовать в `code.py`). 2. Откройте консоль, введите `HELP` — увидите список команд. 3. Введите `I` — генератор покажет текущие настройки, включая **фактическую** частоту и потолок `f_max`. 4. Соберите внешний ФНЧ на выходе (схема — в `HELP`): ``` GP15 ──[R1 1к]──┬──[R2 1к]──┬──► выход │ │ [C1 47н] [C2 47н] │ │ GND GND ``` **Проверка:** подать `W S` (синус), `F 1000`, посмотреть осциллографом. Период должен быть ≈ 1 мс. ### Задание A2 (0,5 ч). Калибровка частоты Частота зависит от `CPC` — числа тактов PIO на сэмпл. Оно может отличаться на разных прошивках. 1. Поставьте `F 1000`, измерьте период осциллографом. 2. Если факт отличается от запроса — введите `CAL <измеренное_значение>`, например `CAL 500` при запросе 1000. Генератор подстроит `CPC` сам. 3. Повторите замер — теперь должно совпасть. 4. **Запишите** подобранное `CPC` (видно командой `I`) — оно нужно для расчёта погрешности в отчёте. > Если частота вообще не достижима, генератор скажет > `! ЗАПРОС ВЫШЕ ПОТОЛКА: факт ... Гц`. Это значит `m` слишком велико: > уменьшите `N` или `O`. ### Задание A3 (0,5 ч). Автоматическое снятие АЧХ 1. Соберите на макетной плате простой RC-фильтр (см. часть B, задание B3). 2. Подключите: выход генератора → вход фильтра; выход фильтра → вход измерения (ADC0, GP26). **Если сигнал больше 3,3 В — через делитель.** 3. Запустите хост-скрипт: ``` python 02-izmerenie-achh.py --port /dev/ttyACM0 \ --f0 10 --f1 100000 --n 25 --dwell 150 --uin 500 --out achh.csv --plot ``` 4. Получите CSV с точками «частота → амплитуда». Это ваш измерительный прибор на вторую часть работы. **Результат части A:** работающий стенд, калиброванная частота, скрипт, дающий АЧХ в CSV. --- ## 4. Часть B. Исследование фильтров Все три задания выполняются **одним и тем же стендом**, меняется только исследуемая схема. Для каждой схемы: 1. рассчитать параметры (K, τ или f_c) по формулам из п. 2; 2. собрать схему на макетной плате; 3. снять АЧХ стендом (частичный диапазон вокруг f_c, 8–12 точек); 4. наложить экспериментальные точки на расчётную кривую; 5. оценить расхождение и объяснить его. ### Задание B1 (1 ч). Интегратор на ОУ **Схема:** R1 = 10 кОм на вход, R2 = 100 кОм ‖ C1 = 0,1 мкФ в ООС. - Рассчитать: `K = R2/R1`, `τ = R2·C1`, `f_c = 1/(2π·τ)`. - Снять АЧХ в диапазоне **1 Гц … 10·f_c**. - Определить по графику плоский участок, частоту сопряжения, наклон. - **Проверить форму во времени:** подать прямоугольник, увидеть пилу. Размах пилы `U_m = U_вх·T/(2·R1·C1)`. **Контрольный вопрос:** почему `f_c` определяется `R2·C1`, а не `R1·C1`? ### Задание B2 (1 ч). Дифференциатор на ОУ **Схема:** C1 = 0,1 мкФ на вход, R1 = 10 кОм в ООС. - Рассчитать `W(s) = −R1·C1·s`, ожидаемый наклон **+20 дБ/дек**. - Снять АЧХ в диапазоне, где схема ещё устойчива. - **Проверить во времени:** подать пилу — увидеть импульсы в моменты перепада. Амплитуда `U_m = R1·C1·dU_вх/dt`. - Объяснить, почему реальный дифференциатор требует ограничения входа. **Контрольный вопрос:** чем отличается идеальный дифференциатор от реального и почему вход ограничивают резистором? ### Задание B3 (0,5 ч). Пассивный RC-фильтр **Схема:** R = 1 кОм, C = 0,1 мкФ (или по вашему варианту). - Рассчитать `f_c = 1/(2π·R·C)`, ожидаемый наклон −20 дБ/дек. - Снять АЧХ стендом в диапазоне **0,1·f_c … 100·f_c** (10–12 точек). - Наложить на расчётную кривую `K(f) = 1/√(1+(f/f_c)²)`. - Сравнить расхождение с допусками компонентов (±5 %). **Контрольный вопрос:** почему реальная АЧХ за `f_c` уходит круче −20 дБ/дек? (подсказка: паразитные параметры, вход ADC) ### Задание B4 (0,5 ч). Сравнение и отчёт Свести результаты трёх схем в таблицу: | Схема | f_c расчёт | f_c опыт | Расхождение | Наклон расчёт | Наклон опыт | |---|---|---|---|---|---| | Интегратор | | | | −20 дБ/дек | | | Дифференциатор | | | | +20 дБ/дек | | | RC-фильтр | | | | −20 дБ/дек | | Сделать выводы: - какой разброс дали допуски компонентов; - где опыт расходится с расчётом сильнее всего и почему; - какую роль сыграла калибровка генератора (задание A2). --- ## 5. Оформление и оценивание Отчёт содержит: 1. Схемы: ФНЧ стенда, интегратор, дифференциатор, RC-фильтр. 2. Настройки генератора из `I` (включая `CPC` после калибровки). 3. Осциллограммы: синус с генератора, пила интегратора, импульсы дифференциатора. 4. Три графика АЧХ с наложенными расчётными кривыми. 5. Итоговую таблицу из задания B4. 6. Выводы по расхождениям. | Задание | Баллы | |---|---| | A1. Прошивка и первый запуск | 1,0 | | A2. Калибровка частоты | 1,0 | | A3. Автоснятие АЧХ | 2,0 | | B1. Интегратор | 2,0 | | B2. Дифференциатор | 2,0 | | B3. RC-фильтр | 1,0 | | B4. Сводка и выводы | 1,0 | | **Итого** | **10** | Зачёт — при **6 и более** баллах. --- ## 6. Контрольные вопросы **По стенду (часть A):** 1. Чему равна частота выходного сигнала DDS и какие величины её задают? 2. Что такое `CPC` и почему его приходится калибровать? 3. Чем битность порта отличается от эффективной разрядности? 4. Почему для синуса нужен внешний ФНЧ после ШИМ? **По фильтрам (часть B):** 5. Чему равна передаточная функция идеального интегратора и почему без резистора утечки её нельзя реализовать? 6. Как по АЧХ отличить идеальный интегратор от апериодического звена? 7. Почему наклон АЧХ звена первого порядка равен −20 дБ/дек? 8. Как допуски R и C влияют на `f_c` и что даёт анализ Monte Carlo? --- ## 7. Литература 1. Хоровиц П., Хилл У. Искусство схемотехники. 3-е изд. М.: Бином, 2014. Гл. 4 (ОУ в линейном режиме). 2. Титце У., Шенк К. Полупроводниковая схемотехника. 12-е изд. М.: ДМК Пресс, 2008. Т. 1, гл. 11 (частотные характеристики). 3. Бесекерский В.А., Попов Е.П. Теория систем автоматического регулирования. М.: Наука, 2010. Гл. 2 (типовые звенья). 4. LTSpice XVII User Guide. Analog Devices. 5. RP2040 Datasheet. Raspberry Pi Ltd (PIO, DMA, ADC). 6. LM358 / TL081 datasheet. Texas Instruments.