基于 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的波形
|