This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430G2X52 比较器CA+求解



大家好,我是msp430的初学者,现在看到CA+模块,有诸多疑问需请教下。

1.该CA+,我看datasheet上有说可以将参考电压V(CAref)输出到port pin上,原文如下:The P2CAx bits allows application of an external signal to the + and - terminals of the comparator, routing of an internal reference  voltage to an associated output port pins.可是当我设置该位时,这两点如何区分啊。

2.当我把两个CAx分别加到比较器的+和-端,同时加上参考电压会是什么结果啊。

3.还有,CA+主要用在什么地方,能否举几个例子

谢谢

  • 比较器的典型应用可以用来测电阻,比如像热敏电阻,比较器结合定时器可以很好的实现电阻测量的应用,在官方的手册中关于比较器这节有详细的说明感兴趣可以试试~

  • 希望能把第1,2两点解答一下,我看MSP430X2XX的手册,感觉没有讲明白啊

    谢谢你

  • 首先把CAEX配置好比如选择0/1,比如CAEX = 0时CARSEL 选择0   VCAREF is applied to the + terminal  选择1    VCAREF is applied to the - terminal 这时VCAREF有4种选择具体看手册,这时你可以配置单片机的引脚链接到比较器的正端和负端,如果你同上加上参考电压就看哪个电压高响应的输出会是电平或者低电平~

  • 你好,谢谢你的解答

    1.手册上意思应该是:配置管脚寄存器P2CAx时,有两种选择(1)外部信号从管脚输入至比较器CA+的+terminal和-terminal。(2)把一个内部参考电压输出给一个引脚。。。这两种功能应该是不能同时进行的。而且第二个相当于是比较器CA+把他的参考电压从引脚进行输出了,这种情况下应如何配置

    2.依照你的意思,当有两个外部输入信号和存在内部参考电压时,也就是说比较器的+terminal 或-terminal中有一个为两个电压(外部信号+参考电压)的叠加,这种理解对不对啊。

    再次感谢!!

  • 如果选用了内部参考的话引脚你就可以不选择CA输入这个功能,把这个引脚当普通的IO用即可,不是两个电压的叠加~

    int main (void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      P1DIR |= 0x01;                                                   // P1.0 output
      CACTL1 = CARSEL + CAREF0 + CAON;          // 0.25 Vcc = -comp, on 相应的IO口可以选择普通IO用
      CACTL2 = P2CA4;                                             // P1.1/CA1 = +comp

      while (1)                                                            // Test comparator_A output
      {
        if ((CAOUT & CACTL2))
          P1OUT |= 0x01;                                         // if CAOUT set, set P1.0
        else P1OUT &= ~0x01;                               // else reset
      }
    }

  • 你好,多谢解答。你贴的我可以明白。但请你看下面这个:


    #include <msp430.h>

    int main (void)
    {
    WDTCTL = WDTPW + WDTHOLD;     / Stop WDT
    P1DIR |= 0x01;        // P1.0 output
    CACTL2 = P2CA4;        // P1.1 = CA1   此为CA+的+ terminal  外部引脚输入
    while (1)                            // Mainloop
    {
    Batt_Check();
    }
    }

    void Batt_Check(void) {
    CACTL1 = CAREF_1 + CAON;           // 0.25*Vcc on P1.1, Comp. on  这里依然为CA+的+ terminal,但为内部参考电压,运行到此处+ terminal上应该有两个电压吧
    i = 16384;                         // delay
    while(i>0) {
    i--;
    }
    CACTL1 = CARSEL + CAREF_2 + CAREF_1 + CAON;             // 0.55V on -, Comp. on
    if (CACTL2 & CAOUT)
    P1OUT ^= 0x01;                             // P1.0 toggle
    else P1OUT |= 0x01;             // P1.0 set
    CACTL1 = 0x00;                      // Disable Comp_A, save power
    }

  • 还有TI 官方的第一个代码:


    #include <msp430.h>                                    该程序应该是从P1.1输出参考电压吧。我的问题是如何配置该输出模式,好像手册里没有说明。我看该程序的意思是

                                                                        CACTL2 = P2CA4;    // CA1/P1.1 = +comp  

                                                                        CACTL1 = CAREF0 + CAON;                       // 0.25*Vcc, Comp. on

                                               这两句就可以直接把参考电压输出到P1.1.

    void delay(void); // Software delay

    int main (void)
    {
    WDTCTL = WDTPW + WDTHOLD;                         // Stop WDT
    CACTL2 = P2CA4;                                                         // CA1/P1.1 = +comp      
    CCTL0 = CCIE;                                                                    // CCR0 interrupt enabled
    TACTL = TASSEL_2 + ID_3 + MC_2;                              // SMCLK/8, cont-mode
    _EINT();                                                                               // enable interrupts

    while (1)                       // Loop
    {
    CACTL1 = 0x00;                                            // No reference voltage
    _BIS_SR(LPM0_bits);                                    // Enter LPM0
    CACTL1 = CAREF0 + CAON;                       // 0.25*Vcc, Comp. on
    _BIS_SR(LPM0_bits);                                       // Enter LPM0
    CACTL1 = CAREF1 + CAON;                           // 0.5*Vcc, Comp. on
    _BIS_SR(LPM0_bits);                                         // Enter LPM0
    CACTL1 = CAREF1 + CAREF0 + CAON;            // 0.55V, Comp. on
    _BIS_SR(LPM0_bits);                                              // Enter LPM0
    }
    }

    // Timer A0 interrupt service routine
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer_A (void)
    {
    _BIC_SR_IRQ(LPM0_bits);                // Clear LPM0 bits from 0(SR)
    }

  • CACTL2 = P2CA4;        // P1.1 = CA1  此处选择P1.1作为比较器的+输入,同时在这个引脚处加了一个小电容到地

    CACTL1 = CAREF_1 + CAON;           // 0.25*Vcc on P1.1, Comp. on 在这把0.25VCC也加到了比较器的+输出同时给电容充电 主要到此条语句的下面延时等待充电完成,比较器的+端只有0.25VCC这一个电压

    CACTL1 = CARSEL + CAREF_2 + CAREF_1 + CAON;             // 0.55V on -, Comp.  然后在比较器的-端加上0.55V的参考电压同时比较这个电压和0.25*Vcc 的大小此时比较器的+端的电压就是电容上的电压。 这样做到电池电压检测的目的~

  • 十分感谢你的耐心解答,我感觉自己已基本明白了。