• MSP430 G2553 比较器Comparator_A+、数据流程图DFD、状态转换图STD


    一、CA+构造

    MSP430G2553带有一个比较器Comparator_A+(CA+),其构造框图如下图所示。

    二、输入 & 输出

    如上图所示,比较器有一个同向输入端(V+)和一个反向输入端(V-)。通过软件设置,V+端可以连接到CA0~CA2三个外部管脚之一,或者三个内部电压基准之一;V-端可以连接到CA1~CA7七个外部管脚之一,或者三个内部电压基准之一。内部电压基准可以是0.5*Vcc、0.25*Vcc,或者内部一个二极管的导通电压(约0.55V)。

    输出信号可以连接至Timer的外部时钟输入,或者CAOUT对应的管脚;输出信号变化时,可触发CAIFG中断。

    CAx、CAOUT对应的MSP430G2553管脚如下图所示。

    三、相关设置寄存器

    CA+主要寄存器有CACTL1、CACTL2、CAPD三个。其中CAPD用于断开与GPIO管脚相连的数字电路部分,以提高CA+的性能;实际上,当某个管脚被设置成CA+输入时,CAPD会自动置位,因此对于CAPD的操作一般不需关心(除非该管脚还同时用于输入某个数字信号)。

    - CACTL2寄存器的P2CAx位段:选择输入信号对应的管脚。

    - CACTL1寄存器的CAEx位:切换V+、V-输入信号。该功能用于当输入信号非常接近时,一般用不到。

    - CACTL1寄存器的CAON位:关闭/开启CA+。

    - CACTL1寄存器的CAREFx位段和CARSEL位:CAREFx位段用于选择CA+参考电压,可以为0.5*Vcc、0.25*Vcc或~0.55V;CARSEL位用于选择参考电压连接至V+还是V-端。注意当V+、V-都连接到外部管脚时,内部参考电压须关闭。

    - CACTL2寄存器的CAF位:关闭/开启输入信号滤波。建议开启。

    - CACTL2寄存器的CASHSHORT位:将输入信号短接。一般用不到。

    四、一个有意思的例子

    将电位器连接到P1.1,当P1.1的电压高于0.5*Vcc时,LED灯闪烁;否则LED灯熄灭。由于P1.1对应MSP430G2553芯片的RX,G2 Launchpad已经将其连接到了USB转串口芯片上,因此P1.1作为CA1使用时应将J3上的相关跳线断开。

     1 #include "io430.h"
     2 
     3 #define LED1 BIT0  //red
     4 
     5 #define TRUE 1
     6 #define FALSE 0
     7 
     8 #define LOW_INPUT 0
     9 #define HIGH_INPUT 1
    10 
    11 //global variable
    12 char state = LOW_INPUT;
    13 char flash = FALSE; //start with low input, no flash on LED
    14 
    15 void main(void)
    16 {
    17     // Stop watchdog timer to prevent time out reset
    18     WDTCTL = WDTPW + WDTHOLD;
    19     
    20     // LED setup
    21     P1OUT = 0;
    22     P1DIR |= LED1;
    23     
    24     // DCO setup
    25     BCSCTL1 = CALBC1_1MHZ; //running at 1MHz
    26     DCOCTL = CALDCO_1MHZ;
    27     
    28     // ACLK setup
    29     BCSCTL3 |= LFXT1S_2; //ACLK source: VLO, measured as 10kHz
    30     BCSCTL1 |= DIVA_3; //ACLK = VLO divided by 8: 1.25kHz
    31     
    32     // Timer0_A setup
    33     TA0CCR0 = 250 - 1; //timer overflow freq: 1250/250 = 5Hz(0.2s)
    34     TA0CCTL0 = CCIE;//enable interrupt
    35     TA0CTL = TASSEL_1 + MC_1 + TACLR;//ACLK, no div, up mode, clear timer
    36     
    37     // Comparator_A+ setup
    38     CACTL1 = CAREF_2 + CARSEL + CAIE;//0.5 Vcc ref on V-, enable interrupt on rising
    39     CACTL2 = P2CA4 + CAF; //input CA1 (P1.1, remove the jumper) on V+, filter on
    40     CACTL1 |= CAON; //turn on comparator
    41     
    42     __enable_interrupt();
    43     LPM3;
    44     
    45 }
    46 
    47 #pragma vector = TIMER0_A0_VECTOR
    48 __interrupt void CCR0_ISR(void)
    49 {
    50     //TA0CCR0 flag clearing is automatic
    51     if(flash == FALSE)
    52     {
    53         P1OUT &= ~LED1; //led off
    54     }
    55     else
    56     {
    57         P1OUT ^= LED1; //toggle LED
    58     }
    59 }
    60 
    61 #pragma vector = COMPARATORA_VECTOR
    62 __interrupt void COMPA_ISR(void)
    63 {
    64     switch(state)
    65     {
    66     case LOW_INPUT:
    67         if((CACTL2 & CAOUT) == 0x01)
    68         {
    69             state = HIGH_INPUT;
    70             CACTL1 |= CAIES; //value high, so watch for falling edge
    71             flash = TRUE; //let led flash      
    72         }
    73         break;
    74     case HIGH_INPUT:
    75         if((CACTL2 & CAOUT) == 0x00)
    76         {
    77             state = LOW_INPUT;
    78             CACTL1 &= ~CAIES; //value low, so watch for rising edge
    79             flash = FALSE; //turn LED off      
    80         }
    81         break;      
    82     }
    83 }

    这个例子有意思的地方在于,展示了数据流程图(Data Flow Diagram, DFD)和状态转换图(State Transition Diagram, STD)这两个重要的概念。两个中断程序分别处理来自Timer0_A和CA+的中断,形成两个“process”,它们有自身独有的变量/参数,同时还共享了flash(LED是否闪烁)这一变量。此外,CA+的中断程序包含HIGH_INPUT和LOW_INPUT两种状态,是一个非常简单的状态机。

    程序的DFD和CA+中断程序的STD如下图所示。

  • 相关阅读:
    【洛谷 1536】村村通
    【洛谷 1551】亲戚
    【UOJ 300】感冒病毒
    【洛谷 2299】Mzc和体委的争夺战
    【洛谷 3371】模板_单源最短路径(弱化版)
    【洛谷 2910】寻宝之路
    【洛谷 1359】租用游艇
    【UOJ 275】最短路径问题
    【UOJ 38】 股票经济人通信网络
    【UOJ 276】无向图最小环
  • 原文地址:https://www.cnblogs.com/zlbg/p/4735060.html
Copyright © 2020-2023  润新知