Files
eumirts5-dds/task.md
T

302 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Лабораторная работа: 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, **оба ядра** (earlephilhower и mbed) | программный DDS + ШИМ |
| `01-...-circuitpython.py` | CircuitPython | программный DDS + ШИМ |
| `04-dds-pio-rp2040.py` | CircuitPython | аппаратный PIO + DMA |
| `04-dds-pio-rp2040.ino` | Arduino, **только earlephilhower** | аппаратный PIO + DMA |
**Рекомендуется вариант на PIO** — точная частота, CPU свободен.
У `.ino`-варианта на PIO форма сигнала задаётся функцией `waveform(t)`
**в коде** (перекомпилировать после правки) — в C++ нет разбора формул
на лету, как в CircuitPython-версии.
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.