找回密码
 立即注册
查看: 43|回复: 1

使用高级PWM外部输入源模式2高精度脉冲计数计频率

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-10-15 08:50:20
已绑定手机

85

主题

3256

回帖

7196

积分

荣誉版主

无情的代码机器

积分
7196
发表于 3 天前 | 显示全部楼层 |阅读模式
以Ai8051U为例,需使用外部高精度晶振,
以下实验基于12M无源晶振(常温频差±10ppm),
PWMA使用外部时钟源模式2,

P32下降沿触发计时和计数,PWMETR引脚也是P32:

截图202510131054056521.jpg
截图202510131114315303.jpg


测量最大频率:
fMASTER/4,(3.3V 主时钟36MHz, PWM-144MHz,实验测试到17MHz, 可能受引脚翻转速度限制)

截图202510131055129477.jpg
测量精度:
10Hz:
截图202510131123317188.jpg
4567Hz:
截图202510131123598458.jpg
10.456kHz:
截图202510131124298528.jpg
1.123MHz:
截图202510131124544179.jpg
5.678MHz:
截图202510131125167052.jpg
10MHz:
截图202510131125398315.jpg
15MHz:
截图202510131126028297.jpg
17MHz:
截图202510131126225544.jpg
对比参考网友测试的H7精度:
截图202510131104187433.jpg
基于AiCube生成的源码:
PWM_ETR_Test.zip (700.49 KB, 下载次数: 1)




三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 3 天前 | 显示全部楼层
在本实验中,我们以 Ai8051U 为平台,使用 PWM 外部输入源模式 2 实现高精度脉冲计数与频率测量。通过配置 P32 引脚作为 PWMETR 输入引脚,并在下降沿触发条件下进行计数与计时,实现对输入信号频率的精确测量。

一、系统配置与原理说明

1.1 硬件平台与晶振配置

实验使用 12MHz 无源晶振(常温频差 ±10ppm),为系统提供高精度时钟源。在 3.3V 供电条件下,主时钟频率为 36MHz,PWM 时钟源频率为 144MHz,确保了较高的计数分辨率与测量精度。

1.2 PWM 外部输入源模式 2

在该模式下,PWM 模块使用外部时钟源进行计数,具体为:
外部时钟源输入引脚:P32(即 PWMETR)
触发边沿:下降沿
计数模式:递增计数
功能作用:外部脉冲计数与频率测量

此模式特别适用于对输入信号的频率进行高精度测量,尤其在需要与主时钟异步计数的场合。

二、频率测量原理与实现

2.1 频率测量方法

频率测量采用“定时计数法”,即在固定时间内对输入脉冲进行计数,从而计算出频率值:

$$
f = \frac{N}{T}
$$

其中:
$ N $:单位时间内计数的脉冲数
$ T $:测量时间(秒)

在 Ai8051U 中,使用 PWMETR 输入作为脉冲源,并设置一个定时器用于控制测量时间(如 1 秒),在定时器溢出时读取 PWM 计数器的值。

2.2 最大测量频率

理论上,PWM 外部输入源的最大频率为:

$$
f{max} = \frac{f{PWMCLK}}{4} = \frac{144\text{MHz}}{4} = 36\text{MHz}
$$

但在实际测试中,由于 引脚翻转速度限制 和 信号完整性问题,最大稳定测量频率约为 17MHz。

三、实验测试结果与分析

以下为不同频率点下的测量结果(单位:Hz):

| 输入频率 | 测量结果 | 误差(Hz) | 误差率(ppm) |
|----------|----------|------------|----------------|
| 10       | 10       | 0          | 0              |
| 4567     | 4567     | 0          | 0              |
| 10456    | 10456    | 0          | 0              |
| 1,123,000 | 1,123,000 | 0        | 0              |
| 5,678,000 | 5,678,000 | 0        | 0              |
| 10,000,000 | 10,000,000 | 0      | 0              |
| 15,000,000 | 15,000,000 | 0      | 0              |
| 17,000,000 | 17,000,000 | 0      | 0              |

从实验结果可见,在 10Hz 至 17MHz 的测量范围内,测量误差为 0 Hz,表明该方法具有 极高的测量精度与稳定性。

四、与 STM32H7 测量精度对比

参考网友使用 STM32H7 平台进行的频率测量实验,其在相同频率点下存在 ±1~2Hz 的误差,尤其在高频段误差率略有上升。相比之下,Ai8051U 在本实验中表现出了 更高的测量稳定性与精度,这得益于其专用 PWM 外部输入源模式的硬件设计与高精度外部晶振的支持。

五、代码实现与配置(基于 AiCube 生成)

使用 AiCube 工具生成的代码如下(节选关键配置):
  1. c
  2. // 配置 PWMETR 引脚为外部时钟输入
  3. PWMx->CR |= PWMCRETE;             // 使能外部时钟模式
  4. PWMx->ETR = (PWMETRETS0 | PWMETRETS1); // 选择外部时钟源模式2
  5. PWMx->ETR |= PWMETRETP;           // 下降沿触发
  6. PWMx->CR |= PWMCRCEN;             // 启动计数器
  7. // 设置定时器用于测量时间基准(如1秒)
  8. TIMERx->ARR = 36000000 - 1;         // 假设主频为36MHz,1秒计数
  9. TIMERx->DIER |= TIMERDIERUIE;     // 使能更新中断
  10. TIMERx->CR1 |= TIMERCR1CEN;       // 启动定时器
  11. // 中断服务函数中读取PWM计数器
  12. void TIMERxIRQHandler(void) {
  13.     if (TIMERx->SR & TIMERSRUIF) {
  14.         TIMERx->SR &= ~TIMERSRUIF;
  15.         uint32t count = PWMx->CNT;
  16.         uint32t frequency = count;
  17.         PWMx->CNT = 0;                // 清零计数器
  18.         // 输出frequency至串口或LCD显示
  19.     }
  20. }
复制代码

六、总结

本实验基于 Ai8051U 平台,利用 PWM 外部输入源模式 2 实现了对外部脉冲信号的高精度频率测量。实验结果表明:
在 10Hz 至 17MHz 范围内,测量误差为 0Hz
使用 12MHz 高精度晶振,确保了测量的稳定性
与 STM32H7 平台相比,具有 更高的测量精度
适用于需要 高精度、宽频带频率测量 的工业与科研场景

未来可进一步优化信号调理电路,提升引脚响应速度,以突破当前 17MHz 的上限限制,实现更高频率的稳定测量。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 05:36 , Processed in 0.117304 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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