CW32的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
通過LVD的控制寄存器LVD_CR0的SOURCE位域來選擇LVD模塊監控的電壓(VDDA電源/ PA00引腳/PB00引腳/PB11引腳),在監測外部引腳電壓時,需將對應的GPIO端口配置為模擬輸入模式(GPIOx_ANALOG.PINy = 1)。
LVD的比較結果可以從PA01/PA08/PC12/PE02/PF02腳輸出,在此之前,需將對應的GPIO口配置為數字輸出模式,同時選擇端口位LVDOUT復用功能。
LVD 內置的電壓比較器具有遲滯功能,只有當被監測電壓高于或低于閾值電壓達到 20mV 時,比較器輸出信號才會發生翻轉,可避免當 LVD 的監測電壓在閾值電壓附近時,電壓比較器的輸出結果發生頻繁翻轉,增強系統抗干擾能力。具體波形如下圖所示:
LVD的閾值電壓根據LVD控制寄存器LVD_CR0的VTH位控制。
LVD支持數字濾波功能,可以增強系統的魯棒性(系統在一定的參數抖動下,維持起某些性能的特性),可以將LVD電壓比較的輸出結果信號進行數字濾波,小于濾波寬度的信號被濾除,不會被觸發中斷或復位,如下圖所示,圖中兩處噪音或其他信號就被濾除了。
通過設置控制寄存器LVD_CR1的FLTEN位域,可以使能數字濾波模塊,當將該位設置為1的時候,會使能數字濾波模塊。
通過設置控制寄存器 LVD_CR1 的 FLTCLK 位域可以選擇數字濾波的時鐘:
? FLTCLK 位為 1,選擇 HSIOSC 作為濾波時鐘
? FLTCLK 位為 0,選擇內置 RC 振蕩器時鐘作為濾波時鐘,其頻率約 150kHz
控制寄存器 LVD_CR1 的 FLTTIME 位域用于選擇數字濾波的時鐘個數,如下表所示:
從 LVD 狀態寄存器 LVD_SR 的 FLTV 位域,可以讀出經 LVD 數字濾波后的信號電平;當 GPIO 的功能復用為 LVD_OUT 時,數字濾波后的信號就可以從 GPIO 輸出,以方便觀察測量。
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可以通過設置控制寄存器 LVD_CR0 的 IE 位域為 1,使能 LVD 中斷,滿足觸發條件時將產生 LVD 中斷,中斷標志位 LVD_SR.INTF 會被硬件置 1,用戶可以向 INTF 位寫 0,清除中斷標志。設置控制寄存器 LVD_CR1 的 LEVEL、FALL、RISE 位域,可選擇不同的中斷或復位觸發方式,三者可組合使用:
? LEVEL 為 1,被監測電壓低于閾值時觸發中斷或產生復位
? FALL 為 1,被監測電壓跌落到閾值以下的下降沿觸發中斷或產生復位
? RISE 為 1,被監測電壓回升到閾值以上的上升沿觸發中斷或產生復位
LVD使用例程介紹:
根據上述內容,可以配置一個關于CW32L083的電壓監測例程,LVD的輸入通道設置為PA00,輸出端口為PA08,門限電壓為2.02V,利用LVD的中斷實現當LVD輸入通道電壓低于或者高于門限電壓時刻(利用上升沿和下降沿),PC03輸出電平翻轉一次。
voidLVD_PortInit(void) { GPIO_InitTypeDefGPIO_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(); } intmain(void) { LVD_InitTypeDefLVD_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; } } } /** *@briefLEDI/O初始化 * */ voidLED_Init(void) { GPIO_InitTypeDefGPIO_InitStructure={0}; //打開GPIOC時鐘 REGBITS_SET(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOC_Msk); /*ConfiguretheGPIO_LEDpin*/ GPIO_InitStructure.Pins=GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_Init(CW_GPIOC, GPIO_InitStructure); //LEDsareoff. PC02_SETLOW(); PC03_SETLOW(); } //LVD中斷服務函數 voidLVD_IRQHandler(void) { LVD_ClearIrq();//清除中斷標志 gFlagIrq=TRUE;//將gFlagIrq賦值為TURE }
根據上述例程可以得到在PA00的輸入電壓值低于2.02v或高于2.02v的瞬間時刻,LVD會產生中斷,PC03的輸出電平會產生翻轉,可利用CW32L083的開發板和一根杜邦線,將PA00和DVCC連接,在連接上的時刻以及拔掉杜邦線的時刻,LED1的狀態會發生翻轉。
來源:武漢芯源半導體
審核編輯:湯梓紅
-
單片機
+關注
關注
6043文章
44621瀏覽量
638625 -
mcu
+關注
關注
146文章
17324瀏覽量
352662 -
檢測器
+關注
關注
1文章
869瀏覽量
47787 -
武漢芯源
+關注
關注
1文章
66瀏覽量
297
發布評論請先 登錄
相關推薦
評論