CW32F030系列MCU带有低电压检测(LVD)功能,用于监测VDDA电源电压或外部引脚输入电压,当被监测电压与LVD阈值的比较结果满足触发条件时,将产生LVD中断或复位信号,通常用于处理一些紧急任务。
我们在产品上使用这一功能来检测外部的输入电压,当输入电压降低到一个数值时,我们需要通过软件对外部的硬件电路进行控制,起到保护的作用;当达到设置数值之上的电压时,我们再将对应的外部硬件电路功能打开,所以这一功能对我们产品来说很重要,所以专门测试了一下LVD功能。
主要特性 - 4路监测电压源:VDDA电源电压、PA00、PB00、PB11引脚输入
- 16阶阈值电压,范围2V~3.67V
- 3种触发条件,可以组合使用:电平触发(电压低于阈值)、下降沿触发(电压跌落到阈值以下的下降沿)、上升沿触发(电压回升到阈值以上的上升沿)
- 可触发产生中断或复位信号,二者不能同时使用
- 8阶滤波可配置
- 支持迟滞功能
- 支持低功耗模式下运行,中断唤醒MCU
LVD功能框图
LVD阈值电压
LVD测试实现 将LVD的监测源设置为VDDA,参照CW32F030CxTx StartKit开发板原理图,我们断开J23跳帽,然后使用数字稳压源对其进行供电,这样方便调整VDDA的电压;此外将LVD触发动作配置为中断方式,并使能中断;触发条件为上升沿和下降沿组合使用;通过配置选择不同的阈值电压,结合数字稳压电源的供电调节来测试CW32F030的LVD实际值,具体的代码和测试结果如下所示: 原理图
硬件环境
实现代码 void LVD_Configuration(void)
{
LVD_InitTypeDef LVD_InitStruct;
LVD_InitStruct.LVD_Action = LVD_Action_Irq;
LVD_InitStruct.LVD_Source = LVD_Source_VDDA;
LVD_InitStruct.LVD_Threshold = LVD_Threshold_3p1V;
LVD_InitStruct.LVD_FilterEn = LVD_Filter_Enable;
LVD_InitStruct.LVD_FilterClk = LVD_FilterClk_RC150K;
LVD_InitStruct.LVD_FilterTime = LVD_FilterTime_4095Clk;
LVD_Init(&LVD_InitStruct);
LVD_TrigConfig(LVD_TRIG_FALL | LVD_TRIG_RISE, ENABLE);
LVD_EnableIrq(LVD_INT_PRIORITY);
LVD_ClearIrq();
SysTickDelay(1); LVD_Enable();
}
void LVD_IRQHandler(void)
{
printf("\r\n");
if(LVD_GetFilterResult() != FALSE) printf("\r\nFLTV : H");
else printf("\r\nFLTV : L");
printf("\r\n");
LVD_ClearIrq();
}
测试结果
问题反馈 在CW32F030库函数中宏定义的阈值电压与手册上的不一致,在实测结果时手册上的阈值电压也完全对应不上,且偏差比较大;想问题一下这是软件配置不对,还是单个芯片个体差异导致的,还是说LVD功能就是这样,只能参考不能实例精确使用?
附件
|