打印
[APM32F0]

APM32F003 波形输入脉宽检测

[复制链接]
401|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Peixu|  楼主 | 2025-3-3 11:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
基于 APM32F003 的方波信号测量与分析
本文将围绕利用 APM32F003 微控制器测量特定占空比方波信号展开,详细阐述测量过程、结果分析以及相关注意事项。
串口9600  PD5 引脚TX 输入信号PC3引脚
(一)变量定义
uint32_t highLevelTime = 0;
uint32_t icValue[2];
uint32_t icOffset = 0;
uint32_t clockFreqTMR1 = 0;
volatile uint32_t overflowCNT = 0;
volatile uint32_t captureInterruptCount = 0;
volatile uint32_t updateInterruptCount = 0;
这些变量各司其职,
highLevelTime用于存储最终计算得到的高电平时间;
icValue数组负责记录两次捕获的计数值;
icOffset作为索引,指示当前记录的是第几次捕获值;
clockFreqTMR1保存定时器时钟频率;
overflowCNT记录定时器溢出次数;
captureInterruptCount和
updateInterruptCount分别统计捕获中断和更新中断的进入次数。
(二)定时器初始化
void TMR1_Init(void)
{
    TMR1_ICConfig_T icConfig;
    GPIO_Config_T gpioConfig;
    gpioConfig.mode = GPIO_MODE_IN_FLOATING;
    gpioConfig.pin = GPIO_PIN_3;
    gpioConfig.speed = GPIO_SPEED_10MHz;
    GPIO_Config(GPIOC, &gpioConfig);
    icConfig.channel = TMR1_CHANNEL_3;
    icConfig.filter = 0;
    icConfig.div = TMR1_IC_DIV_1;
    icConfig.polarity = TMR1_IC_POLARITY_RISING;
    icConfig.selection = TMR1_IC_SELECT_DIRECTTI;
    TMR1_ConfigInputCapture(TMR1, &icConfig);
    TMR1_EnableInterrupt(TMR1, TMR1_INT_UPDATE | TMR1_INT_CH3CC);
    NVIC_EnableIRQRequest(TMR1_UT_IRQn, 0x0f);
    NVIC_EnableIRQRequest(TMR1_CC_IRQn, 0x0f);
    TMR1_Enable(TMR1);
}
在定时器初始化函数中,首先对 GPIO 引脚进行配置,将其设置为浮空输入模式,用于接收方波信号。接着,对定时器输入捕获进行细致配置,设定捕获通道、滤波、分频以及初始捕获极性为上升沿触发。同时,开启定时器的更新中断和捕获中断,并使能相应的 NVIC 中断请求,最后启动定时器,使其进入工作状态。
(三)捕获中断服务函数

当捕获中断发生时,首先递增捕获中断计数器
captureInterruptCount。然后读取当前的捕获计数值并存储到
icValue数组中。若为第一次捕获(
icOffset == 0),则将溢出计数器清零,切换捕获极性为下降沿触发,准备捕获高电平的结束沿。当第二次捕获完成(
icOffset == 1),依据两次捕获值和溢出次数计算高电平时间,并将捕获极性重新切换回上升沿触发,为下一次测量做好准备。最后,清除捕获中断标志位,确保中断处理的准确性。
(四)更新中断服务函数
void TMR1_UT_Isr(void)
{
    if(TMR1_ReadStatusFlag(TMR1, TMR1_FLAG_UPDATE) == SET)
    {
        updateInterruptCount++;
        overflowCNT++;
        TMR1_ClearStatusFlag(TMR1, TMR1_FLAG_UPDATE);
    }
}
在更新中断服务函数中,每次定时器溢出触发更新中断时,递增更新中断计数器
updateInterruptCount和溢出计数器
overflowCNT,并及时清除更新中断标志位,保证定时器溢出计数的准确性。
三、测量结果分析
当输入占空比为 20% 的方波信号时,我们得到了如下测量结果:捕获中断进入次数为 29504 次,更新中断进入次数为 5364 次,高电平时间计数值为 4796。
(一)捕获中断次数分析
由于每次完整的高 - 低电平捕获过程会产生两次捕获中断,所以实际检测到的方波脉冲个数为 29504÷2 = 14752 个。这一数据直观地反映了在测量时间段内,输入方波信号的脉冲数量。
(二)更新中断次数分析
更新中断进入 5364 次,表明在测量高电平时间过程中,定时器计数器发生了 5364 次溢出。若定时器为 16 位,其计数器最大值为 65535,每次溢出代表经过了 65536 个定时器时钟周期。这一信息对于准确计算高电平时间至关重要,尤其是当高电平时间较长时,必须将溢出次数纳入计算范围。
(三)高电平时间分析
高电平时间计数值为 4796,若不考虑溢出(当高电平时间很短时合理),结合定时器时钟频率(假设为 24MHz,时钟周期约为 41.67ns),可初步估算高电平时间为 4796×41.67ns≈0.2ms。已知方波高电平占比为 20%,设信号周期为 T,则 0.2T = 0.2ms,可得 T = 1ms,根据频率与周期的关系 f = 1/T,计算出信号频率约为 1kHz。
四、结果验证与注意事项
24M主频跑, 理论上能抓到12MHz的波形



使用特权

评论回复
沙发
GalaxyStroll| | 2025-3-6 19:32 | 只看该作者
楼主,您把GPIO引脚的驱动能力配置为10MHz,这个对于采集12MHz的方波有影响吗?

使用特权

评论回复
板凳
DawnFervor| | 2025-3-8 15:10 | 只看该作者
这个是不是使用Timer的边沿触发中断计数要好一些。
每次进入中断的开消应该也挺大的吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

56

帖子

0

粉丝