etec 发表于 2024-5-1 10:52:54

使用32G12K128芯片INT0中断测量脉冲宽度问题

使用32G12K128芯片中INT0下降沿中断触发方式,来测量P3.2口上,两个下降沿脉冲之间的宽度,

程序配置如下:
       P3.2 配置为输入口模式
      IT0= 1;         //外部INT0下降沿中断使能   
      IP   = 0X01;      //设置INT0中断优先级为最高
      IPH= 0X01;
      
      TM3PS = 0x01;//T3定时器主时钟2分频(主时钟24MHZ)定时器3为1us计数
      T3R= 1;         //启动定时器3计数,通过读取2次INT0中断入口时,定时器T3的值,进行差值计算,得到脉冲宽度
   
      EX0= 1;
      EA   = 1;

   实际脉冲宽度在9ms -11ms 之间   

   程序在实际运行时,大部分测量的脉冲宽度是正确的,但其中会发生一次测量信号出错,出错的值每次都一样




etec 发表于 2024-5-1 10:55:36

同样的程序,之前在STM8S105S4T6C 单片机上,运行没有出现过测量出错问题,麻烦各位老师指导一下,看看我的问题出在什么地方,谢谢

乘风飞扬 发表于 2024-5-1 11:01:15

先用示波器测量一下被测信号是否稳定,有没有受到脉冲干扰。

神农鼎 发表于 2024-5-1 12:04:00

etec 发表于 2024-5-1 10:55
同样的程序,之前在STM8S105S4T6C 单片机上,运行没有出现过测量出错问题,麻烦各位老师指导一下,看看我的 ...

不可能是同样的程序,另外建议改用 专业的 PWM 测量外部信号

etec 发表于 2024-5-1 14:57:53

您好,这个项目原来是STM8S105S4芯片做的,项目硬件没有变比,只是把芯片更换成了STC32G系列的芯片,程序基本是移植过来的,这两个芯片的配置基本是一样的,这个脉冲用PWM捕获测量没有问题,但PWM通道已经被使用了,您看下,我这个可能会再哪里出问题,谢谢

etec 发表于 2024-5-1 15:01:43

神农鼎 发表于 2024-5-1 12:04
不可能是同样的程序,另外建议改用 专业的 PWM 测量外部信号

您好,这个项目原来是STM8S105S4芯片做的,项目硬件没有变比,只是把芯片更换成了STC32G系列的芯片,程序基本是移植过来的,这两个芯片的配置基本是一样的,这个脉冲用PWM捕获测量没有问题,但PWM通道已经被使用了,您看下,我这个可能会再哪里出问题,谢谢

神农鼎 发表于 2024-5-1 15:41:39

有如下8个通道可以测量:
PWM1P, PWM2P, PWM3P, PWM4P;
PWM5, PWM6, PWM7, PWM8

梁工 发表于 2024-5-1 21:53:13

使用INT0下降沿中断+定时器配合测量周期没有任何问题,因为要进入中断读取定时器需要点时间,可能会造成一点误差,主频运行于24MHz时,误差不会超过1us(24个时钟)。对于楼主要测量的9~11ms,这点误差可以忽略。
楼主的问题,可能是读取定时器时刚好处于进位而发生错误。处理方式:先挺尸定时器,再读取定时器,然后设置初值(也可以不设置),再允许定时器。这种方式处理,一定不会有问题。另外,必须设置INT0的中断为最高优先级中断,避免别的中断影响精度。

提别提醒:使用INT0外中断测周期不是好的方法,最好的方法是使用PWM模块来测周期,误差不超过一个PWM时钟。

etec 发表于 2024-5-1 22:01:06

好的,谢谢,梁工,我明天试一下您的处理方案

etec 发表于 2024-5-2 16:14:03

本帖最后由 etec 于 2024-5-2 16:15 编辑

梁工 发表于 2024-5-1 21:53
使用INT0下降沿中断+定时器配合测量周期没有任何问题,因为要进入中断读取定时器需要点时间,可能会造成一 ...
您好,梁工,按照您的建议,我再INT0中断中,读取T3定时器值前,先停止T3计数,读取完后,再启动那个T3定时器,之前的测量出错的问题,没有了。但是我还是有不太理解的地方,还想再请教您一下,T3定时器时钟是1uS,我的测量脉冲周期大概是10-15ms之间,T3完整的一次计数时间是65536*1us=65.536ms,时间是大于脉冲周期的,程序是通过读取两次T3定时器的差值来计算脉冲宽度的,实际计算时就算发生T3计数进位,但是没有超过一个T3计数周期,应该对计算差值是不影响啊,这个我还是没太搞清楚,因为这个程序我之前用STM8S105芯片也是用T3计数器+INT0中断,读取计数值,我是没有停止T3计数的,直接读取后计算,没发现过问题。您能再和我具体说明一下原因吗,感谢!!!
页: [1] 2
查看完整版本: 使用32G12K128芯片INT0中断测量脉冲宽度问题