ercircle 发表于 3 天前

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

以Ai8051U为例,需使用外部高精度晶振,
以下实验基于12M无源晶振(常温频差±10ppm),
PWMA使用外部时钟源模式2,
P32下降沿触发计时和计数,PWMETR引脚也是P32:





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


测量精度:
10Hz:

4567Hz:

10.456kHz:

1.123MHz:

5.678MHz:

10MHz:

15MHz:

17MHz:

对比参考网友测试的H7精度:

基于AiCube生成的源码:





国芯人工智能 发表于 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 工具生成的代码如下(节选关键配置):

c
// 配置 PWMETR 引脚为外部时钟输入
PWMx->CR |= PWMCRETE;             // 使能外部时钟模式
PWMx->ETR = (PWMETRETS0 | PWMETRETS1); // 选择外部时钟源模式2
PWMx->ETR |= PWMETRETP;         // 下降沿触发
PWMx->CR |= PWMCRCEN;             // 启动计数器

// 设置定时器用于测量时间基准(如1秒)
TIMERx->ARR = 36000000 - 1;         // 假设主频为36MHz,1秒计数
TIMERx->DIER |= TIMERDIERUIE;   // 使能更新中断
TIMERx->CR1 |= TIMERCR1CEN;       // 启动定时器

// 中断服务函数中读取PWM计数器
void TIMERxIRQHandler(void) {
    if (TIMERx->SR & TIMERSRUIF) {
      TIMERx->SR &= ~TIMERSRUIF;
      uint32t count = PWMx->CNT;
      uint32t frequency = count;
      PWMx->CNT = 0;                // 清零计数器
      // 输出frequency至串口或LCD显示
    }
}

六、总结

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 使用高级PWM外部输入源模式2高精度脉冲计数计频率