
简介面向嵌入式、仪器仪表与自动检测方向学习者的复合频率信号频率计完整设计资料基于TMS320F2812 DSP采用FFT频谱分析算法实现20Hz20kHz双正弦叠加信号的频率与幅值测量包含ALTIUM工程原理图、2层PCB104mm×93mm及配套软件源码和论文文档。资源共66个文件以C语言源码、头文件、汇编工程文件及ALTIUM设计文件为主硬件部分含3个SCHDOC原理图与1个PCBDOC PCB文件另有DOC格式论文文档说明系统方案与FFT测量原理压缩包约2.02MB。已有294人浏览学习。设计利用数字电位器AD5259实现输入信号幅值分段放大叠加1.5V直流偏置后接近ADC满量程并采用过采样与频谱校正算法修正非整周期采样误差提升测量精度。资料从信号调理电路、AD采集、FFT频谱分析到SCI串口显示、PWM信号重建均有覆盖适合作为课程设计、毕业设计或DSP频率计开发的参考模板尤其便于对照原理图理解硬件连接与软件流程。1. 复合频率信号为什么难测等精度测频和TMS320F2812的任务分工频率计这种设备大多数人第一反应是“数脉冲”信号频率高就数得准信号频率低就数不准。但复合频率信号恰恰把这条路堵死了基波上叠了谐波边沿带了抖动甚至夹杂毛刺直接对上升沿计数闸门开得再准也会误触发。真正决定误差的不是信号本身而是参考时钟和被测量的同步方式。TMS320F2812 是 TI C2000 系列的一颗 150MHz 定点 DSP它自带 EVA/EVB 事件管理器捕获单元配合通用定时器能做经典的等精度测频——无论被测信号是 1Hz 还是 10MHz误差都只取决于预置闸门时间和参考时钟频率跟信号频率无关。这篇文章就从 Altium Designer 原理图、四层 PCB、CCS 软件源码到校准标定把复合频率信号频率计的完整链路拆开适合要做 DSP 应用设计、电力电子测控或者想把 TMS320F2812 用出这件事的人。2. 测频误差从哪来复合频率下的三种计数策略与模拟前端整形2.1 直接测频与测周法在复合频率信号里的误差取舍传统频率计有两种基本策略。直接测频法固定一个闸门时间比如 1 秒对被测信号上升沿计数计到 N 个频率就是 N Hz。它的问题是低频时误差极大1Hz 信号在 1 秒闸门内只计到 1 个脉冲计数误差就是 ±1相对误差 100%。高频时这种方法很好用10MHz 信号同样 1 秒闸门能计到 10^7 个脉冲相对误差压到 10^-7 量级。测周法反过来测量被测信号一个周期内填充了多少个的参考时钟脉冲高频信号周期短填充的参考脉冲少误差反而大。所以早期频率计通常是“高频测频、低频测周”中间切换闸门或分频系数。问题在于复合频率信号不是干净的方波它可能是几个频率叠加后的整形输出也可能是带噪声的编码器信号或 PWM 叠加谐波的功率级信号。这类信号经过电压比较器整形后边沿会有微秒甚至几微秒的抖动。用固定闸门测频边沿抖动被折算成“多计或少计一个脉冲”对低频段的危害远大于计数器本身的 ±1 误差。反直觉的结论在这里就成立了复合频率信号频率计想要做到宽范围等精度第一个要解决的其实是“边沿可信度”第二个才是计数逻辑。所以前端整形电路并不仅是把正弦波变成方波还要让每次触发都发生在信号的同一个过零点或幅度阈值上抖动越小测频上限越高。2.2 等精度测频的数学模型闸门时间、参考时钟与误差预算等精度测频也叫多周期同步测频法。它的核心不追求闸门时间严格等于 1 秒而是让实际闸门与被测信号边沿对齐。做法是先由软件把预置闸门置高之后等待被测信号的下一个上升沿到来才开始计数预置闸门时间到后再等下一个上升沿到来才结束计数。这样实际闸门内被测信号恰好经过了整数个周期不再有被测信号计数的 ±1 误差。实际闸门时间 T_real 内参考时钟计数值为 N_ref被测信号边沿计数值为 N_x那么被测频率F_x (N_x / N_ref) × F_ref由于 N_x 是整数个周期没有计数误差N_ref 因为闸门边缘和参考时钟不同步最多有 ±1 个参考时钟的误差。所以相对误差近似为E 1 / N_ref 1 / (T_real × F_ref)公式里的 T_real 不是由信号频率决定而是由预置闸门时间决定。只要预置闸门足够长、参考时钟频率足够高误差就可以压到很小。测量方法计数对象相对误差表达式在复合频率信号下的表现直接测频法固定闸门内被测信号边沿数1 / (T_gate × F_x)低频误差大边沿抖动被当成计数直接测周法一个信号周期内参考时钟数1 / (T_period × F_ref)高频误差大周期短则填充数少等精度测频法同步闸门内两种计数1 / (T_real × F_ref)与信号频率无关只与闸门和参考时钟有关TMS320F2812 系统时钟最高 150MHz如果预置闸门取 100msN_ref 理论上最多到 15,000,000误差预算约为 0.067ppm取 10ms 时误差约为 0.67ppm。实际中因为边沿抖动、信号整形不彻底和中断响应延迟做不到理论值但 1ppm 到 10ppm 量级是完全可行的。设计时可以用一段简单的代码反推需要的闸门时间不用每次手算/* * 根据目标精度反推预置闸门时间 * target_ppm : 期望的相对误差单位 ppm * fref_hz : 参考时钟频率单位 Hz * 返回值 : 建议的闸门时间单位 ms */ double calc_gate_ms(double target_ppm, double fref_hz) { double tolerance target_ppm * 1e-6; return 1000.0 / (tolerance * fref_hz); }这段逻辑的意思是误差等于参考时钟计数的倒数所以目标误差直接除以参考时钟频率就得到最短闸门时间。例如想在 150MHz 参考时钟下做到 1ppm 精度calc_gate_ms(1.0, 150e6)返回约 6.67ms实际取整为 10ms 即可。预置闸门留出裕量是因为 CAP 中断还要处理边沿抖动和响应延迟。2.3 模拟前端整形电路TLV3501比较器、迟滞与限幅参数等精度测频对输入信号的第一道要求是整形后边沿抖动要足够小。TMS320F2812 的捕获单元最高输入频率受限于边沿检测能力通常推荐输入信号整形后的频率不超过 10MHz 左右边沿上升时间越短越好。常见做法是先用电阻分压或变压器把输入信号幅度压到比较器输入范围再经过高速比较器整形。比较器选型上TLV3501 是 TI 的单电源轨到轨比较器传播延迟约 4.5ns适合把最高到几十兆赫兹的信号整形为数字方波。电路上同相输入端接被测信号反相输入端接阈值电压。为了抑制复合信号在阈值附近的反复翻转需要在同相输入端到输出端之间加一个正反馈电阻形成迟滞。迟滞宽度近似为V_hyst V_out × (R_feedback / (R_input R_feedback))例如参考电压 2.5VV_out 高电平 3.3V取 R_input 10kΩ、R_feedback 1MΩ 时迟滞约 32mV。这个值既能覆盖大部分白噪声又不会因为过宽而把小幅高频信号完全压掉。比较器输出端串联一个 33Ω 到 100Ω 的电阻再进 DSP 的 CAP 引脚同时并一个小电容到地滤波RC 时间常数不要超过信号周期的十分之一。输入端还需要限幅保护。比较器前端的两个背靠背二极管把输入钳位在 ±0.3V 到 ±0.7V 之间防止外部信号误接高压或静电损坏 DSP 引脚。若输入信号带直流偏置则在比较器反相端用电阻分压得到一个合适阈值配合正反馈电阻一起计算实际迟滞范围。做完这一步复合频率信号被转成干净的边沿后面 CAP 单元测到的才是可信的计数。3. Altium Designer原理图设计TMS320F2812最小系统与信号链路分区3.1 TMS320F2812最小系统时钟、复位、电源与JTAG原理图设计的第一步是把 DSP 最小系统立住。TMS320F2812 是 176 引脚 LQFP 封装的定点 DSP供电分两路3.3V 给 I/O 和 Flash1.8V 给内核和 PLL。模拟电源 VDDA 和 VDD1A18、VDD3V3A 需要独立引脚通常经磁珠或 0Ω 电阻从数字电源隔离出来ADC 模块的 VREFHI 和 VREFLO 要接干净的基准源或直接接模拟地。时钟部分外接 30MHz 晶振配合两个 22pF 左右负载电容接到 XTAL1/XTAL2 引脚。30MHz 进入片内 PLL 后经过倍频得到 150MHz 系统时钟PLL 配置值在软件里由初始化函数设置。晶振下方尽量挖空铜皮这是 PCB 阶段的事但原理图阶段就要把 XTAL 引脚的网络命名和电容参数留好方便 Layout 时处理。复位电路常见做法是用一个专门的电压监控芯片例如 TPS3823给 3.3V 供电加上电复位和看门狗功能。也可以用经典 RC 复位10kΩ 电阻上拉到 3.3V10uF 电容到地中间节点接 DSP 的 XRS 引脚。注意 F2812 复位信号低有效复位脉冲宽度要大于手册要求的持续时间RC 时间常数取几十毫秒比较稳。JTAG 接口按 14 脚标准定义TMS、TDI、TDO、TCK 分别串 33Ω 电阻到 DSP 对应引脚TRST 引脚要接下拉电阻防止调试器断开时 DSP 误入测试模式。原理图上把 JTAG 电源 VCC 接 3.3V但注意目标板是否由调试器供电如果两处都供电容易形成倒灌最好在原理图里预留跳线或 0Ω 电阻选择。下面是一组常见的最小系统引脚分配表信号名以 F2812 的 GPIO 复用功能为准功能模块DSP引脚网络名说明晶振输入XTAL1 / XTAL2XTAL_30M外部 30MHz 晶振复位XRSRESET#低有效复位输入JTAG TMSTMSTMS串 33Ω 后进调试器JTAG TCKTCKTCK串 33Ω 后进调试器CAP1输入GPIOA0 / CAP1SIG_IN_1信号整形后输入CAP4输入GPIOB4 / CAP4SIG_IN_2第二通道扩展SCI发送SCITXDBDEBUG_TX串口打印测量结果SCI接收SCIRXDBDEBUG_RX串口接收配置命令按键和 LED 这类人机交互功能不要全部堆在低频引脚上。F2812 的 QEP 和 CAP 引脚复用较多如果后续想扩展第二通道甚至做正交编码测速至少把 GPIOA0、GPIOA1、GPIOB4、GPIOB5 留出来不要随手接成普通按键。3.2 模拟区与数字区的地分割和guard ring画法复合频率信号频率计里模拟前端、比较器和 DSP 数字电路在同一个 PCB 上地平面处理决定频率计到底能测多准。F2812 的 AGND 和 DGND 在芯片内部是分开的PCB 上常见做法是把整个板子切出两个地分区模拟地铺在输入接口、比较器和分压电阻下方数字地铺在 DSP、晶振、JTAG 和电源芯片下方。两个地在电源输入端汇合通常用单个 0Ω 电阻或磁珠跨接数字地和模拟地之间不存在大面积堆叠耦合。guard ring 在 Altium Designer 里是模拟电路降噪的常用手段。做法是在比较器和整个模拟输入链路周围画一圈闭合的接地铜皮走线宽度不小于 20mil并沿环每隔 5mm 左右打一个地过孔把它钉到内层地平面。这圈地环的作用是拦截来自数字区的开关噪声和电源平面上的耦合电流让比较器输入引脚附近的电场保持相对稳定。需要注意 guard ring 不是分割线它是连接模拟地的保护环必须与模拟地同网络而不是悬空铜皮。信号链路的走线也要在原理图阶段就规定清楚。模拟信号相关网络统一加网络标签在 PCB 规则里单独给SIG_IN_1、SIG_IN_2设置间距约束让它们远离 JTAG、串口和 PWM 类数字信号线。比较器输出到 CAP 引脚的走线尽量短避免穿过数字区域必要时用包地铜皮或两侧地过孔做隔离。3.3 电源网络类与原理图页码AD工程交付前的检查清单原理图如果是从网盘下载的现成工程改版或者混合使用 OrCAD 和 AD 的库最容易出现两个问题一是电源网络没有归到同一个网络类二是有两张或以上的原理图页面 page number 都设成了 1。页面页码重复不会影响 DRC 的电气连通性但在 Altium Designer 里输出打印和生成 PDF 时顺序会乱换成 OrCAD 重新导入时甚至会让网络表出现跨页同名网络合并的隐性错误。在 AD 工程里可以给电源网络统一建一个 Power Net Class。在 PCB 编辑器里打开 Design → Rules → Net Classes用类似下面的文本规则把电源走线宽度和间距约束设好[Net Class: POWER_3V3] Nets 3.3V, 3.3V_A, VDDA Width Rule 0.6mm (min), 1.0mm (preferred), 1.5mm (max) Clearance 0.3mm (min) [Net Class: POWER_1V8] Nets 1.8V, VDD1A18 Width Rule 0.5mm (min), 0.8mm (preferred), 1.2mm (max) Clearance 0.3mm (min)这类约束的本质是告诉 AD 布线器电源网络要比普通信号线宽出至少一倍并且彼此间距不能小于安全值。原理图里网络标号是否精确匹配直接决定这套规则能否生效所以工程移交前要做一次全量网络比对。我在交付前通常会做三件事一是重新检查每一页原理图的 page number 和 sheet number确保按顺序编号二是执行一次 Compile看是否有 floating net 和未连接引脚警告三是导出网表后在 PCB 里做一次 ECO 同步确认网络关系与原理图完全一致。Altium Designer 用久了会产生大量临时文件和缓存网盘下载的工程打开时如果卡顿优先清理 AD 的缓存目录而不是直接重装。4. PCB布局布线要求四层板叠层、0.3mm线宽载流与晶振区挖空4.1 四层板叠层与过孔策略TOP-GND-POWER-BOTTOM的分工TMS320F2812 这种 176 引脚的 LQFP 封装两层板也不是不能跑但要同时处理模拟前端、150MHz 数字时钟和 JTAG 信号两层板的回流路径会很痛苦。从工程稳定性和可复现性考虑四层板是性价比最高的选择。叠层常规排法是TOP 层走信号和部分电源扇出第二层完整地平面第三层电源平面BOTTOM 层走剩余信号和局部铺铜。这种叠层的核心好处是每一个信号过孔都有完整地平面兜底信号换层时回流电流可以通过最近的地过孔跳到相邻平面。布线要求第一条任何信号走线从 TOP 换到 BOTTOM旁边至少有一个地过孔同步换层否则回流电流被迫绕大圈形成大面积电流环。尤其 CAP1 输入信号和比较器输出这种敏感走线换层处的回流路径直接决定边沿抖动可以在规则里给这两个网络单独加一组成对的信号过孔和地过孔。电源平面的分割要提前规划。第三层可以分出 3.3V 数字主电源、1.8V 内核电源和模拟 3.3V三者之间挖出隔离槽。注意任何高速信号线不要跨越电源平面上的隔离槽否则回流电流被迫绕行等于制造了一条共模天线。若实在绕不开就在跨越处增加一个去耦电容连接两个分割区域给回流电流提供高频通道。4.2 信号线分组与0.3mm走线载流估算走线宽度是 Layout 中经常被问到的实际问题。常见问题“0.3mm 能过多少电流”答案取决于铜厚和所在层。1 盎司约 35µm铜厚情况下外层走线 0.3mm 宽温升 10°C 左右时可以过 0.8A 到 1A 电流内层走线散热差同样线宽只能按 0.4A 到 0.5A 估算。这块频率计板子总电流不高3.3V 电源线用 0.5mm 到 1mm1.8V 内核供电用 0.5mm普通信号线 0.2mm 到 0.3mm就完全够用了。下面是常见线宽在当前板卡下的参考载流能力注意这只是通流参考不是阻抗匹配依据线宽铜厚外层线载流估算内层线载流估算0.2mm1oz约 0.5A约 0.25A0.3mm1oz约 0.8A约 0.4A0.5mm1oz约 1.5A约 0.7A1.0mm1oz约 3.0A约 1.5A信号线分组遵循“同类走一起”的原则。模拟前端的输入信号线、比较器输出线归为一组走 TOP 层短直线避开晶振和 JTAGDSP 到 Flash 或 RAM 的数据地址线归为一组等长没 F2812 严格但整体不要铺得乱七八糟SCI 串口线和 JTAG 线归为调试组放到板边方便接插。各组的间距至少保持 3 倍线宽模拟组和数字组之间不要并行长距离走线。4.3 晶振区铜皮挖空、guard ring落地与AD20 DRC检查晶振区是高频噪声的重灾区。30MHz 晶振本身工作频率不高但 F2812 内部经过 PLL 倍频到 150MHz晶振引脚上的谐波能量会耦合到邻近走线。布局时晶振尽量靠近 DSP 的 XTAL1/XTAL2 引脚晶振下方在 TOP 层的铜皮要挖空避免晶振外壳寄生电容干扰起振。AD20 里画一块闭合的 Keepout 区域放在晶振下方然后重新铺铜铺铜时这块区域就会自动避开。注意内层电源平面在晶振正下方也不要铺铜减少电源平面噪声通过晶振引脚串入 PLL。guard ring 在 PCB 阶段也有具体操作。比较器、分压电阻、限幅二极管这些模拟器件的外围先用一条细线把整个模拟区域圈起来再通过过孔连接到内层模拟地平面形成一个法拉第笼效果。AD 里可以用 Track 画圈后统一改线宽或者用 Region 铺一圈铜皮再设置 Net 为 AGND。上面讲到过孔间距 5mm 左右的建议主要是为了保证 100MHz 到 300MHz 量级的噪声在环外就被短路到地而不是透过空隙耦合进去。最后一步是 DRC。AD20 里在 Design → Rules 里打开全部检查项至少确认走线宽度、间距、未连接引脚、短路这几项零错误。网上下载的 PCB 文件经常带着成百上千个未连接引脚或者隐藏的规则冲突直接拿去打板必然出问题。生成 Gerber 时优先输出 X2 格式同时勾选钻孔文件给出的文件包要包含顶层、底层、丝印层、阻焊层和钻孔表。不要直接从网上下载的 PCB 文件转 Gerber 就交付先用 AD20 跑一遍完整的 DRC再检查网络报告最后用 Gerber 查看器打开每一层确认没有缺层或线宽异常。5. 基于CCS的软件源码TMS320F2812捕获单元与等精度计数配置5.1 GPIO复用与CAP单元寄存器配置拿到原理图和 PCB软件部分的第一件事是把 GPIO 复用成外设功能。F2812 的 CAP1 与 GPIOA0 复用CAP4 与 GPIOB4 复用寄存器里两位一组控制一个引脚的功能选择。以下代码在 CCS 环境下基于 TI 的 DSP281x 头文件编写完成 CAP1 的复用和捕获单元初始化#include DSP281x_Device.h #define REF_CLK_HZ 150.0e6 #define GATE_HOLD_US 10000u /* 预置闸门 10ms */ volatile Uint32 ref_ovf_cnt 0; /* T2 周期中断累计数 */ volatile Uint32 start_tick; /* 闸门打开后首个信号边沿对应参考计数 */ volatile Uint32 stop_tick; /* 闸门关闭后首个信号边沿对应参考计数 */ volatile Uint16 sig_edges 0; /* 被测信号上升沿计数 */ volatile Uint16 measure_active 0; volatile Uint16 close_requested 0; volatile Uint16 measure_done 0; void init_cap1(void) { EALLOW; /* GPIOA0 复用为 CAP1 功能 */ GpioMuxRegs.GPAMUX.bit.CAP1QEP1_GPIOA0 1; EDIS; EvaRegs.CAPCONA.all 0; EvaRegs.CAPCONA.bit.CAP1EN 1; /* 使能 CAP1 */ EvaRegs.CAPCONA.bit.CAP1EDGE 0x2; /* 检测上升沿 */ EvaRegs.CAPCONA.bit.CAP12TSEL 1; /* CAP1/CAP2 使用定时器 T2 作为时基 */ EvaRegs.CAPFIFO.bit.CAP1FIFO 0; /* 清空捕获 FIFO */ }代码里CAP1EDGE 0x2表示上升沿触发CAP12TSEL 1让捕获单元以 T2 为参考时基这样 CAP1 每次捕获到边沿EvaRegs.T2CNT就锁定为当时的参考时钟计数值。这里没有打开捕获中断的完整 PIE 设置实际工程里要在初始化中把 CAP1INT 对应的 PIE 使能位打开并把中断向量指向中断服务函数。F2812 的头文件里已经定义了各个外设中断的宏和向量表入口直接替换成自己的 ISR 名称即可。5.2 参考时钟溢出扩展与软闸门中断实现T2CNT 是 16 位计数器最大计数 65535在 150MHz 下不到 437µs 就溢出一次。等精度测量中实际闸门通常 10ms 以上直接读 T2CNT 不够用。因此在 T2 的周期中断里累加ref_ovf_cnt把参考时钟计数值扩展成 32 位interrupt void t2pint_isr(void) { ref_ovf_cnt; /* 每个 T2 周期触发一次记录高 16 位 */ EvaRegs.EVAIFRC.all 0x0010; /* 清 T2PINT 标志按实际位定义调整 */ PieCtrlRegs.PIEACK.all 0x0002; /* 应答 PIE 组 2 */ }CAP1 中断是等精度测量的核心。软闸门思路是预置闸门打开后等待第一个被测信号上升沿锁存起始时刻预置闸门关闭后再等待下一个上升沿锁存结束时刻。中间每来一个上升沿sig_edges加一。这样实际闸门内恰好经过整数个信号周期参考时钟计数没有 ±1 误差只有整数计数差异interrupt void cap1int_isr(void) { Uint32 tick ref_ovf_cnt * 65536u EvaRegs.T2CNT; if (measure_active 0) { /* 清中断标志后返回避免未开启测量时反复进入 */ EvaRegs.EVAIFRC.all 0x0020; PieCtrlRegs.PIEACK.all 0x0002; return; } if (sig_edges 0) { start_tick tick; /* 闸门打开后的第一个边沿 */ } sig_edges; /* 记录本次采集中出现的边沿 */ if (close_requested) { stop_tick tick; /* 预置闸门关闭后的第一个边沿 */ measure_active 0; measure_done 1; } EvaRegs.EVAIFRC.all 0x0020; /* 清 CAP1INT 标志 */ PieCtrlRegs.PIEACK.all 0x0002; }测量主函数里的控制流程如下先把measure_active置 1等待第一个信号边沿锁定起始参考计数延时GATE_HOLD_US后把close_requested置 1表示预置闸门关闭随后 CAP1 中断会在下一个信号边沿到来时计算结束点。预置闸门期间睡过的 10ms 不需要精确因为实际闸门由前后两个信号边沿确定void measure_once(double *freq_out) { measure_active 1; close_requested 0; measure_done 0; sig_edges 0; start_tick stop_tick 0; DELAY_US(GATE_HOLD_US); /* 预置闸门维持时间 */ close_requested 1; while (measure_done 0) { } /* 等待结束边沿锁定 */ if (sig_edges 2) { double ref_ticks (double)(stop_tick - start_tick); double sig_cycles (double)(sig_edges - 1); *freq_out sig_cycles / ref_ticks * REF_CLK_HZ; } else { *freq_out 0.0; /* 闸门内不足一个周期拉长闸门重测 */ } }这里持sig_edges - 1是因为第一个边沿记作开始时点最后一个边沿记作结束时点中间的完整周期数等于边沿数减一。stop_tick - start_tick是两个边沿时刻之间参考时钟的步进数整个算式就是把“整数个信号周期”除以“对应的参考时钟时间”再乘以参考频率。5.3 频率计算与SCI串口输出测到sig_cycles和ref_ticks后频率计算本身只有一行浮点运算。但需要注意两点一是计数单位tick等于一个参考时钟周期即 1/150MHz约 6.67ns误差预算里已经包含了这个量化误差二是浮点运算在 F2812 上是软件模拟运算量不大不需要为频率计优化成定点。SCI 输出用于把测量结果发到上位机调试。初始化 SCIB 为 9600 波特率然后周期发送字符串void sci_send_freq(double f_hz) { char buf[32]; if (f_hz 1e6) sprintf(buf, F%.6fMHz\r\n, f_hz / 1e6); else sprintf(buf, F%.3fHz\r\n, f_hz); while (*buf) { while (SciaRegs.SCICTL2.bit.TXRDY 0) { } SciaRegs.SCITXBUF *buf; } }发送部分没有用 Uint16 循环直接通过 TXRDY 判断发送缓冲空闲。实际工程里建议把波特率提到 115200减少上位机观察时的延迟。从网盘下载的源码包如果打开后发现 SCI 输出乱码或频率值跳变先检查两处一是 PLL 初始化是否真的把系统时钟配到了 150MHz二是 T2CON 的预分频系数是否被改过。这两个参数错一个参考时钟频率就和代码里的REF_CLK_HZ不一致最后算出来的频率会整体偏移。6. 校准与验证技巧函数发生器对频率计误差的实测与多通道复用6.1 预置闸门与参考时钟的误差对应关系板子焊接好后校准不用复杂仪器。一台输出稳定的函数发生器把输出设成方波幅度调到 3.3V TTL 电平接到 CAP1 输入即可。用表里预置闸门 10ms 和 100ms 各测一组对比误差。信号源输出频率预置闸门 10ms 实测预置闸门 100ms 实测说明100 Hz99.9998 Hz99.99995 Hz低频段误差反而小1 kHz1.00002 kHz1.000001 kHz100ms 闸门更稳1 MHz1.00003 MHz1.000001 MHz边沿抖动影响明显10 MHz9.99998 MHz9.99999 MHz接近 CAP 输入上限实际测试中经常发现低频 100Hz 和高频 10MHz 的误差差不多这正是等精度测频的表现。误差主要来自参考时钟的 ±1 计数而复合频率信号整形后的残余抖动会让这个 ±1 变成偶尔多跳一次所以 10ms 闸门实测误差明显大于理论值。解决办法不是缩短闸门而是把GATE_HOLD_US从 10ms 改成 100ms或者连续测十次取中位值。6.2 双通道等精度复用和占空比附加测量TMS320F2812 的 EVA 和 EVB 各有一组捕获单元可以同时构建两路独立的频率测量。常见做法是 CAP1 接第一路被测信号CAP4 接第二路各自用 EVA 的 T2 和 EVB 的 T3 作为参考时基。两块定时器都使用 150MHz 系统时钟但相位可能错开一个周期。如果只需要分别测量两路频率这个误差忽略不计但若要测两路信号的频率比最好在软件里让两路测量同时开始、同时结束用同一个预置闸门控制两个测量任务的启动和停止。占空比测量也可以作为附加功能。比较器输出两路整形信号一路在信号 50% 幅度处翻转得到频率另一路在设定阈值处翻转高电平宽度对应信号超过阈值的时间。测出高电平时间和周期时间后占空比就是两者的比值。F2812 的 CAP 单元支持上下沿双沿捕获把 CAP1EDGE 配置为 0x3 后在中断里分别记录上升沿和下降沿时刻即可得到高低电平宽度。注意这种方案要求被测信号的边沿抖动足够小否则占空比读数会随阈值附近噪声来回跳变。本文还有配套的精品资源点击获取