ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于过零检测的单片机相位计设计与实现

基于过零检测的单片机相位计设计与实现 简介基于单片机的相位计设计资料包面向电子、通信类毕业设计学生与嵌入式初学者完整覆盖从理论分析到软硬件实现的全过程。资料以相位差测量为核心包括输入信号调理电路、显示模块、接口电路、电源管理等硬件方案以及ADC采样、FFT数字信号处理、相位计算、交互界面等软件实现思路适合作为课程设计或毕设的参考框架。包内共36个文件大小4.41MB以PDF论文与DOC文档为主另有C/H源代码、Keil工程文件、原理图、Hex烧录文件、元器件数据手册及波形图等。论文部分涵盖多种相位测量方法原理图便于理解硬件连接源程序可直接参考或二次开发。目前已有56人学习下载对于希望快速搭建原型并撰写论文的学生来说可直接复用其中的设计文档、代码与参考论文节省查阅和整理资料的时间同时也能借助完整的软硬件配套材料深入掌握单片机的实际工程应用。1. 相位计用单片机测的是什么为什么能成毕业设计两个同频正弦信号之间的相位差用示波器看最直观但要把这个量做成一台能自动读数、能连续显示、还能写进论文里的仪器很多人第一反应是加上一大片模拟电路。实际把方案做下来会发现精度上限最先卡在过零比较器前面的运放和电阻上单片机定时器只是把两路信号过零点的相对时间差读出来测相位这件事就完成了。这个标题覆盖的是一条完整信号链前级放大整形、相位差提取、定时器捕获、软件校准以及用于存档和答辩的测试数据。适合电子与自动化方向的课程设计、毕业设计也适合初入行的嵌入式工程师理解一台“测量系统”的完整长相。2. 相位差测量原理过零检测与 FFT 两条路线怎么选2.1 过零检测法把相位差折算成时间差两路同频正弦波过零点在时间轴上错开 Δt周期为 T则相位差 φ 360° × Δt / T。单片机能直接量到的只有电平和时间所以常见做法是把正弦波经过比较器整形成方波再用单片机的输入捕获功能记录上升沿的定时器计数值。只要两路信号频率相同这个映射关系就严格成立频率不同时“相位差”没有定义仪器应该提示频率超出量程而不是给一个随机数。设计时先定量程再选器件。比如输入频率 10Hz~50kHz定时器计数频率 72MHz在 50kHz 时每个周期只有 1440 个计数量化相位分辨率 0.25°这个量级已经接近过零抖动的影响在 10Hz 时有 720 万个计数量化误差几乎可以忽略。如果用的是 51 单片机的 12MHz 主频且没有硬件捕获计数频率只能到 1MHz 左右50kHz 下只剩 20 个计数此时必须靠外部计数或更高主频来撑这也是后面软件设计中优先推荐带输入捕获的 32 位定时器的原因。2.2 FFT 相位谱方法把问题从时域搬到频域另一条思路是对两路信号分别做 ADC 采样得到离散序列后做 FFT取出基波分量的复数表示相位就是 atan2(imag, real)。两路信号的基波相位相减得到相位差。FFT 法不需要整形电路波形畸变、带谐波时仍然能锁定基波相位代价是需要较高的采样率和足够的样本点数计算量大STC89C52 这类 8 位机跑得很吃力用 STM32 时也要考虑是定点 FFT 还是浮点 FFT。教学项目里 FFT 方案还有一个实际难点很难向答辩老师讲清楚整周期采样和频谱泄漏的关系而过零检测用一条波形图就能说明白。两者并不互斥频率较高或者信号噪声大时可以用 FFT 做精测用过零检测做快速扫频。但就这个标题来说过零检测法硬件成本低、软件链路短更适合完整走一遍软硬件设计流程。2.3 两种方案的对比与选型结论对比项过零检测法FFT 相位谱法硬件开销运放、比较器不需要 ADC 采样保持需要较高采样率的 ADC 和缓冲电路可测频率上限受比较器带宽和捕获速度限制受 ADC 采样率和 FFT 点数限制抗噪声能力一般过零点抖动直接进入误差较强窗函数能抑制带外噪声对波形要求近似正弦或至少过零稳定周期信号皆可谐波不影响基波测量软件代码量少核心几十行较大需要傅里叶变换和定标误差校准难度简单线性拟合即可复杂要考虑采样同步和频谱泄漏从课程设计和大多数工程测量需求来看过零检测法结构最清晰、成本最低、校准最直观。下面的硬件和软件设计都按过零检测方案展开这也是这类设计最常见的落地路径。2.4 先定指标再选器件动手画原理图之前先写下一行目标量程 10Hz~50kHz相位显示分辨率 0.1°系统误差不超过 1°。这个目标决定了两件事比较器要有足够的压摆率双通道波形在过零点的传输延迟差要小定时器计数频率要足够高使量化误差远小于系统误差。量化引起的相位分辨率为 360° × f_signal / f_counter例如 f_counter 72MHz、f_signal 1kHz则分辨率约 0.005°已经足够。有这两项硬指标后芯片选型就明确了优先选带输入捕获的 32 位定时器比如 STM32 的 TIM2、TIM5因为 32 位计数器在 72MHz 下约 60 秒才回绕低频信号一个周期内不会溢出如果必须用 16 位定时器或 8 位单片机就要另写溢出补偿。这段分析写进论文的“可行性分析”一节能直接撑起一部分字数。3. 硬件设计前级调理、整形和输入捕获接口3.1 硬件信号链的五个环节一张通用相位计硬件框图可以拆成五段输入保护、幅度调理、过零整形、相位差提取、单片机测量与显示。输入保护用两个背靠背二极管把信号钳位在电源轨内防止误接高压幅度调理的任务是把 0.1V~5V 的可变输入统一到比较器合适的输入电平比较器整形把正弦波变成方波如果采用异或门方案这里还要加一个 74HC86最后方波直接进单片机定时器捕获通道。屏幕和按键挂在外设总线即可。比较重要的是调理与整形的接口。常见做法是用 LM393 搭施密特触发器正反馈电阻取 10kΩ~100kΩ反馈比例决定滞回窗口。滞回窗口太小时噪声会让方波边沿反复抖动太大时过零点会被偏移造成一个固定的相位误差。一般把窗口设在 20mV~50mV 之间再配合软件平均效果比单纯追求窄窗口更好。想省掉运放的话也可以用带滞回的比较器直接接受信号但输入阻抗和幅度适配会差一些。3.2 幅度适配的两种做法手动增益与自动增益输入幅度范围较宽时固定增益放大会导致小信号不足、大信号削顶。最稳的教学做法是级联一个运放做 0~20dB 可调增益用电位器手动校准工程上常用可变增益放大器或程控增益但成本和电路复杂度高很多。以 STM32 为核心的方案也可以干脆不做大幅放大而是用两路比较器加基准电压产生方波因为相位测量只关心过零点不关心幅度。这里要提醒一个常见误区不要把正弦波直接接单片机引脚。单片机输入引脚通常带施密特触发但输入范围不能超过 VDD负半周会通过引脚内部二极管漏电长期使用容易损坏。所以哪怕信号已经是干净的方波也要先经过串联电阻和钳位二极管再进 MCU。硬件调试时如果发现捕获通道计数异常首先用示波器确认引脚处已经变成 0~3.3V 的方波而不是原始正弦波。3.3 双通道捕获 vs 异或门测脉宽相位提取有两条路可走。一条是把两路整形后的方波直接接到两个输入捕获通道在软件里做时间差减法这是推荐做法既省异或门还能同时测出周期另一条是把两路方波接进 74HC86 异或门输出脉冲宽度等于 Δt测量脉宽再除以周期。异或门方案单片机只用一路捕获但异或门输出不包含超前或滞后信息还要额外用一个 D 触发器判断方向硬件链路反而更长。以 STM32F103 为例定时器 TIM2 的 CH1 和 CH2 分别接基准信号和待测信号按键接 PB0、PB1LCD1602 数据线接 PC0~PC7RS 和 EN 接 PC8、PC9。这样分配可以避开捕获通道的共用引脚。引脚分配是硬件设计里最好改也最容易被忽视的一环布线前先在表格里过一遍功能复用否则做完板子才发现调试脚和捕获通道冲突只能飞线。MCU 引脚模块接口功能PA0基准信号整形输出TIM2_CH1 输入捕获PA1待测信号整形输出TIM2_CH2 输入捕获PB0 / PB1按键量程切换、校准模式PC0 ~ PC7LCD1602 D0~D7并口显示数据PC8 / PC9LCD1602 RS / EN显示控制3.4 最小系统与调试前的检查点单片机最小系统就是晶振、复位、电源去耦外加为调试预留的 SWD 或串口。STM32 用 SWD 时需要 PA13、PA1420 脚封装里这两个脚经常被占用布板前要确认。硬件调试顺序建议分三步先量电源再量比较器输出最后量捕获波形。比较器输出端如果出现明显振铃就在输出串联一个 100Ω 电阻如果出现多个上升沿就适当调大滞回窗口。Keil 环境里常见的坑集中在芯片型号和器件包上。工程建好后第一件事是确认 Device 里选的是实际芯片型号Pack Install 装的是对应系列否则编译通过但下载后不进调试、外设寄存器地址对不上的问题会浪费大量时间。这类问题与相位计本身无关但几乎每个调试现场都会遇到。4. 软件实现输入捕获、相位换算和自动量程4.1 定时器输入捕获初始化与中断读取软件的第一个任务是配置定时器让两路信号沿到来时硬件自动记录计数器的当前值。核心点是 PSC 预分频器分频值越大可测时间越长但相位分辨率越低。只要信号频率不低于 10Hz72MHz 计数频率下用 32 位计数器不会溢出因此 PSC 直接设 0不要为了“低频更稳”而分频。用寄存器写初始化代码更直观void Phase_Timer_Init(void) { RCC-APB1ENR | RCC_APB1ENR_TIM2EN; // 启动 TIM2 时钟 TIM2-PSC 0; // 计数频率 72MHz不预分频 TIM2-ARR 0xFFFFFFFF; // 32 位自由运行不回绕 TIM2-CCMR1 (0x01 0) | (0x01 8) // CH1、CH2 映射到输入引脚 | (0x0F 4) | (0x0F 12); // 输入滤波 16 个时钟周期 TIM2-CCER TIM_CCER_CC1E | TIM_CCER_CC2E; // 使能两路捕获 TIM2-DIER TIM_DIER_CC1IE | TIM_DIER_CC2IE; // 开捕获中断 NVIC_EnableIRQ(TIM2_IRQn); TIM2-CR1 | TIM_CR1_CEN; // 启动计时 }CCMR1 的低两位选择通道 1 的输入映射默认映射到 TI1高两位对应通道 2 映射到 TI2。输入滤波系数 0x0F 会把窄于 16 个计数时钟的毛刺滤掉以 72MHz 计算约 222ns远小于正常信号的过零沿宽度。PSC 保持 0确保每个信号周期的计数值尽量大即使测量 0.5Hz 超低频信号32 位计数器约 60 秒才回绕仍然不需要分频。提示PSC 只在定时器只有 16 位、且信号频率很低导致计数器反复溢出时才需要调整32 位计数器方案直接保持 0。中断服务程序里读取两个捕获寄存器并做差volatile uint32_t prev_ccr1, period_cnt, phase_delta; void TIM2_IRQHandler(void) { uint32_t ccr1 TIM2-CCR1; uint32_t ccr2 TIM2-CCR2; uint32_t sr TIM2-SR; if (sr TIM_SR_CC1IF) { // 基准信号上升沿 if (prev_ccr1) { period_cnt ccr1 - prev_ccr1; // 一个完整周期占用计数 phase_delta (int32_t)(ccr2 - ccr1); // 相对基准沿的时间差 } prev_ccr1 ccr1; } TIM2-SR 0; // 及时清标志 }这里利用的是 CH1、CH2 共享同一个计数器CCR2 里存的是最近一次待测信号边沿的时刻在基准沿到来时相减就得到 Δt 对应的计数值。phase_delta 声明为 int32_t因为待测信号可能比基准超前此时 CCR2 比 CCR1 小减出来是负数。如果两路信号频率不一致period_cnt 会不断变化软件里要做判断并提示频率超范围。4.2 相位差换算归一化与相位卷绕处理拿到 period_cnt 和 phase_delta 后换算公式为#include math.h float Phase_ToDegree(int32_t delta, uint32_t period) { float norm (float)delta / (float)period; // 先归一化到周期比例 norm norm - floorf(norm 0.5f); // 映射到 [-0.5, 0.5) return norm * 360.0f; // 转成角度 }这里必须做归一化取模不能直接乘 360。定时器自由运行时delta 可能因为超前或计数器回绕而多出若干个完整周期floorf 的作用是把整数周期部分剥掉只保留一个周期内的相位差。对 51 单片机这类没有浮点单元的环境可以改用整数取模delta 对 period 取余再线性映射到角度效果一样且更快。显示端用正负号区分超前和滞后0° 表示两路同相。平均滤波放在换算之后比较合适。常见做法是连续取 16 个相位值剔除一个最大值和一个最小值再对剩余 14 个求平均同时去掉过零抖动引起的尖刺和随机噪声。平均次数越多显示越稳定但刷新越慢一般刷新率做到 5 次/秒即可。4.3 自动频率跟踪与软件架构频率直接从 period_cnt 反推f 72MHz / period_cnt不需要额外测频电路。量程切换建议在软件里设两个阈值比如 period_cnt 小于 3600 提示高频超量程大于 720 万提示低频超时而不要频繁改写 PSC因为改预分频会让当前测量周期的计数基准变动产生毛刺数据。软件架构拆成三个模块capture 负责中断和时间戳phase_calc 负责换算和平均lcd_task 负责显示。主循环里用状态机依次执行“测量完成检查、相位计算、显示刷新”显示刷新用标志位触发不要在中断里直接操作 LCD否则中断时间长会导致丢捕获。这套结构在论文里画成三层框图比贴全部代码更有说服力。5. 误差校准、测试记录与论文素材组织5.1 误差来源与抑制措施把误差分清楚论文的测试部分就有了骨架。比较器传输延迟是固定偏差量级在纳秒级低频段折算到角度很小用软件校准即可过零抖动是随机误差通过施密特滞回和中位平均压掉定时器量化误差是系统误差和计数频率负相关PSC0 时已经压到最小。误差来源典型量级抑制办法比较器传输延迟ns 级固定偏差软件零点校准过零抖动0.1°~1° 随机滞回窗口 中位平均定时器量化0.005° 1kHz / 72MHzPSC0用 32 位计数器双通道不对称随元器件而异分压电阻选 1% 精度5.2 标定步骤用信号源建立入射-测量表标定不需要精密相位基准一台双通道信号发生器就够。把两个通道设为同频正弦波先让两路同为 0°记录显示值作为零点偏差再依次设置 30°、60°、90°、180°记录每个点的多次平均值。对设定值和实测值做线性拟合得到 y kx b把 k 和 b 存入 EEPROM。之后每次测量先做反变换相位显示误差一般能压到 1° 以内。不要只标一个频率。比较器延迟和运放相位偏移随频率变化至少要取 100Hz、1kHz、10kHz 三个频率点分别标定论文里把三个频率的 k 和 b 列成一张小表比单纯写“误差小于 1°”更有说服力。5.3 论文的测试表格应包含哪些列测试记录表建议这样设计设定相位、被测信号频率、输入幅值、显示相位 5 次、标准差、最大绝对误差。多次读数能体现随机波动标准差说明稳定性最大绝对误差对应系统误差。每个频率点的表格后补一段文字选一个最大偏差解释来源比如“1kHz 时最大偏差出现在 150°主要由滞回窗口不对称导致”这种写法比空泛的“结果满足要求”可信得多。论文技术章节不要贴全部代码流程图加一段关键输入捕获代码就足够。答辩要查的是实际测试记录和标定数据这些原始素材一定要留档用固定移相器复测 0°、90°、180° 三个点后把屏幕照片和信号发生器设置界面一起存好被问到误差来源时直接翻对应的记录页说“该点是 xx 误差主导”。本文还有配套的精品资源点击获取
返回列表