zuodazuo 发表于 2025-6-18 15:32:07

高级PWM定时器计数器溢出中断问题 | 已给出完整的参考测试程序

各位大侠请教一下,问题如下:高级定时器用来对信号进行捕获i,cc1进行信号捕获,高级定时器计数器的时钟用的是144mHz,对2KHz及以下的信号采集,会出现计时器多次溢出的情况,程序里面配置了溢出事件中断,但是程序不中断,捕获中断。请问问题出在哪里?程序设置如下:


                EAXFR = 1;//扩展寄存器(XFR)访问使能
                CKCON = 0;//提高访问XRAM速度
                HSPWMA_CFG = 0x07;                      //使能PWMA相关寄存器异步访问功能m,并使能异步模式PWM中断
                WritePWMA((char)&PWMA_CCER1, 0x00);      //写 CCMRx 前必须先清零 CCxE 关闭通道
                WritePWMA((char)&PWMA_CCMR1, 0x01); //CC1为输入模式,请映射到TI1FP1上,通道模式配置
                WritePWMA((char)&PWMA_CCMR2, 0x02);//CC2为输入模式,请映射到TI1FP2上
                WritePWMA((char)&PWMA_CCER1, 0x31); //使能CC1/CC2捕获功能,设置捕获机型为CC1的上升沿CC2的下降沿
                WritePWMA((char)&PWMA_SMCR, 0x54);//上升沿复位模式
                WritePWMA((char)&PWMA_CR1, 0x03); //开始计时,允许计时器溢出更新中断
                WritePWMA((char)&PWMA_IER, 0x07);//使能CC1/CC2捕获中断,使能更新事件中断
                EA = 1;   //打开总中断

中断程序:
void PWMA_ISR() interrupt 26
{
                u32 cnt;
                u8 sta;
                sta = ReadPWMA((char)&PWMA_SR1);
          if(sta & 0X01)//计时器溢出事件中断
    {
                        jishiyichunum++;
                        P06 = ~P06;
                }
    if(sta & 0X02)//CC1捕获中断
    {
                        P07 = ~P07;
                        cnt = ReadPWMA((char)&PWMA_CCR1H);
                        cnt = (cnt<<8)+ReadPWMA((char)&PWMA_CCR1L)+jishiyichunum*0xffff;//CC1捕获周期宽度
                        zhuce_time_interval =cnt;
                        jishiyichunum = 0;
    }
    if(sta & 0X04)//CC2捕获中断
    {
                        P07 = ~P07;
                        cnt = ReadPWMA((char)&PWMA_CCR2H);
                        cnt = (cnt<<8)+ReadPWMA((char)&PWMA_CCR2L);//CC2捕获占空比(高电平宽度)      
    }
                WritePWMA((char)&PWMA_SR1, 0x00);   //清除完成标志
}


王昱顺 发表于 5 天前

zuodazuo 发表于 2025-6-24 14:20
能用溢出中断么?这样程序好弄点?
这里给出一个使用Ai8051U实验箱V1.2测试通过的软件版本,经过测试,可以正常捕获1Hz~50Khz之间的信号(再低的没有测,并非不支持,理论上可以捕获低至0.014Hz的信号,仅受限于重复计数变量的大小)

程序使用40Mhz主频,通过PLL倍频到120Mhz,其他如AI8和AI32单片机,拥有同样的高级PWM部分可以一样移植参考,程序是通用的

程序默认通过T0中断改变P00口,输出250Hz的信号,这里通过计算器计算可以看到,实际捕获值为249.98Hz,占空比默认为50%
程序框架通过AiCube生成,在程序main函数的43行,可以通过取消注释代码,来屏蔽T0的方波输出,从而使用外部信号输入给P00来进行测量



以下是代码文件:

王昱顺 发表于 2025-6-18 18:10:11

对于重复捕获,应当使用:PWMx_SR2进行处理


zuodazuo 发表于 5 天前

王昱顺 发表于 2025-6-18 18:10
对于重复捕获,应当使用:PWMx_SR2进行处理

版主你好,我现在情况是,能够重复捕获,但是捕获的方波信号在2kHz以下,那么一个捕获间隔的时间太长,导致计数器两次溢出,我要计计数器的值就必须要算出溢出几次,然后累加才能算出来,现在就是计数器溢出事件不中断,请帮忙看一下是哪里配置不对,为啥计数器溢出事件不中断!程序如我发的贴子

梁工 发表于 5 天前

zuodazuo 发表于 2025-6-24 08:31
版主你好,我现在情况是,能够重复捕获,但是捕获的方波信号在2kHz以下,那么一个捕获间隔的时间太长,导 ...

用于捕获时,将PWM周期设置为最大0xffff,再配合分频器得到合适的周期。

zuodazuo 发表于 5 天前

梁工 发表于 2025-6-24 10:36
用于捕获时,将PWM周期设置为最大0xffff,再配合分频器得到合适的周期。
我要用144mHz的基频来作为计数器的时钟的,
这样做,我的频率分辨率可以做的高,
所以还是只能用事件中断来计数计数器溢出几次,
然后累加来计算被测方波的频率

网老四 发表于 5 天前

试试看能不能利TRGO信号级联,把溢出脉冲发给下一个计数器,这样就可以自动记录溢出次数了,不用每次都进溢出中断处理

zuodazuo 发表于 5 天前

网老四 发表于 2025-6-24 12:24
试试看能不能利TRGO信号级联,把溢出脉冲发给下一个计数器,这样就可以自动记录溢出次数了,不用每次都进溢出 ...

能用溢出中断么?这样程序好弄点?{:touxiao:}

梁工 发表于 5 天前

zuodazuo 发表于 2025-6-24 14:20
能用溢出中断么?这样程序好弄点?

溢出中断当然那可以用的。

zuodazuo 发表于 4 天前

王昱顺 发表于 2025-6-24 19:36
这里给出一个使用Ai8051U实验箱V1.2测试通过的软件版本,经过测试,可以正常捕获1Hz~50Khz之间的信号(再 ...

解决了,感谢楼主分享
页: [1]
查看完整版本: 高级PWM定时器计数器溢出中断问题 | 已给出完整的参考测试程序