低电压检测器(lvd)适用于监测vdda电源电压或外部引脚输入电压,当被监测电压与lvd阈值的比较结果满足触发的条件时,lvd将会产生中断或者复位信号,通常用来处理一些紧急任务。lvd产生的中断或复位标志,只能通过软件程序清零,只有当中断或复位标志被清零后,在再次达到触发条件时,lvd才能再次产生中断或复位信号。本文以cw32l083为例,介绍lvd的使用方法。
低电压检测器(lvd)的主要特性:
1. 4路监测电压源:vdda电源电压,pa00、pb00、pb11引脚输入
2. 16阶阈值电压,范围2.02v-3.76v
3. 3种触发条件,可以组合使用
电平触发:电压低于阈值
下降沿触发:电压跌落到阈值以下的下降沿
上升沿触发:电压回升到阈值以上的上升沿
4. 可触发产生中断或复位信号,二者不能同时产生
5. 8阶滤波可配置
6. 支持迟滞功能
7. 支持低功耗模式下运行,中断唤醒mcu
上图为cw32l083低电压检测器(lvd)的功能框图,lvd不仅可以监测vdda电源电压,也可以监测外部引脚 (pa00、pb00、pb11)输入电压,通过控制寄存器lvd_cr0的source位域来选择,当使用外部引脚来监测电压时,需将对应的gpio端口配置为模拟输入模式(gpiox_analog.piny = 1)。
lvd的输出结果可以从pa01/pa08/pc12/pe02/pf02引脚输出,需将对应的gpio口配置为数字输出模式,同时选择功能复用,下面为具体配置
//lvd i/o口初始化
void lvd_portinit(void)
{
gpio_inittypedef gpio_initstructure = {0};
//打开gpioa时钟
__rcc_gpioa_clk_enable();
//将pa08设置为lvd比较结果输出
gpio_initstructure.pins = gpio_pin_8;
gpio_initstructure.mode = gpio_mode_output_pp;
gpio_init(cw_gpioa, &gpio_initstructure);
//将pa08复用为lvd比较结果输出
pa08_afx_lvdout();
//将pa00设置为lvd的输入口
pa00_analog_enable();
}
迟滞功能
lvd 内置的电压比较器具有迟滞功能,可避免当 lvd 的被监测电压在阈值电压附近时,电压比较器的输出结果发生频繁翻转,增强系统抗干扰能力。只有当被监测电压高于或低于阈值电压达到20mv时,比较器输出信号才会发生翻转。具体波形如下图所示:
lvd的阈值电压根据lvd控制寄存器lvd_cr0的vth位值决定,有效值0 ~ 15,如下表所示:
数字滤波功能
cw32l083的lvd支持数字滤波功能,以增强系统的鲁棒性,可将lvd电压比较的输出结果信号进行数字滤波,小于滤波宽度的信号被滤除,不会触发中断或复位,如下图所示:
通过设置控制寄存器lvd_cr1的flten位域为1,可使能数字滤波模块。设置控制寄存器 lvd_cr1 的 fltclk 位域可以选择数字滤波的时钟:
• fltclk位为1,选择hsiosc作为滤波时钟
• fltclk位为0,选择内置rc振荡器时钟作为滤波时钟,其频率约150khz
相关的宏定义如下所示:
#define lvd_filterclk_rc150k ((uint32_t)0x00000000)
#define lvd_filterclk_hsi ((uint32_t)0x00000010)
控制寄存器lvd_cr1的flttime位域用于选择数字滤波的时钟个数,如下表所示:
从lvd状态寄存器lvd_sr的fltv位域,可以读出经lvd数字滤波后的信号电平;当 gpio 的功能复用为lvd_out时,数字滤波后的信号就可以从gpio输出,以方便观察测量。
lvd中断
lvd支持在低功耗模式下工作,中断输出可将芯片从低功耗模式下唤醒。当被监测电压与lvd阈值的比较结果满足触发条件时,可产生中断或复位信号。产生中断还是复位信号由控制寄存器lvd_cr0的action位域控制:
• action为1,lvd触发产生复位 #define lvd_action_reset ((uint32_t)0x00000002)
• action为0,lvd触发产生中断 #define lvd_action_irq ((uint32_t)0x00000000)
通过设置控制寄存器lvd_cr0的ie位域为1,使能lvd中断,满足触发条件时将产生lvd中断,中断标志位lvd_sr.intf会被硬件置1,用户可以向intf位写0,清除中断标志。设置控制寄存器lvd_cr1的level、fall、rise位域,可选择不同的中断或复位触发方式,三者可组合使用:
• level为1,被监测电压低于阈值时触发中断或产生复位
• fall为1,被监测电压跌落到阈值以下的下降沿触发中断或产生复位
• rise为1,被监测电压回升到阈值以上的上升沿触发中断或产生复位
相关的寄存器具体位域可参考下表:
根据上述内容,简单介绍配置电压监测例程。lvd的输入通道设置为pa00,输出端口为pa08,门限电压为2.02v,利用lvd的中断实现当lvd输入通道电压低于或者高于门限电压时刻(利用上升沿和下降沿),pc03输出电平翻转一次。
void lvd_portinit(void)
{
gpio_inittypedef gpio_initstructure = {0};
//打开gpioa时钟
__rcc_gpioa_clk_enable();
//将pa08设置为lvd比较结果输出
gpio_initstructure.pins = gpio_pin_8;
gpio_initstructure.mode = gpio_mode_output_pp;
gpio_init(cw_gpioa, &gpio_initstructure);
//将pa08复用为lvd比较结果输出
pa08_afx_lvdout();
//将pa00设置为lvd的输入口
pa00_analog_enable();
}
int main(void)
{
lvd_inittypedef lvd_initstruct = {0};
//led初始化
led_init();
//配置测试io口
lvd_portinit();
lvd_initstruct.lvd_action = lvd_action_irq; //配置中断功能
lvd_initstruct.lvd_source = lvd_source_pa00; //配置lvd输入口为pa00
lvd_initstruct.lvd_threshold = lvd_threshold_2p02v; //配置lvd基准电压为2.02v
lvd_initstruct.lvd_filteren = lvd_filter_enable; //lvd滤波模块开启
lvd_initstruct.lvd_filterclk = lvd_filterclk_rc150k;//lvd滤波时钟为150khz
lvd_initstruct.lvd_filtertime = lvd_filtertime_4095clk;
lvd_init(&lvd_initstruct);
lvd_trigconfig(lvd_trig_fall | lvd_trig_rise, enable); //lvd中断为上升沿和下降沿触发
lvd_enableirq(lvd_int_priority);
lvd_clearirq();
firmwaredelay(4800);
lvd_enable(); //lvd使能
while (1)
{
if (gflagirq)
{
pc03_tog();
gflagirq = false;
}
}
}
/** @brief led i/o初始化**/
void led_init(void)
{
gpio_inittypedef gpio_initstructure = {0};
//打开gpioc时钟
__rcc_gpioc_clk_enable();
/* configure the gpio_led pin */
gpio_initstructure.pins = gpio_pin_2 | gpio_pin_3;
gpio_initstructure.mode = gpio_mode_output_pp;
gpio_init(cw_gpioc, &gpio_initstructure);
//leds are off.
pc02_setlow();
pc03_setlow();
}
//lvd中断服务函数
void lvd_irqhandler(void)
{
lvd_clearirq(); //清除中断标志
gflagirq = true; //将gflagirq赋值为ture,使main函数中的if判断语句生效
}
上述例程中的lvd_portinit()为前文lvd的io口配置函数,下面例程为通过寄存器配置lvd,具体功能与上述例程一样。
void lvd_portinit(void)
{
gpio_inittypedef gpio_initstructure = {0};
//打开gpioa时钟
__rcc_gpioa_clk_enable();
//将pa08设置为lvd比较结果输出
gpio_initstructure.pins = gpio_pin_8;
gpio_initstructure.mode = gpio_mode_output_pp;
gpio_init(cw_gpioa, &gpio_initstructure);
//将pa08复用为lvd比较结果输出
pa08_afx_lvdout();
//将pa00设置为lvd的输入口
pa00_analog_enable();
}
int main(void)
{
//led初始化
led_init();
//配置测试io口
lvd_portinit();
cw_lvd->cr0_f.source=1; //选择待监测的电压来源为pa00
cw_lvd->cr0_f.vth=0; //选择阈值电压为2.02v
cw_lvd->cr1_f.flttime=7; //选择 lvd 滤波宽度为4095个时钟周期信号
cw_lvd->cr1_f.fltclk=0; //选择滤波时钟为150khz的rc振荡时钟
cw_lvd->cr1_f.flten=1; //使能 lvd 滤波
cw_lvd->cr1_f.rise=1; //下降沿触发
cw_lvd->cr1_f.fall=1; //上升沿触发
cw_lvd->cr0_f.action=0; //选择lvd触发为中断
cw_lvd->cr0_f.ie=1; //使能lvd中断
nvic_clearpendingirq(lvd_irqn); //使能nvic中断向量表中的lvd中断
nvic_setpriority(lvd_irqn, 3);
nvic_enableirq(lvd_irqn);
firmwaredelay(4800);
cw_lvd->cr0_f.en=1; //使能lvd
cw_lvd->sr_f.intf=0; //清除lvd中断标志
while (1)
{
if (gflagirq)
{
pc03_tog();
gflagirq = false;
}
}
}
/**@brief led i/o初始化**/
void led_init(void)
{
gpio_inittypedef gpio_initstructure = {0};
//打开gpioc时钟
__rcc_gpioc_clk_enable();
/* configure the gpio_led pin */
gpio_initstructure.pins = gpio_pin_2 | gpio_pin_3;
gpio_initstructure.mode = gpio_mode_output_pp;
gpio_init(cw_gpioc, &gpio_initstructure);
//leds are off.
pc02_setlow();
pc03_setlow();
}
//lvd中断服务函数
void lvd_irqhandler(void)
{
lvd_clearirq(); //清除中断标志
gflagirq = true; //将gflagirq赋值为ture,使main函数中的if判断语句生效
}
上述例程功能为在pa00的输入电压值低于2.02v或高于2.02v的时刻,lvd会产生中断,pc03的输出电平会产生翻转,可利用cw32l083的开发板和数字电源进行测试,将pa00和数字电源连接,调节数字电源输出电压,在升高至门限电压以上或者下降至门限电压以下,led1的状态会发生翻转。
lvd的相关函数及功能,可参考下述介绍。
1.void lvd_enablenvic(uint8_t intpriority);
//使能nvic中lvd中断
2.void lvd_disablenvic(void);
//禁止nvic中lvd中断
3.void lvd_trigconfig(uint16_t lvd_trig, functionalstate newstate);
//配置lvd中断/系统复位触发方式
4.void lvd_enableirq(uint8_t intpriority);
//使能lvd中断
5.void lvd_disableirq(void);
//禁止lvd中断
6.void lvd_clearirq(void);
//清除lvd中断标志
7.boolean_t lvd_getirqstatus(void);
//获取lvd中断标志
8.flagstatus lvd_getflagstatus(uint16_t lvd_flag);
//获取lvd指定的状态位
9.boolean_t lvd_getfilterresult(void);
//获取filter结果
10.void lvd_init(lvd_inittypedef* lvd_initstruct);
//lvd初始化
11.void lvd_deinit(void);
//lvd去初始化
12.void lvd_enable(void);
//使能lvd
13.void lvd_disable(void);
//停止lvd
cw32的lvd的使用介绍到此结束。
自动驾驶领头羊Waymo One最大的问题在于需安全员启动并驾驶车辆
Anker推出新品Soundcore Liberty Air 2 Pro耳机
目前国内机器人发展存在三大困境,人机协作被广泛关注有以下几点原因
GTC08L可替代启攀微八通道CP2528、CP2682
第三方兼容万兆单模光模块SFP-10G-LR:高速长距离数据传输性价比之选
CW32 低电压检测器介绍
消息称苹果正测试“打孔屏”原型机,预计将用于iPhone 16/17 Pro系列
更换C型焊钳上的变压器
“机器学习”术语的诞生并不是为了区分统计学
未来激光焊接将广泛应用于电子工业
灵犀微光与芯鼎微共同强化LCOS在AR光波导近眼显示产品的应用
毫米波雷达为智能家居产品提供新思路
考虑接地情况的电容耦合型无线电能传输系统
长江存储 年底可望投产
老板要的是结果,却为何偏偏喜欢听过程?
数控测量|一文读懂中图仪器在机检测与机床校准补偿系统
车用显示屏增长迅速,TI LVDS解决方案来帮忙
如何降低功率CMOS器件的有源和待机功耗和提高应用功效
浅谈电子变压器中的磁耦合问题
变压器的作用是什么