神农鼎 发表于 2024-3-18 15:49:14

giveyou 发表于 2024-3-18 15:32
对于频率很低的情况就测量不准了,16为计数器会出现溢出现象。比如低于1Hz的脉冲周期测量。 ...

计数溢出会产生中断的,你对中断计数就行了

giveyou 发表于 2024-3-20 08:31:18

神农鼎 发表于 2024-3-18 15:49
计数溢出会产生中断的,你对中断计数就行了

这个办法好,有空试一下

梁工 发表于 2024-3-25 21:34:42

giveyou 发表于 2024-3-18 15:32
对于频率很低的情况就测量不准了,16为计数器会出现溢出现象。比如低于1Hz的脉冲周期测量。 ...

不会的,你要用合适的PWM时钟,比如使用20us周期的PWM时钟,则最大测量周期为1.31072秒,分辨率依旧是16位的。
如果使用中断,一定要注意处理捕获后计数器刚好出现中断的情况。

stcaoard 发表于 2025-2-20 18:09:30

神农鼎 发表于 2024-3-18 15:49
计数溢出会产生中断的,你对中断计数就行了

你好,溢出中断如何开启,溢出中断的标志位是哪个。请您帮我看看代码,我现在需要测量输入信号的周期,计算频率。测量的区间是0.5Hz-1500Hz,在这个区间内能够达到1Hz分辨率。目前就是低频小于31Hz计数器会溢出,这个计数器的溢出中断还没调出来,有两个问题,一个是中断标志是哪个,在哪个中断服务函数处理,第二个是如何开启。我把配置和中断服务函数的代码贴上来,请大佬指导!
oid PWMA_config(void)
{
        P_SW2 |= 0x80;                //SFR enable

        PWMA_CCER1= 0;
        PWMA_CCER2= 0;
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;
        PWMA_ENO    = 0;                //IO禁止输出PWM,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
        PWMA_PS   = 0;
        PWMA_IER    = 0;
        PWMA_ISR_En = 0;

        PWMA_PSCRH = 0;                // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
        PWMA_PSCRL = 11;                //0x0960 主时钟2400分频,定时器时钟10KHZ,最小检测频率1/6.5536

        PWMA_CCMR1   = 0x01;        // CC1配置为输入模式, 且映射到TI1FP1上
        PWMA_CCER1|= 0x01;        // 配置捕获极性为CC1的上升沿, 使能捕获, 0x01:上升沿, 0x03:下降沿
        PWMA_CCMR2   = 0x02;        // CC2配置为输入模式, 且映射到TI1FP2上
        PWMA_CCER1|= 0x30;        // 配置捕获极性为CC2的下降沿, 使能捕获, 0x10:上升沿, 0x30:下降沿
        PWMA_PS   |= 1;                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
        PWMA_ISR_En |= 0x03;        // 使能CC1中断,允许更新中断
        //PWMA_ETR;
        PWMA_IER= PWMA_ISR_En;        //设置标志允许通道1~4中断处理
        PWMA_EGR= 0x00;                                        //事件产生寄存器,清零
        PWMA_SMCR = 0x54;                //触发源选择滤波后的TI1FP1, 复位模式(即上升沿复位ARR)
        PWMA_BKR= 0x00;
        PWMA_CR1 |= 0x85;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;

}


void PWMA_ISR(void) interrupt PWMA_VECTOR
{
        u8        sr1;
        u8        sr2;
        sr1 = PWMA_SR1;                //中断标志用一个局部变量处理
        PWMA_SR1 = ~sr1;        //清除中断标志
        sr2 = PWMA_SR2;                //重复捕获标志
        PWMA_SR2 = 0;                //清除中断标志
        sr1 &= PWMA_ISR_En;        //屏蔽未允许的中断

        if(sr1 & 0x02)        //通道1, CC1捕获上升沿中断, 一个周期结束, 新的周期开始
        {
                period    = ((u16)PWMA_CCR1H << 8) + (u16)PWMA_CCR1L;;        //读周期时间
                PulseHigh = ((u16)PWMA_CCR2H << 8) + (u16)PWMA_CCR2L;        //读高电平时间
                B_Capture = 1;                //标志波形1已捕捉完成
               
        }
       
        if(sr2 & 0x01)                        //
        {
                P25=!P25;
               
        }
       
}


页: 1 [2]
查看完整版本: STC8H/STC32G的PWM,输入捕获模式同时测量脉冲周期和占空比