因元件布局和低功耗问题,准备采用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的相对误差更小些
TI中文支持网





