2021年全国大学生电子设计竞赛A题"信号失真度测量装置"看似简单,实则暗藏玄机。题目要求用TI MCU的片内ADC实现宽频带(1kHz-100kHz)、小信号(最低30mVpp)的THD测量,这对硬件设计和算法实现都提出了极高要求。我在实际项目中遇到过类似场景,当时最大的感受是:限制条件越具体,越考验工程师的底层功底。
这道题的核心难点集中在三个方面:首先是ADC采样精度的把控。当输入信号低至30mVpp时,TI MCU片内ADC的量化噪声会显著影响测量结果。实测发现,MSP432P401R的14位ADC在3.3V参考电压下,1LSB约为0.2mV,这意味着30mVpp信号的动态范围仅剩150个量化等级。其次是谐波分析算法的实时性要求。题目规定10秒内完成测量,这就要求FFT运算和THD计算必须高效。最后是手机端数据显示的稳定性,需要通过蓝牙或Wi-Fi实现低延迟通信。
根据题目要求,我们只能使用TI MCU及其片内ADC。经过对比测试,我推荐两款芯片:
实测中发现一个关键细节:ADC参考电压的稳定性直接影响THD测量精度。建议使用REF5025等精密基准源,而非MCU内置的参考电压。某次比赛中,我们因使用内部参考导致THD误差超标2%,这个教训值得警惕。
小信号放大需要特别注意噪声控制,我的电路方案如下:
c复制// 信号调理关键参数示例
#define GAIN_STAGE1 10 // 第一级仪表放大器增益
#define GAIN_STAGE2 3 // 第二级可编程增益
#define HPF_CUTOFF 800 // 高通滤波器截止频率(Hz)
硬件设计中有三个"死亡陷阱":
题目限定分析5次谐波,这让我们可以优化FFT点数。我的经验公式是:
code复制FFT点数N = 采样率/(基频/分辨率)
例如:基频1kHz,要求分辨率10Hz,则N=采样率/100
实际代码中采用基4-FFT算法比常规基2算法快30%:
c复制void radix4_fft(float *x, float *y, int n) {
// 具体实现省略...
// 关键技巧:使用查表法加速旋转因子计算
}
题目定义的THD公式与IEEE标准略有不同:
code复制THD = sqrt(U2² + U3² + U4² + U5²) / U1
其中Un是第n次谐波的幅值。这里有个易错点:必须对FFT结果进行幅值校正,因为矩形窗会导致频谱泄漏。我常用的校正方法是:
推荐使用BLE5.0的自定义GATT服务,帧格式如下:
| 字节 | 内容 | 说明 |
|---|---|---|
| 0 | 帧头(0xAA) | 数据包起始标志 |
| 1-4 | THD值 | IEEE754浮点数格式 |
| 5-8 | 基波幅值 | 归一化值 |
| 9-12 | 二次谐波 | 归一化值 |
在Android Studio中处理BLE数据时,要注意:
BluetoothGatt.CONNECTION_PRIORITY_HIGHByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getFloat()建立三级校准体系:
不同MCU的性能差异明显:
| 型号 | 采样率 | THD误差(1kHz) | 功耗 |
|---|---|---|---|
| MSP432P401R | 1MSPS | 0.8% | 12mA |
| TM4C123GH6PM | 500kSPS | 1.2% | 18mA |
| CC1352P | 200kSPS | 2.5% | 9mA |
在最终调试阶段,我们发现电源纹波是影响THD测量的隐形杀手。改用LDO稳压后,THD误差从1.5%降至0.7%。这个案例说明,高频系统的电源设计绝不能将就。