D1LED-BLUER1300U112131415161718192021222324252627XT2OUT2829303132333435P1.0/TACLK/CAOUTP1.1/TA0P1.2/TA1P1.3/TA2P1.4/SMCLKP1.5/TA0P1.6/TA1P1.7/TA2P4.0/TB0P4.1/TB1P4.2/TB2P4.3/TB3P4.4/TB4P4.5/TB5P4.6/TB6P4.7/TBCLK363738394041424344454647484950515960612345610711896462ABCDC120pFP2.0/ACLK/CA2P5.0/UCB1STE/UCA1CLKP2.1/TAINCLK/CA3P5.1/UCB1SIMO/UCB1SDAP2.2/CAOUT/TA0/CA4P5.2/UCB1SOMI/UCB1SCLP2.3/CA0/TA1P5.3/UCB1CLK/UCA1STEP2.4/CA1/TA2P5.4/MCLKP2.5/ROSC/CA5P5.5/SMCLKP2.6/ADC12CLK/CA6P5.6/ACLKP2.7/TA0/CA7P5.7/TBOUTH/SVSOUTP3.0/UCB0STE/UCA0CLKP3.1/UCB0SIMO/UCB0SDAP3.2/UCB0SOMI/UCB0SCLP3.3/UCB0CLK/UCA0STEP3.4/UCA0TXD/UCA0SIMOP3.5/UCA0RXD/UCA0SOMIP3.6/UCA1TXD/UCA1SIMOP3.7/UCA1RXD/UCA1SOMIXT2OUTXT2INRST/NMITCKTDI/TCLKTDO/TDITMSMSP430F249P6.0/A0P6.1/A1P6.2/A2P6.3/A3P6.4/A4P6.5/A5P6.6/A6P6.7/A7/SVSINVEREF+VREF+VREF-/VEREF-XINXOUTAVCCAVSSX2C220pF8MHzXT2INXT2OUT52XT2IN535857555456X132768Hz 图5.11 实例5.4电路图 2)程序设计 MSP430F249单片机的程序运行主时钟MCLK= DCO=1.1MHz。SMCLK = XT2=8MHz,定时器A时钟源为SMCLK的8分频(即1MHz),增计数模式。时基单位1us,CCR0 = 20000,则定时时间间隔20ms(即PWM 周期=20ms)。两路PWM信号从P1.2(TA1)和P1.3(TA2)输出,设置CCR1=20000*75%=15000,则TA1的PWM信号占空比为75%,设置CCR2=20000*15%=3000,则TA2的PWM信号占空比为15%。
#include
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
BCSCTL2 |= SELS; // SMCLK = XT2 BCSCTL2=DIVS0+DIVS1; //SMCLK 8分频 P1DIR |= 0x0C; // P1.2 和 P1.3输出
P1SEL |= 0x0C; // P1.2(TA1)和P1.3(TA2) 输出 CCR0 = 20000; // PWM 周期
CCTL1 = OUTMOD_7; // CCR1复位/置位
CCR1 = 15000; // CCR1 PWM 占空比75% CCTL2 = OUTMOD_7; // CCR2复位/置位
CCR2 = 3000; // CCR2 PWM 占空比15%
TACTL = TASSEL_2 + MC_1; // 定时器A时钟源为SMCLK,增计数模式 _BIS_SR(LPM0_bits); //进入低功耗LPM0 }
3)仿真与结果分析
仿真结果如图5.12所示,第3路信号为TA1输出的PWM信号,周期为20ms,占空比75%;第4路信号为TA2输出的PWM信号,周期为20ms,占空比15%;
16
图5.12 实例5.4仿真结果图
实例5.5 定时器A精确测量输入信号的周期 任务要求:利用定时器A精确测量某输入信号的周期,周期范围0~999999us。 分析说明:利用定时器A的脉冲捕获功能可以精确地测量外部输入信号的脉宽和周期。捕获模式测量输入信号的周期时,一般设置定时器A为连续模式,如果选定的引脚上出现设定的跳变沿(上升沿或者下降沿),那么定时器A的计数值被复制到TACCRx中,并且中断标志TACCIFGx置位。在捕获中断程序中读取捕获值,相邻两次捕获值之差就是信号周期。由于事件(上升沿或者下降沿)发生的随机性,注意在需要时使能溢出中断,在溢出中断中记录溢出发生次数,周期=65536x溢出次数+两次捕获值之差。
1)硬件电路设计
低频晶振采用32768Hz的晶振,XT2接8MHz晶振(XT2频率范围为400k~16MHz),两个22pF匹配电容,供SMCLK选用。显示使用6位LED共阳极模块,单片机P4口输出每位数码管的段码,P5口的P5.0~P5.5输出位码。输入信号源采用虚拟仪器中的信号发生器。硬件电路图如图5.13所示。
17
7SEG-MPX6-CA-BLUEP40P41P42P43P44P45P46P47P50P51P52P53P54P55U1+AMFM-12131415161718192021222324252627282930313233343552535857555456P1.0/TACLK/CAOUTP1.1/TA0P1.2/TA1P1.3/TA2P1.4/SMCLKP1.5/TA0P1.6/TA1P1.7/TA2P4.0/TB0P4.1/TB1P4.2/TB2P4.3/TB3P4.4/TB4P4.5/TB5P4.6/TB6P4.7/TBCLK363738394041424344454647484950515960612345610711896462P40P41P42P43P44P45P46P47P50P51P52P53P54P55SIGNAL GENERATORP2.0/ACLK/CA2P5.0/UCB1STE/UCA1CLKP2.1/TAINCLK/CA3P5.1/UCB1SIMO/UCB1SDAP2.2/CAOUT/TA0/CA4P5.2/UCB1SOMI/UCB1SCLP2.3/CA0/TA1P5.3/UCB1CLK/UCA1STEP2.4/CA1/TA2P5.4/MCLKP2.5/ROSC/CA5P5.5/SMCLKP2.6/ADC12CLK/CA6P5.6/ACLKP2.7/TA0/CA7P5.7/TBOUTH/SVSOUTP3.0/UCB0STE/UCA0CLKP3.1/UCB0SIMO/UCB0SDAP3.2/UCB0SOMI/UCB0SCLP3.3/UCB0CLK/UCA0STEP3.4/UCA0TXD/UCA0SIMOP3.5/UCA0RXD/UCA0SOMIP3.6/UCA1TXD/UCA1SIMOP3.7/UCA1RXD/UCA1SOMIXT2OUTXT2INRST/NMITCKTDI/TCLKTDO/TDITMSMSP430F249P6.0/A0P6.1/A1P6.2/A2P6.3/A3P6.4/A4P6.5/A5P6.6/A6P6.7/A7/SVSINVEREF+VREF+VREF-/VEREF-XINXOUTAVCCAVSSC1XT2OUT20pFX2C220pF8MHzXT2INX132768Hz 图5.13 实例5.5的硬件电路图 2)程序设计 MSP430F249单片机的程序运行主时钟MCLK= DCO=1.1MHz。SMCLK = XT2=8MHz,定时器A时钟源为SMCLK的8分频(即1MHz),连续计数模式。 定时器A使用捕获模式测量信号周期时,可以让主计数器TAR工作在连续计数模式。捕获模块设置TAx(x=0~2)管脚上升沿触发,每次捕获事件发生后,在捕获中断程序中读取捕获值,相邻两次捕获值之差就是信号周期。对于计数值溢出的情况,可以在溢出中断程序中记录溢出次数,扩展周期信号的测量范围。 #include
#define NUM 16 //测量次数 unsigned int new_cap=0; unsigned int old_cap=0;
char N1; //溢出次数 long diff[NUM]; // 周期测量值 char index=0;
long data; //计算测量周期的平均值
char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff};//共阳极数码管 char position[]={0x20,0x10,0x08,0x04,0x02,0x01};//位码 char led_buf[] = {0,0,0,0,0,0}; //显示缓冲区
void data_to_buf(long data1) // 值送显示缓冲区函数 {
char i;
for (i=0;i<6;i++) {
led_buf[i] = data1; //低位在前 data1=data1/10; }
18
}
void disp(void) // 动态扫描显示函数 {
char i;
unsigned int k; for(i=0;i<6;i++) {
P4OUT = led[led_buf[i]]; P5OUT = position[i]; //if(i==3)
//P4OUT &=0X7F; //小数点
for ( k=0; k<600; k++); // 延时 P5OUT = 0X00; //关显示 } }
void main(void) {
char k1;
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 BCSCTL2 |= SELS; // SMCLK = XT2 BCSCTL2=DIVS0+DIVS1; //SMCLK 8分频 P4DIR=0xFF; //设置P4口为输出 P5DIR=0xFF; //设置P5口为输出
P1SEL = 0x02; //设置 P1.1(TA0)为输入信号管脚 CCTL0 = CM_1 + SCS + CCIS_0 + CAP + CCIE;
// 上升沿捕获+ CCI0A (P1.1)输入+捕获模式+中断允许
TACTL = TASSEL_2 + MC_2+ TAIE; //TA时钟源为SMCLK+连续模式+中断允许
_EINT(); //总中断允许 while(1) {
if(index==0) //多次测量周期值后,取平均值并更新数据 {
data=0;
for(k1=0;k1 data_to_buf(data); //数据送显示缓冲区 disp(); // 动态扫描显示程序 } } #pragma vector=TIMERA0_VECTOR 19 __interrupt void TimerA0(void) //TA0捕获中断服务程序 { new_cap = TACCR0; diff[index] = 65536*N1+new_cap-old_cap; //计算周期值 index++; if (index ==NUM) index = 0; old_cap = new_cap; // 保存捕获值 N1=0; //溢出次数清零 } #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1(void) //TA中断服务程序 { switch( TAIV ) { case 2: break; case 4: break; case 10: N1++; break; //溢出次数加1 } } 3)仿真结果与分析 图5.14 实例5.5仿真结果图 输入信号50Hz,测量的周期信号显示为20000us;调整输入信号为5Hz,显示为200000us;多调整几次输入信号周期,可以看出测试结果正确。 5.3 定时器B MSP430F249单片机的定时器B是具有7个捕获/比较寄存器的16位定时器/计数器。TB 可以支持捕获/比较功能、PWM 输出和定时器功能,TB 的捕获比较寄存器是双缓冲结构,定时器B比定时器A使用更为灵活。 20 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库MSP430F249的定时器计数器(4)在线全文阅读。
相关推荐: