030:MSP430单片机Comparator_A模块

1, 比较器 A 模块概述

MSP430F169 含有比较器 A 模块,它是为精确比较测量而设计的,如电池电压监测,产生外部模拟
信号,测量电流,电容和电阻,结合其他模块还可以实现精确的 A/D 模数转换功能。
比较器 A 模块支持精确的 A/D 转换、供电电压管理以及外部模拟信号的监管。
比较器 A 的特点包括:
  同相端和反相端输入复用;
  软件选择 RC 滤波器作为比较器输出;
  输出作为 Timer_A 的捕获输入;
  软件控制端口输入缓冲
  具有中断能力
  可选择参考电压发生器
  比较器和参考电压发生器可以低功耗。

2 比较器 A 模块的结构

[1]比较器A工作原理 

 比较器A可完成对其正向输入端和反向输入端的模拟信号的电压的比较。如果正向输入电压

大于反向输入电压,则CAOUT输出为高,反之则CAOUT输出为低。

注意:若寄存器CAEX位为1时,比较器输出则进行取反操作。

可用CAON位来控制比较器可开启或关闭。在不使用比较器的情况下,可关闭比较器以降低其功耗。

当比较器关闭时, 输出CAOUT总为低。

[2],比较器A基本操作流程

  打开比较器单元

  打开参考电压发生器单元(若比较器的输入信号全为外部输入,则可关闭该单元)

  选择相应输入信号(CA0、CA1和内部参考信号)连接到比较器的输入端口

  分别将单片机比较器A的外部输入端口CA0和CA1接至P2.3和P2.4

  选择配置相关寄存器;

  使能中断信号(若需要)

  读取比较输出信号。

[3] 模拟输入信号选择

通过对P2CAx位的设置可控制输入开关断开或连接比较器与外部输入端口,也可对外部输入端口进行单独控制,

可归纳为: 可以使外部信号输入到比较器的正或负端; 可以使内部参考信号连接到比较器端;

在本质上,输入开关是一个T型开关,它有利于抑制信号路径的失真。

注意:如果比较器已打开,必须保证其输入端已连接信号端,或参考电源与地,否则,这种浮地会导致系统的意外中断和功耗的增大。

寄存器的CAEX位控制输入多路开关,决定哪种信号和比较器的正负端相连接,如果比较器的正负端互换,其输出也将转变,

这便于用户对失调电压进行测量或补偿。 在物理结构上,CA0、CA1分别于外部引脚P2.3和P2.4连接。

[4]输出滤波器选择

比较器的输出信号可通过CAF位来选择是否使用内部滤波器,如果CAF位置位,则信号输出时还会经过RC滤波器再滤波。

如果输入端压差很小,比较器输出将出现振荡。内部与外部电路的寄生效应,信号线、电源线经及其它部件之间的交叉耦合

都将对输出产生影响,会降低比较结果的输出精度及分辨率。当使用内部滤波器则可以减少与之相关的错误振荡输出。

可以清楚的看到使用和不使用输出滤波器的输出振荡比较的结果,因此在使用比较单元时建议选择内部输出滤波器。

 

 [5]电压基准的产生和选择

参考电压(VCAREF)发生器用于产生VCAREF信号,它可以连接到比较器的任意一个输入端。

CAREFx位则用以控制参考电压的产生,CARSEL位则来决定比较器终端选择哪一个参考电压VCAREF。

如果比较器输入端都与外部模拟电压相连接,则应该关闭内部参考电源发生器以降低功耗。

内部电源发生器可产生小数倍(0.5倍或0.25倍)的电源电压或固定的三极管阈值电压(约0.55V)。

[6] 比较器 A 的中断

 

中断电路如图所示。比较器 A 响应中断的条件为:
  有中断源:比较器模块有比较结果输出;
  设置中断标志:CAIES 选择比较器输出的上升沿或下降沿使中断标志 CAIFG 置位;
 中断允许:比较器 A 的中断允许(CAIE 置位)、系统总中断允许(GIE 置位)。
中断响应后,硬件会自动清除中断标志位 CAIFG。

3 比较器 A 模块的寄存器

[1] CACTL1 比较器 A 控制寄存器 1

 CAEX:比较器的输入端,控制比较器 A 的输入信号和输出方向

