原创 MSP430比较器模块

2009-11-16 15:28 4000 11 11 分类: MCU/ 嵌入式

比较器A模块
   以下图可以看出比较器A的结构大概可以分4部分构成,分别为模拟输入,比较器A核心,低通虑波器,基准电压部分和中断部分组成。


点击看大图
   首先,整个比较器A的工作必需由CAON位置为1时才能工作的,此位属CACTL1控制寄存器。单片机上电时此位是为0的,也就是说比较器是不工作的。
以下大概讲述几个部分电路的功能和一些相关信息。

模拟输入电路:
  外部模拟引脚信号CA0CA1(正负端)可以分别由P2CA0,P2CA1位控制开或关。经过软件的设置可以分别与内部的几个基准电压进行比较(0.5VCC,0.25VCC,三极管门值电压)或外部其中的电压进行比较。

    应用的硬件比较可以分为以下三种组合:
  两个外部引脚输入信号进行比较
  其中一个外部引脚信号与内部的0.5VCC0.25VCC比较
  其中一个外部引脚信号与内部基准电压比较

参考电压发生器
  参考电压电路是可以由CARSELCARERF0CARERF1位来控制电压的产生。通过软件设置可以选择几种电压输出到比较器的输入中作为比较,当然此参考电压也可以通过单片机的引脚往外部提供参考电压之用。

比较器A核心
  比较器CAON位控制开关,CAEX位控制位控制方向。

低通虑波器
  低通虑波器只需一个CAF位来控制此虑波器的功能开与关。此虑波器功能是用于消除比较器输出信号的毛剌,以保证信号的质量和中断请求的可靠性。

中断请求
  比较器A模块是具有中断功能的,如比较器功能CAIE中断允许开了,在CAIF信号产生时将生产中断(当然GIE要为1时)。比较器A模块是具有中断独立向量的,是一个单独的中断,CUP接受请求后会硬件自动清除中断标志位CAIFG
        

比较器模块相关寄存器说明
CACTL1 比较器控制寄存器1
点击看大图
   
CAEX: 控制内部比较器A的输入信号和输出信号的方向

CARSEL:控制内部参考电压加到比较器A的正输入端还是负输入端
由结构图可以看出,CAEX,CARSEL在不同设置时,比较器A输入端的所加的参考电压是有不同的.
请参考以下列表:
-----------------------------------
CARSEL   CAEX     
参考电压接入端
   0       0       
内部参考源加到比较器的正端
   0         1       
内部参考源加到比较器的负端
   1         0       
内部参考源加到比较器的负端
   1         1       
内部参考源加到比较器的正端



CAREF1, CAREF0 选择参考源:
0
使用外部参考
1
选择0.25VCC为参考电压
2
选择0.5VCC为参考电压
3
选择二极管电压为参考电压,须参见具体IC的资料



CAON: 控制比较器A的打开与关闭
0
关闭比较器工作
1
打开比较器工作



CAIES: 中断边沿触发模式选择
0
上升沿使中断标志CAIFG置位
1
下降沿使中断标志CAIFG置位

CAIE:
比较器中断允许
0
禁止中断
1
允许中断



CAIFG: 比较器中断标志
0
没有中断请求
1
有中断请求标志信号


CACTL2 比较器控制寄存器2


点击看大图
   
P2CA1
控制输入端CA1
 0 外部引脚信号不与比较器A连接
 1 外部引脚信号与比较器A连接



P2CA0:控制输入端CA0
 0 外部引脚信号不与比较器A连接
 1 外部引脚信号与比较器A连接



CAF: 选择比较器输出端是否经过RC低通滤波器
 0 开通RC低通滤波器
 1 直通信号



CAOUT: 比较器A输出的信号
 0 CA0小于CA1
 1 CA0大于CA1


CAPD
端口禁止寄存器
  比较器A模块的输入输出与IO口共用引脚,可以控制IO端口输入缓冲器的通断开关.CAPD控制位初始化为0,则端口输入缓冲器有效.当相应位为1,端口输入缓冲器无效。

程序范例:


#include <msp430x14x.h>
void main(void)
{
    WDTCTL = WDTHOLD + WDTPW;         // 关看门狗 
    CACTL1 = CARSEL + CAREF0 + CAON ; //  内部参考接负端,0.25Vcc为参考电压,打开比较器,Vcc/4 = - cmp     
    CACTL2 = P2CA0+CAF;                   // 使用 CA0(接正端) 使用内置滤波器
    P2DIR &= ~BIT3;                   //P2.3为输入
    P2SEL|= BIT3;              //P2.3第二功能
    P1DIR|=0x01;        //P1.0为输出
   // _EINT();                            //开总中断
    while(1)
    {
      
        if((CACTL2 | 0xfe) ==0xff)  //CAOUT=1?  CA0大于CA1.   + > -
        {                             // 比较电压是否超过0.25Vcc
          P1OUT &= ~BIT0;    //P1.0输出为低电平
          CACTL1 &= 0xfe;             // 清中断标志位CAIFG = 0              
        }
        else
        {
          P1OUT |= BIT0;          //P1.0输出为高电平
        }
    }
      
}
#pragma vector="COMPARATORA"_VECTOR
__interrupt void COMPARATORA(void) 
{
        if((CACTL2 | 0xfe) ==0xff)
        {                             // 比较电压是否超过0.25Vcc
          P1OUT &= ~BIT0;  
          CACTL1 &= 0xfe;             // 清中断标志位CAIFG = 0              
        }
        else
        {
          P1OUT |= BIT0;
        }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条