找回密码
 立即注册
楼主: 神农鼎

STC8H/STC32G的PWM,输入捕获模式同时测量脉冲周期和占空比

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-3-18 15:49:14 | 显示全部楼层
give*** 发表于 2024-3-18 15:32
对于频率很低的情况就测量不准了,16为计数器会出现溢出现象。比如低于1Hz的脉冲周期测量。 ...

计数溢出会产生中断的,你对中断计数就行了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:186
  • 最近打卡:2025-03-06 09:49:49

14

主题

133

回帖

1149

积分

金牌会员

积分
1149
发表于 2024-3-20 08:31:18 | 显示全部楼层
神*** 发表于 2024-3-18 15:49
计数溢出会产生中断的,你对中断计数就行了

这个办法好,有空试一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-3-25 21:34:42 | 显示全部楼层
give*** 发表于 2024-3-18 15:32
对于频率很低的情况就测量不准了,16为计数器会出现溢出现象。比如低于1Hz的脉冲周期测量。 ...

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-02-20 17:52:36
已绑定手机

0

主题

1

回帖

10

积分

新手上路

积分
10
发表于 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;
               
        }
       
}


回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:16 , Processed in 0.117362 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表