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.

[参考译文] MSP430FG6426:CTSD16:内部温度传感器不工作?、电压范围

Guru**** 657500 points
Other Parts Discussed in Thread: MSP430FR2355, MSP430FG6426, MSP-TS430PZ100AUSB
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1216567/msp430fg6426-ctsd16-internal-temp-sensor-not-working-voltage-ranges

器件型号:MSP430FG6426
主题中讨论的其他器件: MSP430WAREMSP-TS430PZ100AUSB、MSP430FR2355

您好 Gurus:

我们针对 CTSD16使用 MSP430FG6426来测量一些电压。 我们尝试根据首要原则确定什么是输入电压范围。 从外观来看、我们甚至无法 使用示例代码可靠地测量内部温度。

在我们的电路板上、我们使用单端输入、 P5.0通过一个连接到 AVSS 的1nF 电容器实现。 且没有内部编程增益。

基准电压是多少?   根据数据表和编程指南(www.ti.com/.../slau208q.pdf)中 的不同位置、在模块26中提到了 VEREF。  

提及在 REFCTL:REFON、REFOUT、REFMSTR 中设置时、P5SEL 应设置为1。 但有一些关于 VEREF 模块可以更改 基准电压的令人困惑的语句  

Wed 暂时不知道 P5SEL、因此我们从未设置它、 它似乎从未对正在发生的事情产生任何影响。

那么最终的问题是、如果基准电压是固定的1.16V、那么单端输入的电压范围是多少? 2.32V? 如果是、如何将16位 MSB (我猜与过采样率无关)映射到电压值? (带2的补码)

我施加100mV 电压(高于 AVSS)、 预期的 CTSD16MEM0内容是什么? 假设 LSBACC=0。

100mV/2420mV * 32768 = 1412?  

为什么满标量程和指定的性能范围不同?

----------------

以下代码几乎与 c:\ti\msp430ware_3_80_14_01\examples\devices\MSP430F5xx_6xx\MSP430FG662x_MSP430FG642x_Code_examples\C\中的 msp430fg662x_MSP430FG642x_Code_examples\C\几乎相同。 只添加了少量 LED 闪烁。

通过将 MSP430FR2355 Launchpad 连接到 MSP-TS430PZ100AUSB Launchpad 来运行以下代码 。 很显然、我们只将前者用于调试功能。 通过查看后者的原理图、我们不是通过1nF 电容器接地、而是通过100nF 和10uF 电容器接地。 这两个电路板通过 SBWTDIO/TCK 进行连接。

当我停止调试器时、您可以在下面看到、计算得出的温度为925Kelvin、这显然是不正确的。 对电路板进行下电上电有时会得到一个完全不同的数字。

有任何想法正在发生什么、为什么这不起作用?

感谢您的帮助!

