Treasure101 发表于 2025-6-24 22:54

如何使用比较器和计时器测量波的周期?

使用STM32L476,我知道COMP能够使用exti线21触发中断,并可沿着计时器测量连续上升沿或下降沿之间的时间。然而,看了些教程,还没明白如何用自己的代码实现。



xiaoqizi 发表于 2025-7-3 19:05

被测信号 → 比较器同相输入端(COMP+)参考电压 → 比较器反相输入端(COMP-)比较器输出 → 定时器输入捕获引脚

木木guainv 发表于 2025-7-3 21:28

对于交流信号:参考电压设置为信号中值电压
对于数字信号:参考电压设置为逻辑阈值

Jiangxiaopi 发表于 2025-7-4 07:37

比较器的配置
// 以STM32G4为例
void COMP_Config(void)
{
COMP_HandleTypeDef hcomp;

hcomp.Instance = COMP1;
hcomp.Init.InputPlus = COMP_INPUT_PLUS_IO1;       // PA1作为COMP+
hcomp.Init.InputMinus = COMP_INPUT_MINUS_VREFINT; // 内部参考电压
hcomp.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
hcomp.Init.Hysteresis = COMP_HYSTERESIS_HIGH;
hcomp.Init.BlankingSrce = COMP_BLANKINGSRC_NONE;
hcomp.Init.Mode = COMP_POWERMODE_HIGHSPEED;
hcomp.Init.WindowMode = COMP_WINDOWMODE_DISABLE;

HAL_COMP_Init(&hcomp);
HAL_COMP_Start(&hcomp);
}

荣陶陶 发表于 2025-7-4 09:57

使用定时器预分频要根据信号频率调整

Zhiniaocun 发表于 2025-7-4 12:15

可以多次测量取平均,这也可以提高精度

Zhiniaocun 发表于 2025-7-4 12:15

可以多次测量取平均,这也可以提高精度

Zuocidian 发表于 2025-7-4 14:30

可以实时查看指定内存区域,监测栈使用情况

Puchou 发表于 2025-7-4 16:53

// 配置TIM2通道1为输入捕获
void TIM_Config(void)
{
TIM_HandleTypeDef htim;

htim.Instance = TIM2;
htim.Init.Prescaler = 0;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 0xFFFF;
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

HAL_TIM_IC_Init(&htim);

TIM_IC_InitTypeDef sConfigIC;
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;

HAL_TIM_IC_ConfigChannel(&htim, &sConfigIC, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_1);
}

Xiashiqi 发表于 2025-7-4 19:08

测量正弦波的时候,设置比较器参考电压为0V,测量两个上升沿之间的时间

小海师 发表于 2025-7-4 21:21

不同的波形要选用不同的测量方法

Haizangwang 发表于 2025-7-5 08:03

比较器延迟时间的典型值是50-100ns
页: [1]
查看完整版本: 如何使用比较器和计时器测量波的周期?