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.

[参考译文] CCS/MSP430G2553:是否可以在不使用外部32768晶体的情况下获得1秒的灵敏度?

Guru**** 2559110 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/903842/ccs-msp430g2553-is-it-possible-to-get-1-second-sensitive-without-using-an-external-32768-crystalcrystal

器件型号:MSP430G2553

工具/软件:Code Composer Studio

计时器每1秒就会进入中断状态、计数器将增加1。

在这种情况下、计数器的值应在1分钟内为60。 在秒表的帮助下、我测量了1分钟并停止了程序。 计数器的值为54。 未发生敏感1秒。

 

/***我在方案中创造了1秒钟,如下所示

我使用了 ACLK 模块。 其频率为12000Hz。 本例中的周期为1/12000秒。

如果我将1/12000秒乘以12000、我将得到1秒。 一切都在这里。

 

(我不确定之后)。 我继续。 如果我将 TA0CCR0设置为12000、我将得到1秒。

1秒=(1/12000)*TA0CCR0=(1/12000)*12000

如果这是错误的、我应该使用哪个公式来确定 CCR0值?

#include 

/*每1秒计数器++*/

无符号 int 计数器=0;
int main (void)

{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器



/***设置 ACLK --> 12kHz=12000hz ***/
BCSCTL1 &=~XTS; //设置 ACLK
BCSCTL3 &&~LFXT1S0;
BCSCTL3 |= LFXT1S1;


/*** TA0设置***/

TA0CTL |= MC_1 + tassel_1+TAIE;//up 模式(最高达 TA0CCR0)-源选择 ACLK



/*** 1秒设置

时间***/ 1/12000。 *
*(1/12000).TA0CCR0=(1/12000)* 12000=1 (1秒)所以、TA0CCR0值必须为12000*/

TA0CCR0=12000;


_ bis_SR_register (LPM3_bits + GIE);//只有 ACLK 可用-常规 intervert 激活

}#tace_funicon=

t0a1 (tace0_vector


= tager0)(tace0_vector (tace0_vector)= tace0_vector (void)
//CCR1不使用

情况4:中断; //CCR2非用

例10: //溢出- counter++
COUNTER++;
中断;
}

}




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    VLO 非常不准确----每份数据表+/-60%(SLAS735J)第32页。 另请注意较大的温度漂移。

    最好的办法可能是使用 ID=3的 SMCLK 并统计半秒。 假设 SMCLK=1MHz、CCR0将为500000/8=62500、这正好合适。

    为此、您还应使用如下方式设置 DCO 常量(CALDCO/CALBC1):

    >BCSCTL1=CALBC1_1MHZ;  
    >DCOCTL = CALDCO_1MHz;  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你,Bruce。 因此、我的理论计算是正确的。  当程序进入中断时、是否没有浪费时间? 这段时间值得考虑吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的算术是正确的,但是12000是(几乎总是)错误的--在这种情况下,它会减少54/60->10%。 根据该表、12000可以是4000或20000。 但 VLOCLK 非常便宜(低功耗)、因此有时它就是您想要的。

    我的经验法则是、进出 ISR 需要大约25个 CPU 时钟。 在1MHz 时为25微秒。 如果您的程序没有执行任何其他操作、25us / 1秒会在生成的时钟中引入25ppm 的固定偏斜、这一点不明显。 如果它执行其他操作、则会显示为抖动、但不会显示漂移。

    就这一点而言、DCO 仅指定为+/-3%(30000ppm)、这就是漂移、因此、如果要构建实时时钟、建议使用20ppm (例如)晶体。

    [编辑:我只是注意到您使用的是 LPM3、因此(如您所注意到的) SMCLK 不可用。 我想我曾经看过一份描述如何使用 DCO 校准 VLO 的 TI 文档。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我做了你说的。 每半秒就会进行一次切换。 计数器值应为120 /分钟。 但当我停止程序时、计数器值为180。  我认为 SMCK 的选择很快。

    SMCLK DIV3=125000hz .so、Periot =1/125000秒。

    我们确定 TA0R 中的1个单位增加是否等于1/125000秒?

    对于 eaxmple:TA0R=1  而 TA0R=2......    TA0R=62500

    当 TA0值从1变为2时、经过的时间是否等于1/125000秒? 这真的是这样吗?

    #include 
    
    /*每0.5秒计数器++*/
    
    无符号 int 计数器=0;
    int main (void)
    
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    
    
    /***设置 SMCLK --> 1MHz=1000.000Hz ***/
    DCOCTL |= CALDCO_1MHz;
    BCSCTL1 |= CALBC1_1MHz;
    BCSCTL2|=DIVS_3; //1000.000/8 = 125000
    
    
    /***TA0设置***/
    
    TA0CTL |= MC_1 + TASSEL_2+TAIE;//UP 模式(最高达 TA0CCR0)-源选择 SMCLK
    
    
    
    /*** 0,5秒设置***/
    
    /* SMCLK 周期1/125000秒。 *
    *(1/125000).TA0CCR0=(1/125000)*62500=0.5s (0.5second)所以,TA0CCR0值必须为62500*/
    
    TA0CCR0=62500;
    
    
    _bis_SR_register (LPM0_bits+GIE);// SMCLK 可用-通用中断激活
    
    }
    
    #pragma vector=TIMER0_A1_vector
    __interrupt void TA0_kesme_func (void)
    {
    switch (TA0IV){
    case 2:break; //CCR1不使用
    
    情况4:中断; //CCR2非用
    
    例10: //溢出- counter++
    COUNTER++;
    中断;
    }
    
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Bruce McKenney47378"]

    Aritmetiğin doğruydu、ancak 12000 (neredeyse her Zaman) yanlış- bu durumda% 54 / 60-> 10 oranında。 Bu Tabloya dayanarak 12000、4000 veya 20000 olabilir。 Ancak VLOCLK çok ucuzzur (düşük güç)、bu yüzden bazen sadece istediğiniz şeydir。

    Temel kuralım,bir isr'ye girip çıkmak için yaklaşık 25 CPU saatinin alınması。 Bu 1MHz'de 25 mikrosaniye。 Programınız başka bir şey yapmazsa、25us / 1sec、sonuçta ortaya çıkan saatte 25ppm'lik bir Sabit eğri tanıtır ve bu fark edilmeyecektir。 Başka şeyler yapıyorsa、bu bir titerşim olarak görünür、ancak sürüklenmez。

    Bu kadarıyla、DCO sadece +/-3%(30000ppm) olarak belirtilir ve bu sapmadır、bu yüzden Gerçek Zamanlı Saat oluşturmak istiyorsanız 20ppm (Örn μ m) Kristal önerilir ć。

    [ Düzenle:LPM3 kullandığınızı FARK etim、bu nedenle (非 ettiğiniz gibi) SMCLK mevcut değil。 Bir keresinde DCO kullanarak VLO'nun nasıl kalibre edileceğini açıklayan bir ti belgesi gördüm。]

    [/报价]

    非常感谢您提供宝贵的信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >     DCOCTL |= CALDCO_1MHZ; 
    >     BCSCTL1 |= CALBC1_1MHZ;

     These should be "=", not "|=". They're non-0 at reset, so I'm not quite sure what settings you're ending up with.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你是对的。 我对其进行了编辑并重试。 计数器输出121。 工作正常。谢谢