MSP430F149测频7K以下0.1HZ精度,超过9K无法测量无法进入定时器中断求解??

MSP430F149测频7K以下0.1HZ精度,超过9K无法测量无法进入定时器中断求解??

此问题尚无答案
All Replies
  • 秀才70分

    程序有点稀烂,大牛不要笑话。

    其实程序有bug的,7K一下可以精确到0.1Hz
    但是到了7-8K就会多出100多

    到了9K以上就无法显示,其实是无法进入定时器中断。程序里面捕获的中断优先级比定时器高。
    不知道是不是因为优先级的原因使频率高了无法进入定时器中断。

    下面是程序:
    #include  <msp430x14x.h>  
    #include "Lcd1602.h"
    #include "page.h"
    #define CPU_F ((double)800000) 
    #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
    #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 

    unsigned int Cap_Tar,Cap_first,Cap_last,Cap_num,flag=0;
    float F,f;
    unsigned int push,KEY,K;
    void Init_CLK(void)
    {
       unsigned int index;
       BCSCTL1&=~0X00;   //打开XT2振荡器
       do
       {
          IFG1 &= ~OFIFG;       // 清除振荡器失效标志
          for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
        {
            ;
        }
        } while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
        
        BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2  SMCLK  8分频
    }

    void Capture_Init(void)
    {
      
      P1DIR &=~BIT2;  //TA1
      P1SEL |=BIT2;   
      TACCR0=40000; //every intrupt 5ms;
      TACCTL1 =CAP+CM_1+CCIS_0+SCS;//+CCIE;  //Capture , pos. edge,CCIxA ,同步,捕获中断开                                             
      TACTL = TASSEL_2+TACLR+MC_1;//MC_1  //SMCLK,L  up to CCR0
    // TACCTL1 |=CCIE;
    // TACTL |=TAIE;
    }

    void IO_Init(void)
    {
      P1SEL &=~(BIT6+BIT7);
      P1DIR &=~(BIT3+BIT5);
      P1DIR |=BIT6+BIT7;
      P1OUT |=BIT6;
      P1OUT |=BIT7;
      P1SEL &=~(BIT3+BIT5);
      P1IE |=BIT3+BIT5;  
    }

    void main(void)  
    {  
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT 
      
      Init_CLK();
      IO_Init();
      init_lcd_port();
      Capture_Init();  
       lcd_init();//液晶初始化
      _EINT();                 //开总中断  
      display_tem_fre2(0x92,0);
      while(1)
      {
         display_tem_fre2(0x92,F);
      }
    }  



    #pragma vector=TIMERA1_VECTOR  //
    __interrupt void Timer_A1(void)

       switch(TAIV)  
    {

      case 2:
         if(Cap_Tar==0)
       {
          P2OUT &=~BIT0;
         //TACTL |=TACLR;
           push=0;
           flag=0;
          Cap_first=TACCR1;
          Cap_Tar++;
       }
       else
       {
         Cap_last=TACCR1;
         if(Cap_Tar==65535)
           flag++;
          Cap_Tar++;  
          
       }
       break;
       
      case 4:  break;  
      
       case 10:  //定时器中断  大于9K后进不去
          push++; 
         if(Cap_Tar==0)
           push=0;
         
         if(push==51)
          {
            K++;
           if(K==2)
           {
           TACTL &=~TAIE;
           TACCTL1 &=~CCIE;
           K=0;
           }
           Cap_num =Cap_Tar-1;  
           F = (Cap_num+flag*65535)*8000000.0/(50*40000+Cap_last-Cap_first);  //  f=N/T  ,T=200ms 
           Cap_Tar =0;
           push=0;
           flag=0;
           P1OUT ^=BIT6;
           
          }
          break;  
      }  
    }


    #pragma vector=PORT1_VECTOR
    __interrupt void Port_1(void)

      
      delay_ms(100);
      if(((P1IFG&BIT3)>>3))  //按键按下后捕获
      { 
         P1IFG &=~BIT3;
         TACTL |=TAIE;
         TACCTL1 |=CCIE;
         TACTL |=TACLR;
      }
    }


    想做到1M ,还差很远呢,希望有高手帮忙分析下。
    上面的7K一下可以精确到0.1HZ  
    谢谢啦!

  • 探花13285分

    Yuan Fan,

    请查看datasheet P26, "inputs Px.x, TAx, TBx", t(cap) 在3V时,可达50ns, 另外,t(cap)为1.5 cycles, 故是和你的主频有关的。你可以评估一下。只要主频足够高,9k应该是没有问题的。

    希望对您有帮助!O(∩_∩)O~

    BR,

    Lina

  • 秀才70分

    如果向您说的那样,IO的输入50ns

    那应该可以做到20K吧。但是现在是到了大概9K我在线调试的时候

    看到的现象是可以进入捕获CCR1 但是就是无法进入定时器中断。

    不知道是不是因为频率高了,因为CCR1优先级比定时器溢出中断的高所以无法进去?

    还有,您说的主频是指的什么?有点不理解。

    请问149捕获I最大可以做到多少?

    谢谢您的回答

  • 探花13285分

    50ns应该是对应20M,这是硬件可以支持的最高速率,但是肯定受主频,就是MCLK的影响的,因为t(cap)为1.5 cycles,指的就是(1/MCLK)*1.5,你可以算算。O(∩_∩)O~

    希望对您有帮助!O(∩_∩)O~

    BR,

    Lina

  • 榜眼18678分

    你好,

    我有注意到你程序中:

    #define CPU_F ((double)800000) 

    BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2  SMCLK  8分频

    建议MSCL不分频,以8M的速度跑,并且定时器时钟也使用MCLK,然后观察捕获1M信号的现象。

    祝好

    Michael Qian

  • 秀才70分

    你好,时钟是选择的子系统时钟SMCLK 这个是使用的8M没有分频。可能是之前的注释忘了删掉谢谢。

    还是无法解决这个问题。难道捕获只能做到这样?

  • 榜眼18678分

    你好,

    晚点给你回复,我在实验室复现一下。

    祝好

    Michael Qian

  • 秀才70分

    好的,谢谢啦!

  • 秀才70分

      if(Cap_Tar==65535)
           flag++;

    这个地方要改改

      

    if(Cap_Tar==65535)
    {
    flag++;
    Cap_Tar=1;
    }

    不然当Cap_Tar ==65535后Cap_Tar 自加就变零了

    但是改了还是进不去 不是这个的元婴 。我用调试看了下的,到了9K后无法进入定时器中断 。