基于PIC18F4550 CCP捕获模式的脉冲宽度测量程序故障排查
PIC18F4550 CCP捕获模式脉冲宽度测量故障排查
现存代码核心问题
- 中断配置存在致命漏洞:代码打开了CCP1的中断使能
PIE1bits.CCP1IE=1,但既没有开全局中断、外设中断总开关,也没有实现对应的CCP1中断服务函数,更没有配置Timer1的溢出中断使能——预期的“Timer1触发中断让x自增”逻辑完全没有支撑,Timer1溢出时根本不会执行x++的操作。 - 计数流程逻辑断层:主循环里的
if (TMR1IF==1)判断,是在第一次上升沿捕获完成、启动Timer1之后立刻执行一次,此时Timer1刚启动还远未到溢出时间,这个判断永远无法命中x++逻辑。同时代码在检测到下降沿捕获标志后,没有任何关闭Timer1、停止计数的操作,主循环卡在等待下降沿的死循环时,完全没有窗口执行计数累加,等下降沿触发后直接跳去读取x值、计算显示,流程完全和设计目标脱节。 - 变量复位逻辑错位:主循环
while(1)块外的x=0永远不会被执行,x的累计值没有在每轮测量前复位,数值会随测量次数持续叠加,看起来就像计数永远停不下来。 - 内存访问异常:
DEPHASAGE被定义为unsigned long类型数组,却直接作为sprintf的字符串缓冲区使用,会覆盖相邻内存的变量值,进一步打乱程序运行流,放大计数不停的故障表象。 - 状态切换无校验:CCP1在上升沿捕获完成后切换为下降沿捕获,但捕获到下降沿后没有立刻锁存Timer1的当前值,下一轮循环开头直接重置Timer1,导致两沿之间的计数完全丢失。
可落地修复步骤
- 补全必要的中断配置:若采用Timer1溢出累计x值的方案,必须依次配置
PIE1bits.TMR1IE=1、INTCONbits.PEIE=1、INTCONbits.GIE=1,并在中断服务函数中判断TMR1IF置1时执行x++、清除中断标志,不要把计数逻辑放在主循环里。 - 调整测量流程的状态流转:
- 每轮测量开始前,把CCP1配置为上升沿捕获模式,清零所有中断标志位、关闭Timer1、清零x值和Timer1计数寄存器
- 等待上升沿捕获标志触发后,立刻清零Timer1寄存器、启动Timer1,把CCP1切换为下降沿捕获模式
- 等待下降沿捕获标志触发后,立刻关闭Timer1,结合Timer1当前计数值、x累计的溢出值,计算最终脉冲宽度
- 完成计算和LCD显示后,回到流程第一步开始下一轮测量
- 修正变量定义:把sprintf的缓冲区
DEPHASAGE改为char DEPHASAGE[20],避免类型不匹配导致的内存异常 - 把x清零的逻辑放到每轮测量的起始位置,不要放在主循环外部
内容的提问来源于stack exchange,提问作者mad na
相关产品推荐
相关产品推荐

