电源电压监控对于单片机来说,也是经常要用的模块。当需要稳定的工业级产品时,经常要对电源电压监控,以保证单片机系统工作于正常环境或范围中。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函数移植,比之前做了稍微更改,这些在注释中说明的已经很详细了,这里不在细说。