一、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如下图所示。
上一篇:MSP430 G2553 Launchpad实现电容测量
下一篇:msp430低功耗LPM
推荐阅读最新更新时间:2024-11-17 02:14
推荐帖子
- 几种常见传感器总结
- 本帖最后由paulhyde于2014-9-1503:34编辑几种常见传感器总结1、红外对管:红外对管是根据红外辐射式传感器原理制作的一种红外对射式传感器。与一般红外传感器一样,红外对管也由三部分构成:光学系统(发射管)、探测器(接收管)、信号调理及输出电路。红外探测器是利用红外辐射与物质相互作用所呈现的物理效应来探测红外辐射的。在此接收管通过对发射管所发出的红外线做出反应实现,实现信号的采集,再通过后续信号处理电路完成信号的采集和输出。1.jpg(3.94
- guoguizhi123 电子竞赛
- 利用运算放大器实现的混频器
- 混频器常常用一个二极管桥式电路(diodebridge)或一个Gilbert单元(Gilbertcell)来实现。这两类混频器都使用了一个本地振荡器(LO)来跳转射频输入的极性。 当LO为正时,RF输入被混频转换为中频(IF)输出时极性不改变。当LO为负时,RF输入转换为IF时极性改变。于是,通过LO“跳转”了RF信号的极性。这种效应相当于以乘以+1或-1(损耗忽略不计)。 混频器还可利用运算放大器来实现(图1)。这种运放混频器采用一种平方波LO来跳转RF输入的极性。U1b、D1、D2
- maker RF/无线
- STM32 CubeMx 软件有更新啦 加入对F1系列的支持(附下载地址)
- 本帖最后由bobde163于2015-1-2413:11编辑 今天还是随手点开CubeMX软件去检查更新,先是检查版本号,发现F4系列的固件包已经更新到1.4.0版了再一检测固件包的更新,往下拉,竟然发现加入了F1系列的固件包下载,等了许久,使用量最多的F1系列终于有了,目前不知道官网上有没有下载的地方,大家自己去看吧,不过使用软件更新应该是可以的,只是速度会比较慢而已。STM32CubeMX4.6.0版程序下载地址:http://pan.baidu.
- bobde163 嵌入式系统
- MSP430 UART 波特率运算
- 各位专家~小弟在研究UART在波特率的转换上有点搞不太懂以下是书上的范例程式码int_usart(){U0CTL|=SWRST;U0CTL|=CHAR;U0TCTL|=SSEL1;//SELECTSMCLK=1MHzUOBR0=0Xa0;U0BR1=0X01;UMCTL0=0Xc0;//波特率19200ME1|=UTXE0+URXE0;....}其中不太懂UOBR0=0Xa0;U0BR1=0X01;UMCTL0=0Xc0;
- irving800621 微控制器 MCU
- 请问如何在PB5.0中查看源代码(用右键的方式)
- 我在PB5.0下要修改代码,但是有的函数在其他文件里(例如在根目录下),我想看一下某个函数的实现体,我在函数上点击右键选择GoToDefinitionof函数名,但是出现对话框说要去project中的setting中设置,我弄了半天发现好像只能一个一个project的设置成yes(GenerateBrowseInformation中),重新编译了好像也没效果,还是看不了其他函数实现体,我应该怎么设置呢,才能对任意一个函数用右键的方式(GoToDefinitionof函
- yy0216 嵌入式系统
- STM32F769I-DISCO评测【3】--STM32F769开发环境建立
- 本节我们介绍STM32F769开发环境,对于ARM内核的芯片开发来说,我觉得还是还用ARM公司的工具比较好些,下面先介绍ARM公司的开发工具MDK5。1、MDK5简介MDK源自德国的KEIL公司,是RealViewMDK的简称。在全球MDK被超过10万的嵌入式开发工程师使用。目前最新版本为:MDK5.22,本次我们使用的就是该版本,该版本使用uVision5IDE集成开发环境,是目前针对ARM处理器,尤其是CortexM内核处理器的最佳开发工具
- qwerghf stm32/stm8