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.

[参考译文] MSP430L092:温度传感器延迟问题

Guru**** 2559900 points
Other Parts Discussed in Thread: MSP430L092

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/593746/msp430l092-temperature-sensor-delaying-problem

器件型号:MSP430L092
主题中讨论的其他器件: MSP430WARE

我使用 MSP430L092示例代码来测量温度传感器值、但似乎操作有延迟。 例如、我设置了一个条件、即如果 degC 大于30、则连接 LED 的 P1.4端口为高电平。 42秒后、我的 LEDs 处于高电平。 我不理解这种延迟。 如果我设置的传感器结果大于20、则在30秒后该传感器会分别处于高电平。 我将我重新排列的示例代码放在下面。

/*-版权所有-、BSD_EX
*版权所有(c) 2012、德州仪器(TI)公司
*保留所有权利。
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
**源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
**二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
**德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*以及任何明示或暗示的保证、包括但不限于:
*特定适销性和适用性的隐含保证
*不承认目的。 在任何情况下、版权所有者不得或
*派遣国应对任何直接、间接、偶然、特殊、
*典型或必然的损害(包括但不限于
*采购替代货物或服务;丧失使用、数据或利润;
*或业务中断)、无论原因是什么以及任何责任理论、
*无论是合同、严格责任还是侵权行为(包括疏忽或)
*否则)因使用本软件而以任何方式产生、
*即使被告知可能会发生此类损坏。
*
秘书长的报告
*
* MSP430代码示例免责声明
*
* MSP430代码示例是通常包含的低级程序
*高度演示单个外设功能或器件功能
*简明扼要。 为此、代码可能依赖于器件的加电默认值
*寄存器值和设置、如时钟配置和注意
*在组合多个示例中的代码时应采取这种方法、以避免潜在的问题
*效果。 有关 GUI、另请参阅 www.ti.com/grace 和 www.ti.com/msp430ware
*用于外设配置的 API 函数库方法。
*
*--/版权--*/
/*说明:ADC 温度采样*
/********* A_POOL ADC 转换********* /
/**//
/**//
/*+--L092--+*/
/*|*1 14 |*/
/*| 2 13 |*/
/*| 3 12 |*/
/*| 4 11 |*/
/*| 5 10 |*/
/*| 6 9 |*/
/*| 7 8 |*/
/*+--- +*/
/**//
/* D.Dang/D.Archbold/D.Szmulewicz /F. Chen */
/*德州仪器(TI)公司 *
/*使用 IAR 版本5.51.1和 CCS 版本5.3.00090构建*/
/ /

#include

INT 结果;
挥发性短整型 degC;


int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT

//开始配置 A-POOL 寄存器

APCTL = 0;//清除 APCTL 寄存器
APIE |= EOCIE;//为转换结束启用中断
APTRIM = REFTSEL;
APVDIV = TMPSEN;//启用温度传感器
APCNF = CMPON+DBON+CONVON+APREFON+CLKSEL_MCLK;//配置 A-POOL 元素,选择 MCLK 作为 A-POOL 时钟源
P1DIR |=(BIT4+BIT5+BIT6);

while (1)

APCTL = OSEL+oden+OSWP+APPSEL_4+APNSEL_5;//设置通道并开始转换-+oden+
APINT = 0x00;//清除 ADC-DAC-REG
APIFG = 0;
APCTL |= CBSTP+SBSTP+RUNSTOP;
_bis_SR_register (LPM0_bits + GIE);//启用中断后进入 LPM0

结果= APINT;
degC =(((Result-179)*125)/58)+ 30;//请参阅数据表以了解精度和偏移规格

