You need to enable JavaScript to run this app. 基于PIC18F4550 CCP捕获模式的脉冲宽度测量程序故障排查
优惠活动
大模型
产品
解决方案
定价
更多

基于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++、清除中断标志,不要把计数逻辑放在主循环里。
  • 调整测量流程的状态流转:
    1. 每轮测量开始前,把CCP1配置为上升沿捕获模式,清零所有中断标志位、关闭Timer1、清零x值和Timer1计数寄存器
    2. 等待上升沿捕获标志触发后,立刻清零Timer1寄存器、启动Timer1,把CCP1切换为下降沿捕获模式
    3. 等待下降沿捕获标志触发后,立刻关闭Timer1,结合Timer1当前计数值、x累计的溢出值,计算最终脉冲宽度
    4. 完成计算和LCD显示后,回到流程第一步开始下一轮测量
  • 修正变量定义:把sprintf的缓冲区DEPHASAGE改为char DEPHASAGE[20],避免类型不匹配导致的内存异常
  • 把x清零的逻辑放到每轮测量的起始位置,不要放在主循环外部

内容的提问来源于stack exchange,提问作者mad na

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 05:45:09