这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » msp430单片机捕捉功能两段程序

共7条 1/1 1 跳转至

msp430单片机捕捉功能两段程序

菜鸟
2012-05-30 08:49:27     打赏
#include <msp430f2132.h> unsigned int width[10]={0,0,0,0,0,0,0,0,0,0}; unsigned int i=0; int main( void ) {   // Stop watchdog timer to prevent time out reset   WDTCTL = WDTPW + WDTHOLD;   //BCSCTL1 = 0X8e;  // DCOCTL = 0X51;   P2DIR = 0X02;   P2SEL = 0X02;      P1DIR &=~ BIT1;   P1SEL |= BIT1;       TA0CCTL0 = CAP + CM_3 + CCIS_0 + SCS + CCIE;   TA0CTL = TASSEL_2 + MC_2 ;   _EINT();      while(1)   {        }        } #pragma vector=TIMER0_A0_VECTOR __interrupt void timer_a0_isr(void) {   if(TA0CCTL0 & CM1)   {     TA0CTL = TACLR;     TA0CCTL0=(TA0CCTL0 & (~CM1))|CM0;   }   else if(TA0CCTL0 & CM0)   {     width[i++] = TA0CCR0;     TA0CCTL0 =(TA0CCTL0 & (~CM0))|CM1;     if(i==10)       i=0;   } } 仿真软件的使用产生的实验误差比较大,在采用输入1khz的方波信号时,t/2的值为0.5 ,实际仿真出的值为524/800 = 0.665,这样误差是比较大的,但是随着时钟频率的加大,这个误差会越来越小,时间也会越来越来越精确。 软件延时产生pwm方波,是不是不可靠,并且pwm的占空比不是很好控制,仿真的结果还可以, 捕捉 void Supersonic() {              TACCTL0=OUTMOD_7;     TACCTL0 = CM_3+CCIS_0+CAP;                 //捕获模式,捕获上升沿和 下降,捕获CCIxA     TACCTL0 &= ~CCIFG;                         //清CCR0的标志位       trigger();                               //触发 ultra sonic     TACTL = TASSEL_2+MC_2+TACLR;               //定时器时钟源为SMCLK,启动连续计数,清TAR     while(!(CCIFG&TACCTL0));                 //查CCR0标志位,等待发射的 超声波      value1 = TACCR0;                           //第一个捕获值存入value,捕获到返回的值     TACCTL0 &= ~CCIFG;      while (!(CCIFG&TACCTL0));                   //等待反射回来的超声波 下降沿     value2 = TACCR0;     Distancex = count(value1,value2);          //转化值为时间、距离单位为厘米     Distance = (int) (Distancex*1000);    }



关键词: msp430     单片机     捕捉     功能     两段     程序    

院士
2012-05-30 10:18:20     打赏
2楼

没个说明啥的?


菜鸟
2012-05-30 11:20:23     打赏
3楼
呵呵
没有详细说明啊,现在补充上。前面一段用到msp430单片机用来控制超声波测距的,捕捉到时间差值,然后通过距离与声音的换算关系来算出距离值。这一段主要用到单片机上升下降沿捕捉,然后在中断处理捕捉时间差值。
下面一段主要,只通过一次单片机捕捉到的时间差值来计算的,下面一段注释比较详细。

菜鸟
2013-08-12 15:56:29     打赏
4楼
#pragma vector=TIMER0_A0_VECTOR __interrupt void timer_a0_isr(void) {   if(TA0CCTL0 & CM1)   {     TA0CTL = TACLR;     TA0CCTL0=(TA0CCTL0 & (~CM1))|CM0;   }   else if(TA0CCTL0 & CM0)   {     width[i++] = TA0CCR0;     TA0CCTL0 =(TA0CCTL0 & (~CM0))|CM1;     if(i==10)       i=0;   }

}

哥们这段程序看不懂啊!


菜鸟
2013-08-12 16:09:50     打赏
5楼
有没有完整的程序,我是菜鸟有些看不懂

专家
2013-08-12 16:26:23     打赏
6楼
一款mcu实现时钟功能,没有问题的。随着功能的增多,会出现一些延时的现象,所以高性能,高频率,多线程多任务的方向,在日后会越来越明显。

菜鸟
2015-08-09 16:02:30     打赏
7楼

看不太懂啊

 


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]