if (degC>20){
P1OUT|=BIT4;


否则{
P1OUT&=~BIT4;

__no_operation();//在此设置断点


//a_pool 中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=APOOL_vector
_interrupt void a_pool (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (APOL_vector)) a_pool (void)
其他
错误编译器不受支持!
#endif

APIFG = 0;//清除中断标志
__BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动状态以计算温度


请、是否有人能给我建议、以防止这种延迟?

提前感谢

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

    您似乎没有从默认值设置时钟。 默认情况下、DCO 将变为1MHz、MCLK 将进行8分频。 这意味着您以125kHz 的频率运行并以相同的速度进行采样(因为您选择 MCLK 作为 ADC 时钟)。 这就是您看到这种延迟的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此代码是 MSP430L092微控制器的一个示例。 我刚才添加了 LED 的代码。

    我将以下代码用于时钟。 我打算将温度传感器代码部分与我的不同代码相结合、这些代码包含 while (1)循环中的以下代码。

    我一起尝试了这些方法,但它不起作用。

    我需要什么来解决这个问题?


    TA0CCTL0 = CCIE; //启用 TA0CCR0中断

    TA0CCR0 = 10; //设置 TA0CCR0的值

    TA0CTL = tassel_2 + MC_1 + TACLR; // SMCLK、向上计数模式



    _bis_SR_register (LPM0_bits + GIE); //输入带中断的 LPM0:CPU、MCLK 被禁用

    // ACLK 激活,SMCLK 激活,HFOSC 打开

    TA0CTL = MC_0+TACLR;

    请提供有关解决方案的更多详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    在时序方面、您不会更改 MCLK、因此该应用程序的运行速度会很慢、因此您的延迟也会如此。 在上面的代码中、您将进入 LPM0、直到您的定时器中断被触发。 然后、在计时器 ISR 内、您需要退出 LPM0才能继续执行代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复。 您的解决方案正在改变时钟分频、不是吗? 我尝试了"CLKDIV0"(A-POOL 预分频器控制位:0*/)。 不管用。

    在我的代码中,如果我设置 if (degC>40),P1.4引脚将在50秒后变为高电平。 我认为该示例代码无法正常工作。 我的传感器值将以秒为单位增加。 我观察到、当时间增加时、我的意思是50秒后、我的 LED 闪烁2次、然后它持续亮起。

    是否有另一个示例代码来测量 msp430l092的内置温度传感器值?

    我无法精确测量它。

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

    我谈到的时钟分频不在 APOOL 结核内、而是在时钟系统内。 时钟系统处于其默认状态、将 DCO 配置为1MHz、将 MCLK 和 SMCLK 分频为125kHz。 如果您希望您的应用能够更快地运行、请参阅 MSP430内的示例、以将您的时钟系统更改为1MHz 或更高。

    就温度传感器示例而言、我们只有一个示例、它位于 MSP430Ware 内、是 msp430x09x_apol_adc_06.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在时钟系统中、我尝试从示例 msp430x09x_TA_07中添加以下代码来设置时钟、但没有变化。 我仍然遇到这个延迟问题。 我认为 degC 将以秒为单位增加,因此它始终会增加。

    CCSCTL7 = 0; //清除 HF 和 LF OSC 故障
    SFRIFG1 = 0; //清除 OFIFG 标志

    CCSCTL4 = SES_0 + SELM_0; //选择 HFCLK/DCO 作为 SMCLK 和 MCLK 的源
    CCSCTL5 = DIVS_0 + DIVM_0; //将 SMCLK 的分频器设置为1
    CCSCTL0_H |= 0xFF; //锁定 CCS
    /*通过写入高字节锁定*/

    我放置我的整个代码。 请帮帮我。 我无法理解您的解决方案。 当 degC 大于20*C 时,我只想让 LED 闪烁,但我没有解决这个问题。


    /*
    *--/版权--*/
    /*说明:ADC 温度采样 *
    /********* A_POOL ADC 转换********* /
    /* *
    /* *
    /* +--L092--+ *
    /* |*1. 14 | *
    /* | 2. 13 | *
    /* | 3. 12 | *
    /* | 4. 11 | *
    /* | 5. 10 | *
    /* | 6. 9 | *
    /* | 7. 8 | *
    /* +--- + *
    /* *
    /* D.Dang/D.Archbold/D.Szmulewicz /F. 陈 *
    /*德州仪器(TI)公司 *
    /*使用 IAR 版本5.51.1和 CCS 版本5.3.00090构建 *
    / /

    #include

    INT 结果;
    挥发性短整型 degC;


    int main (空)

    WDTCTL = WDTPW + WDTHOLD; //停止 WDT

    //开始配置 A-POOL 寄存器

    APCTL = 0; //清除 APCTL 寄存器
    APIE |= EOCIE; //为转换结束启用中断
    APTRIM = REFTSEL;
    APVDIV = TMPSEN; //启用温度传感器
    APCNF = CMPON+DBON+CONVON+APREFON+CLKSEL_MCLK; //配置 A-POOL 元素,选择 MCLK 作为 A-POOL 时钟源
    P1DIR |=(BIT4+BIT5+BIT6);


    /********* /
    /*设置 CCS *
    /* SMCLK = HFCLK/1 ~1MHz */
    /********* /
    CCSCTL0 = CCSKEY; //解锁 CCS
    while (SFRIFG1和 OFIFG) //振荡器标志?

    CCSCTL7 = 0; //清除 HF 和 LF OSC 故障
    SFRIFG1 = 0; //清除 OFIFG 标志

    CCSCTL4 = SES_0 + SELM_0; //选择 HFCLK/DCO 作为 SMCLK 和 MCLK 的源
    CCSCTL5 = DIVS_0 + DIVM_0; //将 SMCLK 的分频器设置为1
    CCSCTL0_H |= 0xFF; //锁定 CCS
    /*通过写入高字节锁定*/
    while (1)


    APCTL = Osel+oden+OSWP+APPSEL_4+APNSEL_5; //设置通道并开始转换-+oden+
    APINT = 0x00; //清除 ADC-DAC-REG
    APIFG = 0;
    APCTL |= CBSTP+SBSTP+RUNSTOP;
    _bis_SR_register (LPM0_bits + GIE); //输入 LPM0并启用中断

    结果= APINT;
    degC=(((((Result-179)*125)/58)+30; //有关精度和偏移规格、请参阅数据表

    if (degC>20){
    P1OUT|=BIT4;


    否则{
    P1OUT&=~BIT4;



    __no_operation(); //在此处设置断点






    //a_pool 中断服务例程
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=APOOL_vector
    _interrupt void a_pool (void)
    #Elif defined (_GNU_)
    void __attribute__((interrupt (APOL_vector)) a_pool (void)
    其他
    错误编译器不受支持!
    #endif

    APIFG = 0; //清除中断标志
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //退出激活以计算温度


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我为时钟分频添加了代码(APOMR=CLKDIV_0;) APOMR 是池操作模式寄存器,但我无法解决此问题。 请、您能纠正我的错误吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    如前所述、问题不是 ADC 的时钟、而是整个系统的时钟。 您需要提高 MCLK 的时钟速度、以便以更快的速率运行您的应用。 然后、您可以按照与所需 ADC 采样规格相匹配的较低速率运行 SMCLK 的 ADC。