電源電壓監控對于單片機來說,也是經常要用的模塊。當需要穩定的工業級產品時,經常要對電源電壓監控,以保證單片機系統工作于正常環境或范圍中。MSP430F16x提供了一個現成的電源電壓監控器模塊SVS,方便檢測電源電壓或者是外部電壓,可以設置為電壓過低時復位 或置標志位。本程序即完成SVS的設置使用的程序庫(msp430f14x沒有此模塊)。
硬件介紹:
MSP430單片機含有的SVS模塊可以很方便的監控電源電壓或外部電壓。
電源電壓監控器(SVS)是用于監控AVCC電源電壓或外部電壓。 SVS的可配置當電源電壓或外部電壓下降到低于用戶選擇的電壓級別時設置一個標志,或產生POR復位。
SVS模塊有以下特點:可以監控AVCC電壓;可選擇產生復位信號;可軟件設置SVS比較器輸出信號;低電壓標志可以被鎖定或被用戶程序訪問;有14個可供選擇的電壓門限;可以監控外部輸入電壓。SVS模塊可以很方便的監控電源電壓或系統的其他電壓,可以產生復位信號或是置標志位。
SVS模塊僅有一個8位的寄存器,使用十分方便。寄存器SVSCTL:
高四位VLDx用來設置監控電源電壓的門限、關閉SVS或者選擇監控外部輸入電壓。具體含義如下:
0000 SVS is off 0001 1.9 V 檢測AVCC是否低于1.9v,以下類似 0010 2.1 V 0011 2.2 V 0100 2.3 V 0101 2.4 V 0110 2.5 V 0111 2.65 V 1000 2.8 V 1001 2.9 V 1010 3.05 1011 3.2 V 1100 3.35 V 1101 3.5 V 1110 3.7 V 1111 檢測由SVSIN引腳輸入的電壓是否低于1.2 V.
當高四位是 0時,SVS模塊是關閉的;1-14分別是對電源電壓監控的14個門限電壓;15時,監控外部電壓,門限電壓是1.2v。
PORON位設置是否啟動電壓低于門限時,單片機復位:1 復位 0 置標志位SVSFG
SVSON位,這位和其他模塊的ON位不太一樣,SVSON位僅僅指示當前SVS模塊是否打開,而不是用來開關模塊的。
SVSOP位,這位是設置SVS內部比較器輸出值:0 輸出低電平 1 輸出高電平。
SVSFG位,標志位 指示是否檢測到低電壓 僅PORON 為0時有效 出現低電壓后置1;改為不會自動清零,必須軟件清零。
另外,SVS模塊值得一提的是:SVS門限電壓已經設置回差帶:每個SVS的水平已經滯后AVCC,接近臨界值時,以減少小型電源電壓的變化的敏感性。 SVS的操作和SVS /掉電互操作如圖:
如圖:為防止電壓在門限附近變動時,SVS過于敏感,每個門限附近都有回差帶。這樣SVS模塊用起來更好用。
程序實現:
程序主要是對SVS模塊寄存器SVSCTL的設置和檢測。首先是設置SVS函數:
void SVSSetup(char voltageLevel,char reset) { SVSCTL = voltageLevel << 4; /*if(voltageLevel == 0x15) //外部輸入 打開對應功能口 { P6SEL |= BIT7; //不需要,當用SVSIN時,自動從此腳檢測 }*/ if(reset <= 1) { SVSCTL |= reset << 3; } }
voltageLevel:這個參數和寄存器SVSCTL的高四位VLDx意思完全一樣,程序僅僅是把它移動到高四位賦值給寄存器SVSCTL,reset參數對應PORON位,也是直接賦值給對應位完成設置。
檢測是否有低于門限電壓的情況出現:
char SvsFlg() { return (SVSCTL&SVSFG); }
這個函數更簡單,僅僅把標志位SVSFG的值返回,以便用戶判斷是否出現了低于門限的情況出現。
標志位清零:
/**************************************************************************** * 名 稱:ClearSvs * 功 能:電源電壓監控器的過低標志 * 入口參數:sync:同步 1:阻塞運行直到該函數電壓恢復正常 0:不阻塞,清除即返回 * 出口參數:無 * 說 明: 若傳入參數為0 不阻塞 則如果電壓沒有恢復到正常范圍 則標志會立即被 單片機重新置位(1) ****************************************************************************/ void ClearSvs(char sync) { if(!sync) { SVSCTL &=~ SVSFG; return; } while(SVSCTL&SVSFG) SVSCTL &=~ SVSFG; //清除標志 直到電壓正常 }
由于SVSFG標志位不會在處理后自動被清除,所以必須軟件清零。這個函數有兩種工作方式,同步阻塞等待,直到電壓恢復正常后才返回和清零后即返回。
程序實現比較簡單,但能夠完成SVS的功能。下面介紹如何使用本程序庫。
使用示例:
使用程序庫的方式還是和以前一樣:工程中加入SVS.c文件,源文件中加入對SVS.h的文件包含。
main.c主要內容如下:
#include//430寄存器頭文件 #include #include "Lcd12864.h" #include "SVS.h" /**************************************************************************** * 名 稱:main主程序 * 功 能:設置串口,輸出信息,從串口讀計算機鍵盤輸入數據,測試串口收發 * 入口參數:無 * 出口參數:無 * 說 明:復位測試時 每次電壓調低再調正常 液晶顯示的數據加1 不復位時 每次調低 輸出一個電壓過低。 ****************************************************************************/ void main() { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; ClkInit(); LcdInit(); /*//======== 電壓過低時復位測試============ __no_init char ff; //復位不初始化 SVSSetup(0x0A,1); //檢測電源電壓 3.05v 低于3.05v時單片機復位 ff++; //此變量 每次復位加1 printf("%d",ff); // 電壓調低(<3.05v)再調高,顯示變量將加1 */ SVSSetup(0x0A,0); //測電源電壓 3.05v 低于3.05v時單片機 不復位 //0x0A 改為0x0f 則對P6.7電壓監控 檢測是否低于1.2v while(1) { if(SvsFlg()) printf("電壓過低"); //SVSFG位必須 軟件清零,如果電壓沒有回到3.05以上, //位的值立即被單片機置為1 ClearSvs(1); //清除標志 直到恢復正常電壓 } }
本程序使用12864液晶來顯示電壓過低的情況:復位時,設置一個__no_init變量,每次復位加1,可以看到電壓調低后,顯示數字被加1.不復位置,顯示電壓過低。這里使用的是12864的底層驅動和printf函數移植,比之前做了稍微更改,這些在注釋中說明的已經很詳細了,這里不在細說。
評論
查看更多