This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F2132的VLO时钟精度和校准问题?

因元件布局和低功耗问题,准备采用F2132的VLO+DCO方式,但发现VLO的误差好象很大的,启用TimerA定时器的1秒大约为1.15秒,且每只芯片都不一样。能否提供F2132的VLO的精度范围、随温度变化的误差情况、及如何对其进行校正或者实测其真实频率?

 

  • Yun Zhang,

    TI官网上有使用DCO对VLO进行校准的说明文档和源代码,见如下链接:

    http://www.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=slaa340a

    你可以参考一下。

    关于VLO的精度和随温度的变化,见下图所示,在datasheet中可以找到。

  • 这相当于32KHz晶振的多少个ppm的?

  • #include <msp430x20x3.h>
    #include "VLO_Library.h"

    int dco_delta;
    int result;

    void main(void)
    {
      volatile unsigned int i;
      WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer
      P1DIR |= 0x11;                            // P1.0,1,4 outputs
      P1SEL |= 0x10;                            // P1.4 = SMCLK

      BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO
      BCSCTL1 = CALBC1_8MHZ;                    // 8MHz cal value
      DCOCTL = CALDCO_8MHZ;                     // 8MHz cal value
      dco_delta = TI_measureVLO();              // dco delta = number of
                                                // 1MHz cycles in 8 ACLK cycles

      CCTL0 = CCIE;                             // CCR0 interrupt enabled
      CCR0 = (8000000 / dco_delta);             //
      TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode
      P1OUT = 0x01;
      _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt

    }
    // Timer A0 interrupt service routine
    __interrupt void Timer_A (void);
    TIMERA0_ISR(Timer_A)
    __interrupt void Timer_A (void)
    {
      P1OUT ^= 0x01;                            // Toggle P1.0
    }

     //********************************************************

    //请问以上代码中的 TI_measureVLO() 在哪里能找到? "VLO_Library.h" 里面是没有的。

     

  • Yun Zhang,

     TI_measureVLO()是用汇编写的。就是下载下来文件夹里对应的那个.S43 (IAR) 或者.asm(CCS)文件中的代码。之后在你的工程中应用时,其实就是将对应汇编文件加进去即可调用TI_measureVLO()函数。

  • 看到另一份帖子,感觉很有用,转过来:

     

    // C version of getting the number of 8Mhz clocks in the VLOCLK:

    unsigned int VLOCLK_measurement(void)
    {
      unsigned int count1, count2;
      
      //Set DCO to 1 Mhz
      
      BCSCTL1 = CALBC1_1MHZ;
      DCOCTL = CALDCO_1MHZ;
      
      BCSCTL1 |= DIVA_3; //aclk divided by 8
      BCSCTL2 = 0;      //clear
      BCSCTL3 |= LFXT1S_2;  //aclk = vloclk
      
      //Set up timer A
      
      TACCTL2 = CM0 + CCIS0 + CAP; //rising edge of aclk, capture mode
      TACTL = TASSEL_2 + MC_2 + TACLR;  //smclk, continuous mode, clear TAR
      
      //clear interrupt flag
      TACCTL2 &= ~CCIFG;

      while(!(TACCTL2 & CCIFG))
      {
      }
      
      count1 = TACCR2;
      
      //clear interrupt flag
      TACCTL2 &= ~CCIFG;
      
      while(!(TACCTL2 & CCIFG))
      {
      }
      
      count2 = TACCR2;
      
      TACCTL2 = 0;
        
      return(count2-count1);
    }

    // On the chip I'm using I compute about 13.5khz for a 14.4khz clock (measured on o'scope). It's better than assuming 12khz. 
  • Yun Zhang,

    其实这个和给你的VLO校准库的原理都是一样的,都是在用DCO来校准VLO,就是通过DCO来测量得到VLO精确的值,从而达到精确定时。示意图如下:

    只是库文件是汇编实现的,这个是用C实验的。


  • 你好,我也碰到了这样的问题,我用的是内部的DCO时钟,但是做出10个样品出来后,每个芯片的时钟频率都不一样。使PWM输出的频率都不一样,有的相差还挺大的,怎样解决呢,求大侠指点!!!

  • 内部的DCO精度确实有限,我也遇到了类似的问题,建议使用高精度的外部晶振

  • 但是我用的是G2332最高的外部晶振只能用到32K,内部的能达到1M,在不换芯片的情况下,不增电路的情况下,有什么解决办法呢?

  • hi jian chen9 ,可以把dco配置到16MHz,这样pwm的相对误差更小些

  • 问题是你需要多高的精度?

  • 误差在一10HZ内,就行了。
  • 当使用内部时钟,想得到较高精度的pwm时,推荐使用较高的频率的dco,并进行校准。