TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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

 

Lina Lian:

Yun Zhang,

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

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

你可以参考一下。

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

Yun Zhang:

回复 Lina Lian:

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

Yun Zhang:

回复 Lina Lian:

#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" 里面是没有的。

 

Lina Lian:

回复 Yun Zhang:

Yun Zhang,

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

Yun Zhang:

回复 Lina Lian:

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

http://e2e.ti.com/support/microcontrollers/msp430/f/166/p/18875/72964.aspx
 
// 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. 

Lina Lian:

回复 Yun Zhang:

Yun Zhang,

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

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

user3899012:

回复 Lina Lian:

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

user4132520:

回复 user3899012:

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

user3899012:

回复 user4132520:

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

灰小子:

回复 user3899012:

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

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F2132的VLO时钟精度和校准问题?
分享到: 更多 (0)