找回密码
 立即注册
查看: 122|回复: 9

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-25 16:37:57

2

主题

7

回帖

46

积分

新手上路

积分
46
发表于 2025-6-18 15:32:07 | 显示全部楼层 |阅读模式
各位大侠请教一下,问题如下:高级定时器用来对信号进行捕获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);   //清除完成标志
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:508
  • 最近打卡:2025-06-28 10:05:05
已绑定手机
已实名认证

112

主题

2420

回帖

6126

积分

版主

积分
6126
发表于 4 天前 | 显示全部楼层
zuod*** 发表于 2025-6-24 14:20
能用溢出中断么?这样程序好弄点?

这里给出一个使用Ai8051U实验箱V1.2测试通过的软件版本,经过测试,可以正常捕获1Hz~50Khz之间的信号(再低的没有测,并非不支持,理论上可以捕获低至0.014Hz的信号,仅受限于重复计数变量的大小)

程序使用40Mhz主频,通过PLL倍频到120Mhz,其他如AI8和AI32单片机,拥有同样的高级PWM部分可以一样移植参考,程序是通用的
截图202506241933535385.jpg
程序默认通过T0中断改变P00口,输出250Hz的信号,这里通过计算器计算可以看到,实际捕获值为249.98Hz,占空比默认为50%
程序框架通过AiCube生成,在程序main函数的43行,可以通过取消注释代码,来屏蔽T0的方波输出,从而使用外部信号输入给P00来进行测量
截图202506241936178528.jpg


以下是代码文件:
PWM重复捕获低频率信号.zip (518.28 KB, 下载次数: 1)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:508
  • 最近打卡:2025-06-28 10:05:05
已绑定手机
已实名认证

112

主题

2420

回帖

6126

积分

版主

积分
6126
发表于 2025-6-18 18:10:11 | 显示全部楼层
对于重复捕获,应当使用:PWMx_SR2进行处理

截图202506181809585252.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-25 16:37:57

2

主题

7

回帖

46

积分

新手上路

积分
46
发表于 4 天前 | 显示全部楼层
王*** 发表于 2025-6-18 18:10
对于重复捕获,应当使用:PWMx_SR2进行处理

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

点评

用于捕获时,将PWM周期设置为最大0xffff,再配合分频器得到合适的周期。  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

74

主题

6160

回帖

1万

积分

超级版主

积分
12921
发表于 4 天前 | 显示全部楼层
zuod*** 发表于 2025-6-24 08:31
版主你好,我现在情况是,能够重复捕获,但是捕获的方波信号在2kHz以下,那么一个捕获间隔的时间太长,导 ...

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-25 16:37:57

2

主题

7

回帖

46

积分

新手上路

积分
46
发表于 4 天前 | 显示全部楼层
梁*** 发表于 2025-6-24 10:36
用于捕获时,将PWM周期设置为最大0xffff,再配合分频器得到合适的周期。

我要用144mHz的基频来作为计数器的时钟的,
这样做,我的频率分辨率可以做的高,
所以还是只能用事件中断来计数计数器溢出几次,
然后累加来计算被测方波的频率
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2025-06-28 00:27:22

8

主题

360

回帖

2528

积分

金牌会员

积分
2528
发表于 4 天前 | 显示全部楼层
试试看能不能利TRGO信号级联,把溢出脉冲发给下一个计数器,这样就可以自动记录溢出次数了,不用每次都进溢出中断处理
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-25 16:37:57

2

主题

7

回帖

46

积分

新手上路

积分
46
发表于 4 天前 | 显示全部楼层
网*** 发表于 2025-6-24 12:24
试试看能不能利TRGO信号级联,把溢出脉冲发给下一个计数器,这样就可以自动记录溢出次数了,不用每次都进溢出 ...

能用溢出中断么?这样程序好弄点?

点评

这里给出一个使用Ai8051U实验箱V1.2测试通过的版本,经过测试,可以正常捕获5Hz~50Khz之间的信号(再低的没有测,并非不支持,理论上可以捕获低至0.014Hz的信号,仅受限于重复计数器大小) 程序使用40Mhz主频,通过  详情 回复 发表于 4 天前
溢出中断当然那可以用的。  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

74

主题

6160

回帖

1万

积分

超级版主

积分
12921
发表于 4 天前 | 显示全部楼层
zuod*** 发表于 2025-6-24 14:20
能用溢出中断么?这样程序好弄点?

溢出中断当然那可以用的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-25 16:37:57

2

主题

7

回帖

46

积分

新手上路

积分
46
发表于 3 天前 | 显示全部楼层
王*** 发表于 2025-6-24 19:36
这里给出一个使用Ai8051U实验箱V1.2测试通过的软件版本,经过测试,可以正常捕获1Hz~50Khz之间的信号(再 ...

解决了,感谢楼主分享
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-28 11:11 , Processed in 0.276592 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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