lifuhai2003 发表于 2024-12-20 21:30:54

8H芯片PWM捕捉两路脉冲波信号的周期和占空比

急切请教各位大佬:
我使用8H8K64U-45I-TSSOP20芯片,12MHz,PWM无分频,输入捕捉模式,同时测量两组0~2kHz的脉冲信号的周期和占空比,情况和疑问如下,请大佬赐教:
1、Freq1接P1.0/PWM1P,Freq2接P3.4/PWM4P,捕捉Freq1和Freq2的周期和占空比,均可能出现溢出情况;
2、在例程中看到,可以通过PWMA_CCR1读取捕获的Freq1周期,PWMA_CCR2捕捉Freq1的占空比;可以通过PWMA_CCR3读取捕获的Freq2周期,PWMA_CCR4捕捉Freq2的占空比;

3、当存在溢出时,如何判断PWMA_SR1中的UIFA更新标志,是Freq1溢出还是Freq2溢出呢?如果SR1中的UIFA是PWM1P的溢出标志,那PWM4P的溢出标志在那个状态寄存器里呢?
4、如果没有独立的UIFA更新标志,那么该如何区分Freq1/Freq2的溢出呢?
非常感谢

nanger1984 发表于 2025-7-18 10:21:13

你不用管是谁溢出了,每次进入中断就保存计数器的值,如果,本次值小于上次值肯定是溢出重新计数了,你把小数给加个 65536L,这样小数不就变成大数了么,直接相减就行了。官方例程直接小数减去大数,测试看了一下也没有什么问题

/***************************************************************************/        //CCP捕获占空比服务函数
static        void PWM_ISR() interrupt 26
{
        uint j; //本次捕获值
        static uint capT1_Last,capT2_Last; //上次捕获值

        if (PWMA_SR1 & 0x02)                                // 当CC1捕获
                {       
                        PWMA_SR1 &= ~0x02;                        // 清零
                       
                        j =(PWMA_CCR1H << 8) + PWMA_CCR1L;        // CC1:上升沿-捕获周期                       
                        if(j < capT1_Last)        P1capT = ( 65536L + j ) - capT1_Last ;
                        else                                                     P1capT = j - capT1_Last ;                       
                        capT1_Last = j;
                        DRY_OUT = 1;
                }
        if(PWMA_SR1 & 0x04)                                        // 当CC2捕获
                {
                        PWMA_SR1 &= ~0x04;                               
                       
                        j =(PWMA_CCR2H << 8) + PWMA_CCR2L;        // CC2:下降沿-捕获高电平时间                       
                        if(j < capT1_Last)P1capH = ( 65536L + j ) - capT1_Last ;
                        else                                             P1capH = j - capT1_Last ;       
                        DRY_OUT = 0;                       
                }
        if (PWMA_SR1 & 0x08)                                // 当CC3捕获
                {       
                        PWMA_SR1 &= ~0x08;                       
                       
                        j =(PWMA_CCR3H << 8) + PWMA_CCR3L;        // CC3:上升沿-捕获周期                       
                        if(j < capT2_Last)P2capT = ( 65536L + j ) - capT2_Last;
                        else                                             P2capT = j - capT2_Last ;                       
                        capT2_Last = j;
                }
        if(PWMA_SR1 & 0x10)                                        // 当CC4捕获
                {
                        PWMA_SR1 &= ~0x10;                       
                       
                        j =(PWMA_CCR4H << 8) + PWMA_CCR4L;        // CC4:下降沿-捕获高电平时间                               
                        if(j < capT2_Last)P2capH = ( 65536L + j ) - capT2_Last;
                        else                                             P2capH = j - capT2_Last ;                       
                }
}       

梁工 发表于 2025-7-18 18:25:33

nanger1984 发表于 2025-7-18 10:21
你不用管是谁溢出了,每次进入中断就保存计数器的值,如果,本次值小于上次值肯定是溢出重新计数了,你把小 ...

官方例程的变量是16位,直接小数减去大数,不够减等同于借位了,没有问题。
页: [1]
查看完整版本: 8H芯片PWM捕捉两路脉冲波信号的周期和占空比