找回密码
 立即注册
查看: 462|回复: 14

STC8H8K64U PWMA同时用作捕获和输出采集时,出现捕获遗漏问题

[复制链接]

该用户从未签到

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2023-11-5 14:50:35 来自手机 | 显示全部楼层 |阅读模式
问题描述:时钟频率24M,在设定PWM频率为20kHz的情况下,用PWMA第二个通道作为捕获,其他部分通道作为pwm输出。配置为不分频,ARR寄存器写入1199,并且同时打开输入捕获中断和PWMA溢出更新中断,以用来计算捕获周期,实际捕获计数约在16*1199~17*1199之间。发现单片机有漏捕获的情况,即溢出计数由正常的16概率性的变为32。这是为什么呀?有哪位大神遇到过没?麻烦赐教。
回复 送花

使用道具 举报

该用户从未签到

550

主题

9351

回帖

1万

积分

管理员

积分
13882
发表于 2023-11-5 16:36:53 | 显示全部楼层
将 CPU 主频先提高到 40MHz, 优化程序,再有障碍,问梁工
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
发表于 2023-11-5 16:53:24 | 显示全部楼层
用示波器仔细看信号,估计有抖动,刚好是2倍。
另外,如果捕获之后、读出数据之前出现溢出,则可能会多一个溢出计数,应对方法是,进中断后先处理捕获中断读出捕获值和溢出次数,再处理溢出中断,并且清除溢出中断计数。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

8

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2023-11-5 21:48:57 | 显示全部楼层
神农鼎 发表于 2023-11-5 16:36
将 CPU 主频先提高到 40MHz, 优化程序,再有障碍,问梁工

好的,谢谢
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

8

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2023-11-5 21:58:28 | 显示全部楼层
梁工 发表于 2023-11-5 16:53
用示波器仔细看信号,估计有抖动,刚好是2倍。
另外,如果捕获之后、读出数据之前出现溢出,则可能会多一个 ...

好的,我是在捕获中断里面更新的溢出计数值,如果存在抖动的话,不应该每次都是2倍,所以只能推断是漏捕了。另一个现象就是,默认不配置ARR寄存器的话,暂时没出现这种现象。我试着先把捕获中断处理提前试试。

点评

捕捉中断是硬件完成的,不会漏的,除非你的程序响应不过来(比如某个中断耗时太多),但那样也不会是固定的关系,你这里是固定的2倍,则肯定是程序的问题,请仔细测试查找。  详情 回复 发表于 2023-11-5 23:20
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
发表于 2023-11-5 23:20:15 | 显示全部楼层
pelion 发表于 2023-11-5 21:58
好的,我是在捕获中断里面更新的溢出计数值,如果存在抖动的话,不应该每次都是2倍,所以只能推断是漏捕 ...

捕捉中断是硬件完成的,不会漏的,除非你的程序响应不过来(比如某个中断耗时太多),但那样也不会是固定的关系,你这里是固定的2倍,则肯定是程序的问题,请仔细测试查找。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

8

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2023-11-6 11:30:11 | 显示全部楼层
代码如附件,配置工作频率40M,还是会有同样的问题

Explorer02.rar

112.28 KB, 下载次数: 22

代码

回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

8

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2023-11-6 11:34:07 | 显示全部楼层
梁工 发表于 2023-11-5 23:20
捕捉中断是硬件完成的,不会漏的,除非你的程序响应不过来(比如某个中断耗时太多),但那样也不会是固定 ...

代码如上,这是测试结果

测试输出部分结果

测试输出部分结果

点评

你在捕获中断中取反一个IO来指示,示波器观察,输入频率稳定的信号,则IO输出信号频率的一半,就能知道是否及时响应了。刚好两倍,说明白要么(有规律的)没及时响应,要么检测时间变成2倍了。  详情 回复 发表于 2023-11-6 13:05
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
发表于 2023-11-6 13:05:07 | 显示全部楼层
pelion 发表于 2023-11-6 11:34
代码如上,这是测试结果

你在捕获中断中取反一个IO来指示,示波器观察,输入频率稳定的信号,则IO输出信号频率的一半,就能知道是否及时响应了。刚好两倍,说明白要么(有规律的)没及时响应,要么检测时间变成2倍了。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

8

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2023-11-6 13:48:23 | 显示全部楼层
本帖最后由 pelion 于 2023-11-6 13:52 编辑
test.jpg 梁工 发表于 2023-11-6 13:05
你在捕获中断中取反一个IO来指示,示波器观察,输入频率稳定的信号,则IO输出信号频率的一半,就能知道是 ...

如图,黄色线为输入信号,蓝色线为捕捉后的翻转输出波形,通过脉宽触发捕捉到了如图所示的漏捕的情况。另外,目前程序仅有此中断和串口中断,且串口中断无数据传输,应该不是响应不及时。
  1. void PWMA_ISR() interrupt 26
  2. {
  3.     uint8_t sr1;
  4.     sr1 = PWMA_SR1;
  5.     PWMA_SR1 = 0;
  6.     if(sr1 & 0x01)
  7.     {
  8.         cnt++;
  9.     }
  10.    
  11.     if(sr1 & 0x04)
  12.     {
  13.         P40 = ~P40;
  14.     }
  15. }
复制代码


回复 支持 反对 送花

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 04:13 , Processed in 0.075510 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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