找回密码
 立即注册
查看: 488|回复: 2

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

[复制链接]
已绑定手机

1

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-12-20 21:30:54 | 显示全部楼层 |阅读模式
急切请教各位大佬:
我使用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的溢出呢?
非常感谢
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-07-25 08:58:54
已绑定手机

2

主题

13

回帖

80

积分

注册会员

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

点评

官方例程的变量是16位,直接小数减去大数,不够减等同于借位了,没有问题。  详情 回复 发表于 2025-7-18 18:25
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-07-31 12:11:20

76

主题

6281

回帖

1万

积分

超级版主

积分
13347
发表于 2025-7-18 18:25:33 | 显示全部楼层
nange*** 发表于 2025-7-18 10:21
你不用管是谁溢出了,每次进入中断就保存计数器的值,如果,本次值小于上次值肯定是溢出重新计数了,你把小 ...

官方例程的变量是16位,直接小数减去大数,不够减等同于借位了,没有问题。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-1 01:10 , Processed in 0.110376 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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