如何使用比较器和计时器测量波的周期?
使用STM32L476,我知道COMP能够使用exti线21触发中断,并可沿着计时器测量连续上升沿或下降沿之间的时间。然而,看了些教程,还没明白如何用自己的代码实现。被测信号 → 比较器同相输入端(COMP+)参考电压 → 比较器反相输入端(COMP-)比较器输出 → 定时器输入捕获引脚
对于交流信号:参考电压设置为信号中值电压
对于数字信号:参考电压设置为逻辑阈值
比较器的配置
// 以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);
}
使用定时器预分频要根据信号频率调整
可以多次测量取平均,这也可以提高精度 可以多次测量取平均,这也可以提高精度 可以实时查看指定内存区域,监测栈使用情况
// 配置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);
}
测量正弦波的时候,设置比较器参考电压为0V,测量两个上升沿之间的时间
不同的波形要选用不同的测量方法
比较器延迟时间的典型值是50-100ns
页:
[1]