0: 比较器的正输入端接 P2CA0,正输入端接 P2CA1,输出同相
1: 比较器的正输入端接 P2CA1,正输入端接 P2CA0,输出反相
CARESL:选择内部参考源加到比较器 A 的正端或负端
当 CAEX=0 时:
0: 选择内部参考源加到比较器 A 的正端
1: 选择内部参考源加到比较器 A 的负端
当 CAEX=1 时:
0: 选择内部参考源加到比较器 A 的负端
1: 选择内部参考源加到比较器 A 的正端

CAREFx:选择参考源
0: 内部参考电源关闭,使用外部参考源
1: 0.25 * Vcc
2: 0.50 * Vcc
3: 三极管阈值电压
CAON:比较器 A 开关控制
0: 关闭
1: 开启
CAIES:中断触发沿选择
0: 上升沿触发
1: 下降沿触发
CAIE:中断允许
0: 中断禁止
1: 中断允许
CAIFG:比较器中断标志
0: 没有中断请求
1: 有中断请求

[2] CACTL2 比较器 A 控制寄存器 2

P2CA1:控制输入端 CA1
0: P2CA1 不接 CA1
1: P2CA1 接 CA1
P2CA0:控制输入端 CA0
0: P2CA0 不接 CA0
1: P2CA0 接 CA0
CAF:选择比较器输出端是否经过 RC 低通滤波器
0: CAOUT 不经输出滤波
1: CAOUT 使用输出滤波
CAOUT:比较器 A 的输出
写操作无效

[3] CAPD 比较器 A 端口禁止寄存器

比较器 A 模块的输入输出与 I/O 共用引脚,CAPD 可以控制 I/O 端口输入缓冲器的通断开关。当输入电压
不接近 Vss 或 Vcc 时,CMOS 型的输入缓冲器可以起到分流作用。
CAPDx:端口输入缓冲器控制
0: 输入缓冲使用
1: 输入缓冲禁止

4,程序设计举例

本例主要实现CA0引脚电压检测。当外部输入电压(P2.2)小于0.5VCC时,(P1.1)LED灯闪烁提示用户电压过低。

该例可以实现系统电源监测,读者可以通过调节CA0的电压来观察。

 1 #include <msp430f169.h>
 2 #define uchar unsigned char
 3 #define uint unsigned int
 4 uchar flag = 0;
 5 /*
 6  * 延时函数
 7  */
 8 #define CPU_F ((double)8000000)   //外部高频晶振8MHZ
 9 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
10 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
11 /**
12  *  系统时钟初始化,外部8M晶振
13  */
14 void Init_Clk()
15 {
16   uchar i;
17   BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
18   BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
19   do{
20     IFG1&=~OFIFG;                   //清除振荡器错误标志
21     for(i=0;i<100;i++)
22        _NOP();
23   }
24   while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
25   IFG1&=~OFIFG;
26 }
27 /*
28  * 比较器寄存器配置
29  */
30 void Init_Com_A(){
31     P2SEL = 0x0C;         //配置端口 P2.2 P2.3为第二功能端口
32     P2DIR = 0x04;         //设置P2.2为输出(比较输出), P2.3为输入(比较输入)
33     CACTL1 &= ~CAEX;      //反向输出
34     CACTL1 |= CARSEL + CAREF1 + CAON + CAIE + CAIES;  //CA0为正向输入,参考电压0.5VCC反向输入
35     CACTL2 |= CAF + P2CA0;
36 }
37 /*
38  * 比较器A中断函数
39  */
40 #pragma vector = COMPARATORA_VECTOR
41 __interrupt void COM_A(){
42     flag = 1;
43 }
44 /**
45  * 主函数
46  */
47 void main(void)
48 {
49     WDTCTL = WDTPW | WDTHOLD;    // 关闭看门狗
50     Init_Clk();
51     Init_Com_A();
52     _EINT();
53     uchar k;
54     while(1)
55     {
56         while(flag)
57         {
58             P6DIR |= BIT0;
59             for(k=0;k<10;k++)
60             {
61                 P1OUT = (~(P1OUT&BIT0));
62                 delay_ms(500);
63             }
64             flag = 0;
65         }
66 
67     }
68     
69 }

 

posted @ 2018-10-28 12:45  xiaobingzzh  阅读(925)  评论(0)    收藏  举报