彼得

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

    Peter、您好!

    1. CTSD 外设使用 Vrefbg 作为其基准电压、因此典型值为1.16V
    2. 器件上还有另一个基准电压用于 DAC。
    3. "单端"配置的 FSR 为 、因此在没有增益的情况下、您将获得基准的0到2倍(即2.32V)
    4. 给出了满量程公式、并在使用外部参考时完全使用。 使用内部基准时、"对于指定的性能"是建议仅使用80%的 FSR。 脚注(2)对此作了进一步解释。  
    5. 该配置需要一个外部电阻。 您可以将配置更改为不在线路103上使用外部电阻器(外部电阻器与 CTSD CLK 关联)。 温度传感器还具有与其相关的失调电压(±100mV)、但该失调电压应该仅为~50开尔文。

    此致、

    Luke

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

    Luke、您好!

    非常感谢您提供多个答案。

    以上就是全部

    0V 为0x0、以2s 补充。

    2.32V 在计数中为0x7FFF (只读 MSB)、对吧?

    下周我就在办公桌前、我会再试一次内部热敏电阻。

    校准是否应该用来解决这个100mV 的不确定性?

    谢谢、

    彼得

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

    尊敬的 Peter:

    在 PEUSDO 单端操作中、二进制补码的范围为:

    • 在0x8000处为0  
    • 在0x0000处作为基准电压(1.16V)
    • 0x7FFF 上的2个基准(2.32V)

    但我不建议二进制补码、因为您的信号范围将从0到2Ref。 二进制补码更多地用于表示负数。 偏移二进制格式更适合您的应用。

    您可以通过执行校准来 补偿偏移。

    此致、

    Luke

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

    Luke、您好!

    1) 1)我已经在 Launchpad 上进行了测试、删除了 CTSD16CLKR 位(并删除了2的补码)、 顺便说一下、 https://www.ti.com/lit/ug/slau208q/slau208q.pdf 中似乎没有记录 

    但似乎没有任何差别。 关于不确定性、+-100mV 应该是+-50K、对吗?

    此外、还提到需要在"30.2.11使用集成温度传感器"中添加延迟。 如果我们不使用中断会怎样(请参阅#3)? 有多长时间的延迟?

    有什么想法吗?

    2)我已经看过你们关于 ADC 时钟周期二进制格式的评论。 有趣的是、在本例中、未表示否定。 我考虑二进制补写的唯一原因是我认为负值仍然会被表示(按照30.2.8.1输出数据格式),只是不使用。 下一步我们不会使用2的补码。

    3) 3)在哪些情况下我们应该使用 CTSD16INTDLY? 目前在我们的代码中我们没有使用 中断、但在 CTSD16SC 之后我们等待 IFG0位被设置。  这样可以吗、或者我们应该通过其他方式来实现它吗?

    4)由于范围是0->2.32V,我想我们不能用它来测量 Vcc。  您是否有推荐的方法可以做到这一点?

    5) 5)校准是在工厂完成的还是我们应该手动完成的? 该代码是读取这些值的公平方法吗?  https://github.com/Andy4495/MspTandV/blob/main/src/MspTandV.cpp 此功能是否也可用于 FG6426?

    谢谢。

    彼得

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

    尊敬的 Peter:

    我进一步研究了该示例代码、结果不正确。 TLV 数据(可在数据表中找到)包含 CTSD16的校准值以及内部温度传感器。  

    通过查看 MSPFR413x_ADC10温度示例、我们可以对该器件使用相同的过程、并将校准数据存储在 TLV 数据中。 以下是转换 MSPFG6426示例所执行的步骤。

    1. 找到 TLV 表中温度校准数据的存储器位置
    2. 为内存地址创建#define 以便于阅读
      1. #define CALADC_30C *((unsigned int *) 0x1A1E)
      2. #define CALADC_85C *((unsigned int*) 0x1A20)
    3. 由于我们正在使用校准数据、我们需要更改公式、因此这些校准值基于摄氏度。
    4. 这是基于 FR413x 示例的公式
    5. Results [1]=(results[0]- CALADC_30C)*(85-30)/(CALADC_85C - CALADC_30C)+ 30
      Results[2]= Results[4]* 9/5 + 32;

    我会在下面发布整个代码部分、以便您可以复制和粘贴以自行测试。

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2014, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *******************************************************************************
     *
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430FG662x Demo - CTSD16, Using the Integrated Temperature Sensor, Ext. Res.
    //
    //  Description: This program uses the CTSD16 module to perform a single
    //  conversion on a single channel which is internally connected to the CTSD16's
    //  temperature sensor and an external resistor feeding the CTSD16 clock. Once
    //  the conversion is completed, the result is stored in a variable then converted
    //  into Celsius and Fahrenheit values.
    //
    //  Test by setting a breakpoint at the indicated line. Upon reaching the breakpoint
    //  the conversion result will be stored in the results array. The result will
    //  then be taken and converted into degrees K, C, and F and be saved in the same
    //  array.
    //
    //  ACLK = 32kHz, MCLK = SMCLK = Calibrated DCO = 16.384MHz, SD_CLK = 1.024MHz
    //  * Ensure low_level_init.c is included when building/running this example *
    //
    //  Notes: For minimum Vcc required for CTSD16 module - see datasheet
    //         1nF cap btw Vref and AVss is recommended when using 1.2V ref
    //
    //  Sensor's temperature coefficient is 2.158mV/K (from datasheet)
    //  Sensor's offset voltage ranges from -100mv to 100mV (assume 0)
    //  Vsensor = 1.32mV * DegK + Vsensor_offset (assuming 0mv for offset)
    //  Vsensor = (CTSD16MEM0)/32767 * Vref(mV)
    //  DegK = (CTSD16MEM0 * 1200)/32767/2.158 = (CTSD16MEM0 * 1200)/70711
    //  DegC =  DegK - 273
    //  DegF = (DegC * 9/5) + 32
    //
    //
    //               MSP430FG662x
    //             -----------------
    //         /|\|                |
    //          | |                |
    //          --|RST             |
    //            |                |        (A0.6+/- connected internally)
    //            |A0.6+      VREF |---+    (to CTSD16's temperature sensor)
    //            |A0.6-           |   |
    //            |                |  -+- 1nF
    //            |                |  -+-
    //            |                |   |
    //            |           AVss |---+
    //
    //  M. Swanson
    //  Texas Instruments, Inc
    //  April 2014
    //  Built with Code Composer Studio v5.5
    //******************************************************************************
    #include <msp430.h>
    #define CALADC_30C *((unsigned int *) 0x1A1E)
    #define CALADC_85C *((unsigned int*) 0x1A20)
    unsigned int  results[3];                   // CTSD16 Conversion and Temp Results
                                                // results[0] = raw CTSD16 results
                                                // results[1] = temp in C
                                                // results[2] = temp in F
    
    void main(void) {
        WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog
    
        CTSD16CTL = CTSD16CLKR | CTSD16REFS;   // Use internal ref, external resistor
        CTSD16CCTL0  |= CTSD16SNGL; //| CTSD16DF; // Enable interrupt
        CTSD16INCTL0 |= CTSD16INCH_6;           // Internal temp sensor
        CTSD16IFG &= ~CTSD16IFG0;               // Clear CH0 result interrupt
        CTSD16IE |= CTSD16IE0;                  // Enable CH0 result interrupt
    
        __delay_cycles(2000);                   // Delay ~120us for 1.2V ref to settle
    
        while(1) {
            CTSD16CCTL0 |= CTSD16SC;            // Set bit to start conversion
            __bis_SR_register(LPM0_bits | GIE); // Enter LPM0 w/ interrupts
            __no_operation();                   // For debugger
    
            // Calculate Temperatures in different scales
            results[1] = (results[0] -  CALADC_30C) * (85-30) / (CALADC_85C - CALADC_30C) + 30;
            results[2] = results[4] * 9/5 + 32; 
            __no_operation();                   // SET BREAKPOINT HERE
        }
    }
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=CTSD16_VECTOR
    __interrupt void CTSD16_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(CTSD16_VECTOR))) CTSD16_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch (__even_in_range(CTSD16IV,CTSD16IV_CTSD16MEM0)) {
            case CTSD16IV_NONE: break;
            case CTSD16IV_CTSD16OVIFG: break;
            case CTSD16IV_CTSD16MEM0:
                       results[0] = CTSD16MEM0; // Save CH0 results (clears IFG)
                       break;
            default: break;
        }
        __bic_SR_register_on_exit(LPM0_bits);   // Wake up from LPM0
    }
    

    数据格式不正确、需要二进制补码、因为校准数据是基于二进制补码形成的。 还有一个未经校准的偏移。 如果您自己进行校准、我建议使用偏移版本而不是二进制补码。

    此致、

    Luke Ledbetter

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

    Luke、您好!

    非常感谢您的讲解!

    1) 1)温度现在似乎如预期的那样变化! 正常温度为30°C、加热时上升到40°C。 假设对于负数、我们只需要将结果更改为 整数。 在每隔5-10次运行更长时间后、读取会得到不是30°C 而是47°C 的温度。  有什么想法,那里发生了什么? 由于我们没有使用中断 、因此我们不使用 CTSD16INDLY。

    2) 2) CTSD16校准使用的公式是什么? 我不介意使用两种数据格式。  我们 不使用增益。 我们碰巧使用的增益不是1和16、那么就会变得更加容易。 您如何计算该参数?

    3) 3)您有其他建议来实现最高的 DAC 和 ADC 精度吗? 双向控制通道。 我已经从数据表中看到、(a)使用 更高精度的外部基准电压将对(当前精度为+-1%)以及(b)使用 CTSD16校准和(c) OSR==256都有帮助。

    4) 4) 在哪些情况下我们应该使用 CTSD16INTDLY? 目前在我们的代码中我们不使用 中断、但在 CTSD16SC 之后、我们等待 IFG0位被设置(上一帖子中的代码)。  这样可以吗、或者我们应该通过其他方式来实现它吗?

    非常感谢!

    彼得

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

    尊敬的 Peter:

    1. 我会尝试增加过采样、看看这是否会消除/减少47°C 的读数、我的第一个理论是 噪声、因此过采样应该能够减轻这种变化。 CTSD16INDLY 位用于产生中断时、写入0将在第4个采样后产生中断、写入1将是第1个采样。
      1. 如果您没有使用中断 、您何时/如何获得结果? 您是否轮询寄存器?
    2. 对于温度传感器校准、建议进行单点校准。 这意味着在已知的确切温度下获取读数并存储读数。 然后、您可以更改公式以使值基于校准点。
      1. 例如、如果在25°C 时已知值0x3FFF、则可以将这个点作为参考来计算新温度值。
    3. 对于一般的 ADC 精度、您可以通过对交流信号进行滤波在硬件级别进行信号调节。 还能保持良好的电路板实践。 如果您想要深入了解、我建议您观看 有关 ADC 的 TI 高精度实验室视频、特别是 ADC 噪声视频。 对于软件而言、采样时间和过采样是获得良好 ADC 效果的主要方法。
    4. 如果希望更快地获得结果、可以通过将中断设置为在第一个样本上触发来使用中断延迟。 如果您使用 DMA 并希望快速对结果执行数学运算、这也会很有用。 我个人更喜欢基于中断的版本、因为您可以在结果可用时立即获取结果、并且它无需检查每个循环的寄存器、从而节省代码时间。

    此致、

    Luke

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

    哦、我忘记提到如何读取 AVCC 了。 有一个电压监控器(AVCC sense)、可读取器件的 AVCC/2。 设置与内部温度传感器类似。 如果需要、还有一个用于 VBAT 的传感器、此设置包含在 用户指南中

    此致、

    Luke

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

    Luke、您好!

    感谢您的提问。  当我 测试所有这些功能时、我会做出相应响应。

    很快,关于第二个问题。 我的问题与一般 ADC 用例有关。 如何使用校准数据提高 CTSD16的精度?

    谢谢。

    彼得

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

    尊敬的 Peter:

    我建议阅读 用户指南中的第1.13节 、以了解有关使用 TLV 数据的信息。 下面是 ADC 和 CTSD16失调电压和增益校准的片段。 略低于此值的是温度传感器的类似设置。

    此致、

    Luke

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

    感谢 Luke 提供的所有快速帮助。 温度传感器现在似乎可以正常工作! 我还实现了 ADC 校准值、但它似乎 使 结果倾斜了一点。 但我需要做更多的工作  来确定信号是否来自信号链中的其他某个位置。