msp430g2553学习笔记 联系客服

发布时间 : 星期三 文章msp430g2553学习笔记更新完毕开始阅读dc861e7d647d27284b735165

#pragma vector=TIMER0_A1_VECTOR

__interrupt void Timer_A(void) {

switch( TA0IV ) //TAIV中断向量寄存器 用于 {

case 2: break; // CCR1 not used 捕获/比较器1

case 4: break; // CCR2 not used 捕获/比较器2

case 10: P1OUT ^= 0x01; // overflow 定时器溢出

break; } }

7,注意:定时器Timer0_A的时钟可以选择为外接时钟输入TACLK(P10),这样当外接一个信号时,定时器Timer0_A就相当于一个计数器使用。这样就可以用Timer0_A接外接信号,Timer1_A接标准的时钟如32768Hz的晶振,就可以实现等精度测频了。其实Timer1_A的时钟也可以外接的,但是在g2553中没有这个外接管脚(P37),所以就只能选择正常的时钟了。

Timer0_A的外接时钟输入TACLK(P10)的设置如下:下面是我实现等精度测频时,两个定时器的初始化程序:

void timer0_init() {

TACTL |= TASSEL_0+MC_2+TACLR; //选择TACLK时钟作为计数时钟源,不分频 必须连续计数模式

P1SEL |= BIT0; //P10为Timer0_A的时钟TACLK输入,接外部待测信号,这样Timer0_A就当作计数器用 }

//Timer1_A采用ACLK作为时钟源计数,这样ACLK就相当于是标准信号,这样两个定时器相当于都工作在计数器方式,

//ACLK 32768Hz作为标准信号,这样可以实现等精度测频

void timer1_init() {

TA1CCTL0 = CCIE;

TA1CCR0 = 32768; //1s定时

TA1CTL |= TASSEL_1+MC_2+TACLR; //选择ACLK时钟作为计数时钟源,不分频 必须连续计数模式 }

8,用定时器和比较器可以实现DAC

使用定时器也可以实现串口通信 四),ADC10

1,ADC10是十位的AD,在g2553上有A0~A7八个可以外接的AD通道,A10接到片上的温度传感器上,其他的通道都接在内部的VCC或GND上。因为是10为的AD所以计算公式如下:

2 ,ADC参考电压的选择:ADC的参考电压可以为:

由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的话,尽量不要用内部的参考电压,最好外接一个比较稳定的电压作为参考电压,因为内部的产生的参考电压不是特别稳定或精度不是特别的高。例如我在使用时遇到的情况如下:

Vref设为2.5V 但实际的值大概为2.475V,选择VCC VSS作为参考,用电压表测得大概为3.58V 还是不小的偏差的。

另外,在有可能的情况下,尽量采用较大的VR+和VR-,以减小纹波对采样结果的影响。

3,ADC10的采样方式有:单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。

4,DTC:因为ADC10只有一个采样结果存储寄存器ADC10MEM,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用DCT,否则转换结果会不停地被新的结果给覆盖。

DTC是转换结果传送控制,也就是转换结果可以不用CPU的干预,就可以自动地存储在指定的存储空间内。使用这种方式转换速度快,访问方便,适用于高速采样模式中。DTC的使用可以从下面的例子中很容易看明白:

#include

#include \

uchar s1[]={\

uchar s2[]={\

void ADC_init() {

ADC10CTL1 = CONSEQ_3 + INCH_1; // 2通道多次转换, 最大转换通道为A1

ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl 参考电压选默认值VCC和VSS

//采样保持时间为16 x ADC10CLKs,ADC内核开,中断使能 MSC多次转换选择开

//如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行 中断使能

//使用DTC时,当一个块传送结束,产生中断

//数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止

ADC10DTC1 = 0x04; //数据传送控制寄存器1 4 conversions 定义在每块的传送数目 一共采样4次所以单块传送4次

//以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送2次

ADC10AE0 |= BIT0+BIT1; // P1.0 P1.1 ADC option select 使能模拟输入脚A0 A1

//不知道为什么,当P10 P11都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候,

//采样是相同的 }

void main(void) {

uint adc_sample[8]={0}; //存储ADC序列采样结果

WDTCTL = WDTPW+WDTHOLD;

BCSCTL1 = CALBC1_12MHZ; //设定cpu时钟DCO频率为12MHz

DCOCTL = CALDCO_12MHZ;

P2DIR |=BIT3+BIT4; //液晶的两条线

init_lcd();