可调滤波器模块
可调滤波器模块
模块描述
可调滤波器模块通过数字电位器动态调节截止频率,实现程控滤波功能。采用数字电位器替代固定电阻,配合运算放大器构成RC滤波网络,通过MCU或手动控制改变电阻值,从而实现截止频率的精确调节。典型应用包括程控滤波系统、自适应滤波、测试仪器、音频均衡器等。在电赛中广泛用于需要动态调整滤波特性的场合,如信号处理、频率响应测试、通信系统等题目。
工作原理
可调低通滤波器基本结构:
[Vin] → [数字电位器R] → [运放] → [Vout]
↓ ↓
[C] [反馈网络]
↓
[GND]
数字电位器控制:
[MCU] → [SPI/I2C] → [数字电位器] → [阻值变化] → [fc调节]
↓ ↓
[控制字] [0-255级]
一阶RC低通:
fc = 1 / (2π·R·C)
二阶Sallen-Key结构:
[Vin] → [R1(数字电位器)] → [R2] → [运放+] → [Vout]
↓ ↓ ↓
[C1] [C2] [跟随器]
↓ ↓
[GND] [GND]
fc = 1 / (2π·√(R1·R2·C1·C2))
调节R1即可调节fc
控制方式:
1. SPI控制: MCU发送控制字,精确设定阻值
2. I2C控制: 总线控制,支持多器件级联
3. 按钮控制: UP/DOWN引脚,手动调节
4. 电压控制: 模拟电压映射到阻值
频率调节范围:
- 最小R值: 如1kΩ → fc_max = 1/(2π·1k·C)
- 最大R值: 如100kΩ → fc_min = 1/(2π·100k·C)
- 调节比: 100:1 (典型)
- 步进: 256级(8位) / 1024级(10位)
典型参数:
- C = 10nF固定
- R = 1kΩ~100kΩ可调
- fc = 159Hz ~ 15.9kHz
技术指标
- 数字电位器: X9C103 (10kΩ,99步), MCP41010 (10kΩ,SPI,256步), AD5204 (10kΩ,I2C,256步) - 运放: TL082 (通用), OPA2134 (音频), NE5532 (低噪声) - 阻值范围:
- X9C103: 40Ω ~ 10kΩ (99步,每步约100Ω)
- MCP41010: 0Ω ~ 10kΩ (256步,每步约39Ω)
- AD5232: 1kΩ ~ 50kΩ (双通道,256步)
- 截止频率范围: 10Hz ~ 100kHz (取决于R和C配置) - 频率调节比: 10:1 ~ 100:1 - 频率精度:
- 电位器精度: ±20% (典型)
- 步进分辨率: 8位0.4%, 10位0.1%
- 温度漂移: ±300ppm/°C
- 滤波器阶数: 1阶 / 2阶 / 4阶 (多级级联) - 滚降速率:
- 1阶: -20dB/decade
- 2阶: -40dB/decade
- 4阶: -80dB/decade
- 通带增益: 0dB (跟随器) 至 +40dB (可调) - THD+N: <0.01% @ 1kHz - 动态范围: >85dB - 控制接口:
- SPI: 10MHz时钟
- I2C: 400kHz (快速模式)
- UP/DOWN: 手动控制
- 更新时间: <1ms (SPI), <10ms (X9C103) - 非易失性存储: X9C系列支持断电保存
接口管脚定义
X9C103数字电位器 (8-DIP):
| 管脚 | 名称 | 功能 | 说明 |
| —— | —— | —— | —— |
| 1 | CS | 片选 | 低电平有效 |
| 2 | U/D | 增减控制 | 高=增大,低=减小 |
| 3 | INC | 步进脉冲 | 下降沿触发 |
| 4 | VSS | 地 | 0V |
| 5 | RW | 滑动端 | 可变电阻输出 |
| 6 | RH | 高阻端 | 电阻上端 |
| 7 | RL | 低阻端 | 电阻下端(接地) |
| 8 | VCC | 电源 | +5V |
MCP41010数字电位器 (8-DIP/SOIC):
| 管脚 | 名称 | 功能 | 说明 |
| —— | —— | —— | —— |
| 1 | CS | 片选 | 低电平有效 |
| 2 | SCK | SPI时钟 | 串行时钟输入 |
| 3 | SI | SPI数据输入 | 串行数据输入 |
| 4 | VSS | 地 | 0V |
| 5 | PA0 | 滑动端A | 可变电阻输出 |
| 6 | PW0 | 滑动端(同PA0) | 可变电阻输出 |
| 7 | PB0 | 高阻端B | 电阻上端 |
| 8 | VDD | 电源 | +2.7V~+5.5V |
运放接口 (TL082双运放):
| 管脚 | 名称 | 功能 | 说明 |
| —— | —— | —— | —— |
| 1 | OUT1 | 输出1 | 第一级输出 |
| 2 | IN1- | 反相输入1 | 第一级反相输入 |
| 3 | IN1+ | 同相输入1 | 第一级同相输入 |
| 4 | V- | 负电源 | -5V至-15V或GND |
| 5 | IN2+ | 同相输入2 | 第二级同相输入 |
| 6 | IN2- | 反相输入2 | 第二级反相输入 |
| 7 | OUT2 | 输出2 | 第二级输出 |
| 8 | V+ | 正电源 | +5V至+15V |
控制接口:
| 接口 | 信号 | 功能 | 说明 |
| —— | —— | —— | —— |
| MCU GPIO | CS, SCK, SI | SPI控制 | MCP41010 |
| MCU GPIO | CS, INC, U/D | 步进控制 | X9C103 |
| I2C总线 | SDA, SCL | I2C控制 | AD5232等 |
| 按钮 | UP, DOWN | 手动控制 | 物理按键 |
| 模拟输入 | ADC → MCU → 数字电位器 | 电压控制 | 压控滤波器 |
板上设置和信号指示
- 电源配置:
- 数字电位器: 单电源+5V
- 运放: 双电源±12V 或 单电源+5V(需偏置)
- 退耦电容: 100nF陶瓷电容就近放置
- 输入接口:
- BNC或SMA接口
- 串联保护电阻100Ω
- 输入缓冲器(可选,提高输入阻抗)
- 输出接口:
- BNC或SMA接口
- 输出缓冲器(运放跟随器)
- 短路保护电阻100Ω
- 控制接口:
- SPI: 4线接口(CS, SCK, SI, GND)
- I2C: 2线接口(SDA, SCL) + 上拉电阻4.7kΩ
- 按钮: UP/DOWN按钮 + 防抖电容
- 拨码开关/跳线:
- 滤波器类型选择: 低通/高通/带通
- 阶数选择: 1阶/2阶/4阶
- 控制模式: SPI/I2C/手动
- LED指示:
- 电源指示: 绿色LED
- 数字电位器活动: 黄色LED(数据传输时闪烁)
- 频率档位: 多个LED指示当前频率范围
- 测试点:
- 输入/输出测试点
- 电位器滑动端测试点(监测R值)
- 电源测试点
- 显示(可选):
- 7段数码管显示当前频率
- OLED显示屏显示fc, Q值, 增益等参数
- 元件配置:
- 电容: 5%精度薄膜电容或NPO/C0G陶瓷电容
- 固定电阻: 1%精度金属膜电阻
- 运放去耦: 每个电源引脚100nF+10μF电解电容
电气指标
- 电源电压:
- 数字电位器: +5V ±5%
- 运放: ±5V至±15V (双电源) 或 +5V至+15V (单电源)
- 电源电流:
- 数字电位器: <1mA (静态), <5mA (工作)
- 运放: 5-10mA (每片TL082)
- 总电流: <50mA (典型配置)
- 控制接口电气特性:
- SPI时钟: 0-10MHz
- SPI电平: CMOS 3.3V/5V兼容
- I2C速率: 100kHz (标准) / 400kHz (快速)
- 按钮输入: 施密特触发器输入,防抖
- 信号接口:
- 输入电压范围: ±10V (双电源), 0-5V (单电源)
- 输出电压摆幅: ±12V (双电源,±15V供电), 0.2-4.8V (单电源)
- 输入阻抗: >100kΩ (带缓冲器), R值 (无缓冲器)
- 输出阻抗: <100Ω
- 频率特性:
- 截止频率范围: 10Hz ~ 100kHz (可配置)
- 调节步进: 256级 (8位) / 1024级 (10位)
- 频率精度: ±5% (受电容和电位器精度影响)
- 频率稳定性: ±1% (温度稳定后)
- 温度系数: ±300ppm/°C
- 滤波器性能:
- 通带平坦度: ±0.5dB
- 阻带衰减: 20dB/dec (1阶), 40dB/dec (2阶)
- THD+N: <0.01% @ 1kHz
- 噪声: <20μVrms (输入短路)
- 信噪比: >85dB
- 动态范围: >85dB
- 时序特性:
- 数字电位器更新时间: <1ms (SPI), <10ms (X9C103)
- 滤波器建立时间: 5-10个时间常数 τ=RC
- 控制响应延迟: <20ms
使用说明
1. 硬件连接
基本连接 (X9C103 + TL082):
MCU X9C103 运放 信号
GPIO1 ────────→ CS(1)
GPIO2 ────────→ U/D(2)
GPIO3 ────────→ INC(3)
VSS(4) ──→ GND
RW(5) ───→ R2 ──→ [Sallen-Key网络]
RH(6) ───→ +5V/悬空
RL(7) ───→ GND
VCC(8) ──→ +5V
一阶RC低通:
Vin ──→ [RW-RL] ──→ [C] ──→ GND
└──────────→ [运放跟随器] ──→ Vout
二阶Sallen-Key:
Vin → [R1固定] → [X9C103 RW] → [运放+] → Vout
↓ ↓ ↓
[C1] [C2] [反馈网络]
↓ ↓
GND GND
2. 控制代码示例
Arduino控制X9C103:
- snippet.cpp
// X9C103引脚定义 #define CS_PIN 10 #define INC_PIN 11 #define UD_PIN 12 void setup() { pinMode(CS_PIN, OUTPUT); pinMode(INC_PIN, OUTPUT); pinMode(UD_PIN, OUTPUT); digitalWrite(CS_PIN, HIGH); // 禁用 digitalWrite(INC_PIN, HIGH); } // 设置电位器位置 (0-99) void setPotPosition(uint8_t pos) { digitalWrite(CS_PIN, LOW); // 使能 // 先归零 digitalWrite(UD_PIN, LOW); // 减小方向 for(int i=0; i<100; i++) { digitalWrite(INC_PIN, HIGH); delayMicroseconds(1); digitalWrite(INC_PIN, LOW); delayMicroseconds(1); } // 增加到目标位置 digitalWrite(UD_PIN, HIGH); // 增大方向 for(int i=0; i<pos; i++) { digitalWrite(INC_PIN, HIGH); delayMicroseconds(1); digitalWrite(INC_PIN, LOW); delayMicroseconds(1); } digitalWrite(CS_PIN, HIGH); // 禁用(保存到EEPROM) } // 设置截止频率 (Hz) void setCutoffFrequency(float fc) { // C = 10nF, R范围 1k-10k // fc = 1/(2*PI*R*C) // R = 1/(2*PI*fc*C) float C = 10e-9; // 10nF float R = 1.0 / (2 * PI * fc * C); // 映射到0-99 uint8_t pos = map(R, 1000, 10000, 0, 99); pos = constrain(pos, 0, 99); setPotPosition(pos); } void loop() { // 扫描频率: 100Hz → 10kHz for(float fc=100; fc<=10000; fc*=1.1) { setCutoffFrequency(fc); delay(500); } }
Arduino控制MCP41010 (SPI):
- snippet.cpp
#include <SPI.h> #define CS_PIN 10 void setup() { pinMode(CS_PIN, OUTPUT); digitalWrite(CS_PIN, HIGH); SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV16); // 1MHz } // 设置电位器 (0-255) void setMCP41010(uint8_t value) { digitalWrite(CS_PIN, LOW); SPI.transfer(0x11); // 命令字节: 写数据寄存器 SPI.transfer(value); // 数据字节 digitalWrite(CS_PIN, HIGH); } // 设置截止频率 void setCutoffFrequency(float fc) { float C = 10e-9; // 10nF float R = 1.0 / (2 * PI * fc * C); // MCP41010: 10kΩ电位器 // R_actual = (value/256) * 10kΩ uint8_t value = (uint8_t)((R / 10000.0) * 256); value = constrain(value, 0, 255); setMCP41010(value); } void loop() { // 线性扫频 for(int i=10; i<=255; i+=5) { setMCP41010(i); delay(100); } }
STM32控制(I2C - AD5232):
- snippet.c
#include "stm32f1xx_hal.h" #define AD5232_ADDR 0x2C // I2C地址 // 写数字电位器 void AD5232_Write(uint8_t channel, uint8_t value) { uint8_t data[2]; data[0] = (channel == 0) ? 0x01 : 0x02; // 通道选择 data[1] = value; HAL_I2C_Master_Transmit(&hi2c1, AD5232_ADDR<<1, data, 2, HAL_MAX_DELAY); } // 设置截止频率 void SetCutoffFreq(float fc_hz) { float C = 10e-9; float R = 1.0 / (2 * PI * fc_hz * C); // AD5232: 50kΩ范围,256步 uint8_t value = (uint8_t)((R / 50000.0) * 256); AD5232_Write(0, value); // 通道0 } int main(void) { HAL_Init(); MX_I2C1_Init(); while(1) { // 程控滤波: 1kHz → 10kHz for(float f=1000; f<=10000; f+=100) { SetCutoffFreq(f); HAL_Delay(200); } } }
3. 频率计算与设计
一阶RC低通:
fc = 1 / (2π·R·C) 选定C=10nF (固定): - R=1kΩ: fc = 15.9kHz - R=10kΩ: fc = 1.59kHz - R=100kΩ: fc = 159Hz 调节比 = R_max / R_min = 100:1 频率比 = fc_max / fc_min = 100:1
二阶Sallen-Key:
fc = 1 / (2π·√(R1·R2·C1·C2)) 简化设计 (R1=R2=R, C1=C2=C): fc = 1 / (2π·R·C) C = 10nF, R可调1k-100kΩ: fc范围: 159Hz ~ 15.9kHz 巴特沃斯Q=0.707: R1 = R2 = R (可调) C1 = C2 = C (固定)
设计步骤: 1. 确定频率范围: 如100Hz ~ 10kHz 2. 选择电容C: 如C=10nF (NPO/C0G) 3. 计算R范围:
- Rmin = 1/(2π·fcmax·C) = 1/(2π·10k·10n) ≈ 1.6kΩ
- Rmax = 1/(2π·fcmin·C) = 1/(2π·100·10n) ≈ 160kΩ
4. 选择数字电位器:
- 需要100:1范围 → MCP41100 (100kΩ)
- 或级联电阻: 固定1kΩ + 数字电位器100kΩ
5. 验证阶跃响应: τ = R·C, 建立时间 ≈ 5τ
4. 多阶滤波器设计
4阶巴特沃斯 (2个2阶级联):
第一级: Q1 = 0.541, fc1 = fc
第二级: Q2 = 1.306, fc2 = fc
[Vin] → [2阶Q1] → [2阶Q2] → [Vout]
↓ ↓
[数字电位器1] [数字电位器2]
两级同步调节,保持Q值不变:
R1_stage1 = f(fc, Q1)
R1_stage2 = f(fc, Q2)
使用查找表或公式计算
5. 校准与测试
频率校准:
1. 使用频率计数器/示波器 2. 扫描数字电位器全程0-255 3. 记录每个设定值对应的实际fc 4. 建立校准表: 设定值 → 实际R值 → 实际fc 5. 软件查表插值,补偿非线性
幅频响应测试:
测试设备: - 信号发生器(DDS) - 示波器/频谱仪 测试流程: 1. 设定fc = 1kHz 2. 输入幅度Vin = 1Vrms 3. 扫频: 10Hz ~ 100kHz 4. 记录Vout 5. 计算增益: G(f) = 20·log(Vout/Vin) 6. 验证-3dB点在fc附近 7. 验证滚降速率: 20dB/dec (1阶)
自动测试程序:
- snippet.cpp
// 自动扫描测试 void autoTest() { Serial.println("fc_set, fc_measured, gain_1kHz"); for(int pos=10; pos<=255; pos+=10) { setMCP41010(pos); delay(100); // 等待稳定 // 测量fc (需要外部频率计数器) float fc_actual = measureCutoff(); float gain = measureGain(1000); // 1kHz增益 Serial.print(calcFcFromPos(pos)); Serial.print(","); Serial.print(fc_actual); Serial.print(","); Serial.println(gain); } }
6. 常见问题与解决
问题1: 频率漂移 - 原因: 温度变化,电容漂移 - 解决:
- 使用NPO/C0G电容(±30ppm/°C)
- 温度补偿算法
- 定期自校准
问题2: 控制不稳定 - 原因: 信号干扰,地环路 - 解决:
- 数字地与模拟地分离
- 控制线远离信号线
- 加滤波电容
问题3: 频率精度低 - 原因: 数字电位器非线性,电容误差 - 解决:
- 校准表补偿
- 使用1%电容
- 多点校准插值
问题4: 高频性能差 - 原因: 运放带宽不足,寄生电容 - 解决:
- 选择高速运放(OPA356, AD8065)
- 减小PCB走线长度
- 优化布局布线
问题5: 噪声大 - 原因: 数字电位器开关噪声,电源噪声 - 解决:
- 加输出低通滤波(RC)
- 电源LC滤波
- 屏蔽敏感电路
7. 高级应用
A. 自适应滤波器
- snippet.cpp
// 根据信号频率自动调节fc void adaptiveFilter() { float signalFreq = detectDominantFreq(); // FFT检测 float fc = signalFreq * 1.5; // fc设为信号频率1.5倍 setCutoffFrequency(fc); }
B. 多频段均衡器
- snippet.cpp
// 3段均衡器: 低频/中频/高频 void setEqualizer(float bass, float mid, float treble) { // 低频: 低通fc=200Hz setDigipot(POT_LP, bass); // 中频: 带通fc=1kHz setDigipot(POT_BP, mid); // 高频: 高通fc=5kHz setDigipot(POT_HP, treble); }
C. 扫频分析仪
- snippet.cpp
// 自动扫频测量幅频响应 void sweepTest() { for(float fc=100; fc<=10000; fc*=1.1) { setCutoffFrequency(fc); delay(50); // 稳定时间 float Vout = measureOutput(); float gain = 20 * log10(Vout / Vin); Serial.print(fc); Serial.print(","); Serial.println(gain); } }
D. 程控陷波器
- snippet.cpp
// 可调陷波器: 消除特定频率干扰 void setNotchFilter(float f_notch) { // 带通 + 全通 - 原信号 = 陷波 // 或使用Twin-T + 数字电位器 // 计算R值 float C = 10e-9; float R = 1 / (2 * PI * f_notch * C); // 设置3个数字电位器(Twin-T网络) setDigipot(POT1, calcValue(R)); setDigipot(POT2, calcValue(R)); setDigipot(POT3, calcValue(R/2)); }
全国大学生电子设计竞赛相关赛题
- 2021年E题: 简易电路特性测试仪
- 要求: 测量幅频特性,需可调滤波器扫频
- 应用: 数字电位器控制fc,自动扫描测量
- 2019年F题: 纸张计数显示装置
- 要求: 信号调理,滤除干扰
- 应用: 可调低通滤波器,适应不同速度
- 2017年E题: 远程幅频特性测试装置
- 要求: 程控滤波,精确fc设定
- 应用: 数字电位器+MCU,远程控制截止频率
- 2015年C题: 风力摆控制系统
- 要求: 传感器信号滤波
- 应用: 自适应滤波器,根据摆动频率调节
- 2013年H题: 射频功率放大器
- 要求: 自动匹配网络
- 应用: 数字电容+数字电位器,可调滤波
- 2011年D题: 波形采集与重现
- 要求: 抗混叠滤波器,适应不同采样率
- 应用: 根据ADC采样率动态调节fc
- 2009年G题: 声音导引系统
- 要求: 音频信号处理,多频段滤波
- 应用: 可调带通滤波器,提取特定频率
- 2007年B题: 程控滤波器
- 要求: 核心题目,实现程控低通/高通/带通
- 应用: 数字电位器阵列,MCU控制,LCD显示
- 2005年F题: 简易频谱分析仪
- 要求: 扫频分析,可调带通滤波器
- 应用: 数字电位器控制中心频率,扫描频谱
- 2003年: 宽带放大器
- 要求: 增益和带宽可调
- 应用: 数字电位器调节增益和滤波器fc
应用技术要点总结
1. 数字电位器选型
- X9C系列 (99步,非易失):
- 优点: 断电保存,简单控制(3线)
- 缺点: 步数少,更新慢(~10ms)
- 适用: 手动调节,不频繁更改
- MCP41/42系列 (256步,SPI):
- 优点: 高分辨率,快速更新(<1ms)
- 缺点: 易失性,需初始化
- 适用: MCU自动控制,频繁调节
- AD5231/5232 (256步,I2C,非易失):
- 优点: I2C总线,断电保存,高精度
- 缺点: 成本较高
- 适用: 高端应用,多通道控制
2. 频率精度优化
- 电容选择: NPO/C0G (±5%, ±30ppm/°C) - 校准方法:
1. 工厂校准: 预设校准表写入EEPROM 2. 现场校准: 测量实际fc,建立映射表 3. 温度补偿: 温度传感器+补偿算法
- 软件插值: 线性/多项式插值提高分辨率
3. 动态性能
- 更新速率:
- SPI数字电位器: <1ms
- 滤波器建立时间: 5τ = 5RC
- 总响应时间: 更新时间 + 建立时间
- 实时控制:
- 使用中断/DMA更新数字电位器
- 预测算法提前调节
4. 多通道同步
- 并联控制: 同一SPI/I2C总线控制多个数字电位器 - 同步更新: LDAC引脚(部分型号)实现同步 - 相位匹配: 同型号同批次,相位偏差<5°
5. 噪声与干扰
- 数字噪声隔离:
- 数字地/模拟地分离
- 控制信号远离信号通路
- 光耦隔离(高要求场合)
- 电源滤波:
- 数字电位器独立LDO
- LC滤波器 + 大容量电容
- 磁珠隔离数字/模拟电源
6. PCB布局
布局原则:
[MCU/数字区] ──(隔离)── [数字电位器] ── [RC网络] ── [运放] ── [输出]
↓ ↓ ↓ ↓
[数字地] ────(单点)──── [模拟地] ──────────────────┘
关键点:
- 控制信号走内层或背面
- RC元件紧邻运放
- 地平面完整,避免分割
- 信号线垂直跨接,减少耦合
- 高频旁路电容就近放置
7. 自动化测试
- SCPI命令: 标准仪器控制 - Python自动化:
```python import serial import pyvisa
# 控制滤波器
ser = serial.Serial('/dev/ttyUSB0', 115200)
# 控制示波器
rm = pyvisa.ResourceManager()
scope = rm.open_resource('USB0::0x1234::0x5678::INSTR')
# 扫频测试
for fc in range(100, 10000, 100):
ser.write(f'SET_FC {fc}\n')
time.sleep(0.1)
gain = measure_gain(scope)
print(f'{fc},{gain}')
```
8. 成本优化
- 低成本方案: X9C103 + TL082 (< ¥5) - 中端方案: MCP41010 + NE5532 (< ¥10) - 高端方案: AD5232 + OPA2134 (< ¥30)
9. 可靠性设计
- 看门狗复位: 防止数字电位器锁死 - 默认值保护: 上电默认安全频率 - 过压保护: TVS管保护输入输出 - ESD防护: ESD二极管阵列
10. 设计验证
- 幅频响应: 扫频仪测量,验证fc和滚降 - 相频响应: 网络分析仪或示波器XY模式 - 阶跃响应: 方波输入,观察过冲和振铃 - THD测试: 音频分析仪,<0.01% - 噪声测试: 输入短路,测量输出噪声<20μV
设计实例
实例1: 程控低通滤波器 (10Hz-10kHz)
规格: - 截止频率: 10Hz ~ 10kHz, 256步可调 - 阶数: 4阶巴特沃斯 - 控制: SPI (STM32) - 显示: OLED显示当前fc
电路:
[输入] → [缓冲器] → [2阶LP Stage1] → [2阶LP Stage2] → [输出]
↓ ↓
[MCP41010-1] [MCP41010-2]
↓ ↓
[STM32 SPI] ←──────────┘
↓
[OLED显示]
BOM:
| 器件 | 型号 | 数量 | 说明 |
| —— | —— | —— | —— |
| 数字电位器 | MCP41010 | 2 | 10kΩ, SPI |
| 运放 | NE5532 | 2 | 双运放,低噪声 |
| 电容 | NPO 10nF | 4 | ±5%, C0G |
| 电阻 | 1% 10kΩ | 8 | 金属膜 |
| MCU | STM32F103C8T6 | 1 | 控制核心 |
| 显示 | OLED 0.96“ | 1 | I2C |
代码框架:
- snippet.c
void setFilter4thOrder(float fc) { // 4阶巴特沃斯: 两个2阶级联 // Stage1: Q=0.541 // Stage2: Q=1.306 float C = 10e-9; // Stage1 计算 float R1 = calcResistor(fc, 0.541, C); uint8_t pot1 = (uint8_t)((R1/10000.0)*256); // Stage2 计算 float R2 = calcResistor(fc, 1.306, C); uint8_t pot2 = (uint8_t)((R2/10000.0)*256); // 更新数字电位器 MCP41010_Write(CS1_PIN, pot1); MCP41010_Write(CS2_PIN, pot2); // OLED显示 OLED_ShowString(0, 0, "fc:"); OLED_ShowNum(30, 0, (uint16_t)fc, 5); OLED_ShowString(80, 0, "Hz"); }
实例2: 自适应陷波器 (50Hz/60Hz工频干扰)
规格: - 陷波频率: 可调48-52Hz, 58-62Hz - Q值: 10 (窄带陷波) - 控制: 自动检测或手动 - 衰减: >40dB @ 陷波频率
电路: Twin-T陷波器 + 数字电位器
R1 R2
Vin ──┬──[Rpot]───┬────┬── Vout
│ │ │
[C] [C] [运放]
│ │
GND GND
│
[2C]─[Rpot/2]
│ │
GND GND
特性: - 调节Rpot改变陷波频率 - 高Q值,不影响邻近频率 - 自动跟踪工频漂移
实例3: 音频10段均衡器
规格: - 10个频段: 31, 63, 125, 250, 500, 1k, 2k, 4k, 8k, 16kHz - 增益: ±12dB, 每段独立可调 - 控制: 10个数字电位器 (I2C总线) - 显示: LCD柱状图
架构:
[输入] → [分频网络] → [10个带通滤波器] → [可调增益] → [混合器] → [输出]
↓ ↓
[带通fc固定] [数字电位器阵列]
↓
[MCU I2C]
↓
[LCD显示]