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.

[参考译文] TMS320F28377D:TMS320f28377D 内部温度传感器的读数

Guru**** 2445440 points
Other Parts Discussed in Thread: TMS320F28377D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1525906/tms320f28377d-readings-of-internal-temperature-sensor-of-tms320f28377d

器件型号:TMS320F28377D
主题: C2000WARE 中讨论的其他器件

工具/软件:

嗨、我使用 TMS320F28377D 微控制器访问我在以下代码中使用的内部温度、但读数始终显示 4095(十进制)、因为我想执行轮询方法而不是中断、我在 drvierlib 中没有使用温度传感器代码  

我使用的函数:-

SysCtl_enablePeripheral (SYSCTL_PERIPH_CLK_ADCA);

ADC_setPrescaler (ADCA_BASE、ADC_CLK_DIV_4_0);

ADC_setupSOC (ADCA_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN13,140); // 140 个时钟周期@ 200MHz = 700ns 时间段、以便温度传感器有足够的时间采集数据

ADC_setInterruptSOCTrigger (ADCA_BASE、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_ADCINT1);

ADC_setInterruptSource (ADCA_BASE、ADC_INT_number1、ADC_SOC_NUMBER0);

ADC_enableContinuousMode (ADCA_BASE、ADC_INT_number1);

ADC_enableInterrupt (ADCA_BASE、ADC_INT_number1);

ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);

ADC_forceSOC (ADCA_BASE、ADC_SOC_NUMBER0);

ADC_enableConverter (ADCA_BASE);

SysCtl_enableTemperatureSensor ();
DEVICE_DELAY_US (1000);

//读取 ADC 结果
sensorSample = ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER0);

//转换为温度(摄氏度)
sensorTemp = ADC_getTemperatureC (sensorSample、3.0F);//假设基准为 3.0V

如果缺少一些内容、请告诉我  

此致

J.Muniniteesh

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

    器件型号:TMS320F28377D

    工具/软件:

    您好、我正在使用 TMS320F28377D 微控制器、并使用了 D:\TI\C2000Ware_4_02_00_00\driverlib\f2837xd\examples\cpu1\adc\adc_ex3_temp_sensor.c 中的示例、但未获得如下所示的正确输出  

    它显示的样本传感器数据始终为零、将从 ADC_readResult () 函数返回、作为我们的参考、我已复制粘贴了我使用的示例代码  

    //###########################################################################
    //
    //文件:adc_ex3_temp_sensor.c
    //
    //标题:样品温度传感器并转换为温度
    //
    //! \addtogroup driver_Example_list
    //!

    ADC 温度传感器转换


    //!
    //! 本示例设置 ePWM 来定期触发 ADC。 。
    //! ADC 将内部连接转换为温度传感器、
    //! 然后通过调用将其解释为温度
    //! ADC_getTemperatureC() 函数。
    //!
    //! \b 监视变量\n
    //! -\b sensorSample — 温度传感器的原始读数
    //! -\b sensorTemp — 将传感器样品解释为温度
    //! 单位为摄氏度。
    //
    //###########################################################################
    //
    //$Release Date:$
    //版权所有:
    // Copyright (C) 2013-2022 Texas Instruments Incorporated - http://www.ti.com/
    //
    //重新分发和使用源代码和二进制格式、无论有无
    //只要满足以下条件、就允许进行修改
    //符合:
    //
    //源代码的重新分发必须保留上述版权
    //声明、本条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //声明、中的此条件列表和以下免责声明
    //随附的文档和/或其他材料
    //分发。
    //
    //既不包括 Texas Instruments Incorporated 的名称、也不包括其名称
    //其贡献者可用于支持或推广衍生产品
    //未经特定的事先书面许可、从本软件下载。
    //
    //本软件由版权持有者和贡献者提供
    //“按原样“及任何明示或暗示的保证、包括但不限于
    //仅限于对适销性和适用性的暗示担保
    //不承认特定用途。 在任何情况下均不得使用版权
    //所有者或贡献者对任何直接、间接、附带、
    //特殊、惩戒性或后果性损害(包括但不包括
    //仅限于替代商品或服务的采购;
    //数据或利润;或业务中断)
    //责任理论,无论是在合同中,严格责任,还是 TORT
    //(包括疏忽或其他)以任何方式产生的使用
    //本软件、即使已被告知可能发生此类损坏。
    //美元
    //###########################################################################
    //

    //
    //包含的文件
    //
    #include “driverlib.h"</s>“
    #include “device.h"</s>“
    /*包含头文件*/
    #include
    #include
    //全局
    //
    uint16_t sensorSample;
    int16_t sensorTemp;
    int16_t 缓冲器[120];
    //
    //函数原型
    //
    void initADC (void);
    void initEPWM (void);
    void initADCSOC (void);
    __ interrupt void adcA1ISR (void);
    //
    //主要
    //
    void main (void)

    //
    //初始化器件时钟和外设
    //
    设备初始化 ();

    //
    //禁用引脚锁定并启用内部上拉电阻。
    //
    device_initGPIO();

    //
    //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
    //
    interrupt_initModule();

    //
    //使用指向 shell 中断的指针初始化 PIE 向量表
    //服务例程 (ISR)。
    //
    Interrupt_initVectorTable();

    //
    //本示例中使用的中断被重新映射到 ISR 函数
    //在该文件中找到。
    //
    INTERRUPT_REGISTER (INT_ADCA1、&adcA1ISR);

    //
    //设置 ADC 和 ePWM 并初始化 SOC
    //
    initadc();
    initEpwm();
    initADCSOC();

    //
    //启用温度传感器并给它 500 us 来启动
    //
    SysCtl_enableTemperatureSensor ();
    DEVICE_DELAY_US (500);

    //
    //启用 ADC 中断
    //
    INTERRUPT_ENABLE (INT_ADCA1);

    //
    //启用全局中断 (INTM) 和实时中断 (DBGM)
    //
    EINT;
    ERTM;

    //
    //启动 ePWM1、启用 SOCA 并将计数器置于向上计数模式
    //

    EPWM_enableADCTrigger (EPWM1_BASE、EPWM_SOC_A);
    EPWM_setTimeBaseCounterMode (EPWM1_BASE、EPWM_COUNTER_MODE_UP);

    //
    //无限循环
    //
    while (1)

    ;
    }
    }

    //
    // initADC — 用于配置 ADCA 并为其上电的函数。
    //
    void initADC (void)

    //
    //将 ADCDLK 分频器设置为/4
    //
    ADC_setPrescaler (ADCA_BASE、ADC_CLK_DIV_4_0);

    //
    //设置分辨率和信号模式(请参阅上面的#defines)和负载
    //相应修整。
    //
    ADC_setMode (ADCA_BASE、ADC_Resolution_12 位、ADC_MODE_SINGLE_END);

    //
    //将脉冲位置设置为延迟
    //
    ADC_setInterruptPulseMode (ADCA_BASE、ADC_PULSE_END_OF_CONV);

    //
    //给 ADC 上电、然后延迟 1ms
    //
    ADC_enableConverter (ADCA_BASE);
    DEVICE_DELAY_US (1000);
    }

    //
    // initEPWM — 用于配置 ePWM1 以生成 SOC 的函数。
    //
    void initEPWM (void)

    //
    //禁用 SOCA
    //
    ePWM_disableADCTrigger (EPWM1_BASE、ePWM_SOC_A);

    //
    //将 SOC 配置为在发生第一个向上计数事件时发生
    //
    EPWM_setADCTriggerSource (EPWM1_BASE、EPWM_SOC_A、EPWM_SOC_TBCTR_U_CMPA);
    EPWM_setADCTriggerEventPrescale (EPWM1_BASE、EPWM_SOC_A、1);

    //
    //将比较 A 值设置为 1000、将周期设置为 1999
    //假设 EPWM 时钟为 100MHz、这将提供 50kHz 采样
    // 50MHz EPWM 时钟将提供 25kHz 采样等
    //也可以通过更改 EPWM 周期来调制采样率
    //直接(确保比较 A 值小于周期)。
    //
    EPWM_setCounterCompareValue (EPWM1_BASE、EPWM_COUNTER_COMPARE_A、1000);
    EPWM_setTimeBasePeriod (EPWM1_BASE、1999);

    //
    //将本地 ePWM 模块时钟分频器设置为/1
    //
    EPWM_setClockPrescaler (EPWM1_BASE、
    EPWM_CLOCK_DIVIDER_1、
    ePWM_HSCLOCK_DIVIDER_1);

    //
    //冻结计数器
    //
    EPWM_setTimeBaseCounterMode (EPWM1_BASE、EPWM_COUNTER_MODE_STOP_FREEZE);
    }

    //
    // initADCSOC — 将 ADCA 的 SOC0 配置为由 ePWM1 触发的函数。
    //
    void initADCSOC (void)

    //
    //配置 SOC0。 温度传感器内部连接至 A13
    //并且需要至少 700ns 的采集时间。
    //
    ADC_setupSOC (ADCA_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、
    ADC_CH_ADCIN13,140);

    //
    //设置 SOC0 以设置中断 1 标志。 启用中断并进行生成
    //确保其标志已清除。
    //
    ADC_setInterruptSource (ADCA_BASE、ADC_INT_number1、ADC_SOC_NUMBER0);
    ADC_enableInterrupt (ADCA_BASE、ADC_INT_number1);
    ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);
    }

    //
    // adcA1ISR - ADC A 中断 1 ISR
    //
    __ interrupt void adcA1ISR (void)

    DMM_DMA App_Serial_Print(“\n\r 温度测量已启动\n\r“);
    //
    //读取原始结果
    //
    sensorSample = ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER0);

    //
    //将结果转换为以摄氏度为单位的温度
    //
    sensorTemp = ADC_getTemperatureC (sensorSample、3.0F);

    snprintf (buff、sizeof (buff)、“温度是%d \n“、sensorTemp);
    DMM_DMA App_Serial_Print(缓冲);
    //
    //清除中断标志
    //
    ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);

    //
    //检查是否发生溢出
    //
    if (true == ADC_getInterruptOverflowStatus (ADCA_BASE、ADC_INT_number1))

    ADC_clearInterruptOverflowStatus (ADCA_BASE、ADC_INT_number1);
    ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);
    }

    //
    //确认中断
    //
    INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP1);
    }

    请帮助我获得正确的输出来读取温度  

    此致

    J.Muniniteesh

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

    您好:

    即使你想轮询与 INT ,我仍然会查看 adc_ex3_temp_sensor pjt 中的 initadc () 函数。 查看上面的代码、您似乎缺少此函数调用

    ADC_setMode (ADCA_BASE、ADC_Resolution_12 位、ADC_MODE_SINGLE_END);

    由于数值达到 4095、我怀疑 ADC 基准未打开、这使得任何转换都看起来像 FSR = 4095。  尝试添加上述函数调用、如果不起作用、我建议逐步执行该示例、以查看是否缺少另一个函数。

    此致、

    Matthew

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

    您好、Matthew、  

    使用 TMS320f28377D EVM 板上的温度示例代码时可以正常工作、但如果我在定制板上使用了这些值、那么您无法获得帮助

    设备初始化 ();

    device_initGPIO();

    interrupt_initModule();

    Interrupt_initVectorTable();

    INTERRUPT_REGISTER (INT_ADCA1、&adcA1ISR);

    initadc();
    initEpwm();
    initADCSOC();

    SysCtl_enableTemperatureSensor ();
    DEVICE_DELAY_US (500);

    INTERRUPT_ENABLE (INT_ADCA1);

    EINT;
    ERTM;

    EPWM_enableADCTrigger (EPWM1_BASE、EPWM_SOC_A);
    EPWM_setTimeBaseCounterMode (EPWM1_BASE、EPWM_COUNTER_MODE_UP);

    while (1)

    ;
    }

    }

    void initADC (void)

    ADC_setPrescaler (ADCA_BASE、ADC_CLK_DIV_4_0);

    ADC_setMode (ADCA_BASE、ADC_Resolution_12 位、ADC_MODE_SINGLE_END);
    ADC_setInterruptPulseMode (ADCA_BASE、ADC_PULSE_END_OF_CONV);

    ADC_enableConverter (ADCA_BASE);
    DEVICE_DELAY_US (1000);
    }

    //
    // initEPWM — 用于配置 ePWM1 以生成 SOC 的函数。
    //
    void initEPWM (void)

    //
    //禁用 SOCA
    //
    ePWM_disableADCTrigger (EPWM1_BASE、ePWM_SOC_A);

    //
    //将 SOC 配置为在发生第一个向上计数事件时发生
    //
    EPWM_setADCTriggerSource (EPWM1_BASE、EPWM_SOC_A、EPWM_SOC_TBCTR_U_CMPA);
    EPWM_setADCTriggerEventPrescale (EPWM1_BASE、EPWM_SOC_A、1);


    EPWM_setCounterCompareValue (EPWM1_BASE、EPWM_COUNTER_COMPARE_A、1000);
    EPWM_setTimeBasePeriod (EPWM1_BASE、1999);

    //
    //将本地 ePWM 模块时钟分频器设置为/1
    //
    EPWM_setClockPrescaler (EPWM1_BASE、
    EPWM_CLOCK_DIVIDER_1、
    ePWM_HSCLOCK_DIVIDER_1);

    //
    //冻结计数器
    //
    EPWM_setTimeBaseCounterMode (EPWM1_BASE、EPWM_COUNTER_MODE_STOP_FREEZE);
    }

    //
    // initADCSOC — 将 ADCA 的 SOC0 配置为由 ePWM1 触发的函数。
    //
    void initADCSOC (void)

    //
    //配置 SOC0。 温度传感器内部连接至 A13
    //并且需要至少 700ns 的采集时间。
    //
    ADC_setupSOC (ADCA_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、
    ADC_CH_ADCIN13,140);

    //
    //设置 SOC0 以设置中断 1 标志。 启用中断并进行生成
    //确保其标志已清除。
    //
    ADC_setInterruptSource (ADCA_BASE、ADC_INT_number1、ADC_SOC_NUMBER0);
    ADC_enableInterrupt (ADCA_BASE、ADC_INT_number1);
    ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);
    }

    //
    // adcA1ISR - ADC A 中断 1 ISR
    //
    __ interrupt void adcA1ISR (void)

    DMM_DMA App_Serial_Print(“\n\r 温度测量已启动\n\r“);
    //
    //读取原始结果
    //
    sensorSample = ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER0);

    snprintf (buff、sizeof (buff)、“ADC 样本是%d \n“、sensorSample);
    DMM_DMA App_Serial_Print(缓冲);
    //
    //将结果转换为以摄氏度为单位的温度
    //
    sensorTemp = ADC_getTemperatureC (sensorSample、3.0F);

    snprintf (buff、sizeof (buff)、“温度是%d \n“、sensorTemp);
    DMM_DMA App_Serial_Print(缓冲);
    //
    //清除中断标志
    //
    ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);

    //
    //检查是否发生溢出
    //
    if (true == ADC_getInterruptOverflowStatus (ADCA_BASE、ADC_INT_number1))

    ADC_clearInterruptOverflowStatus (ADCA_BASE、ADC_INT_number1);
    ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);
    }

    //
    //确认中断
    //
    INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP1);
    }

    我有没有想补充的东西  

    此致

    J.Muniniteesh

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

    Muniniteesh

    如果您在电路板上使用了 TI 示例代码(按原样)、这可以吗?  我想了解您的 PCB 是否存在硬件问题。  如果我们的示例代码也适用于您的 PCB、那么我们可以重点介绍固件。

    此致、

    Matthew

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

    您好、Matthew、

     TI 示例代码在 EVM 板(评估板)上工作、但在带有 TMS320f28377D 微控制器的定制 PCB 上工作、AM 会持续上升 4095(十进制)作为 ADC_readResult 函数的输出  

    此致

    J.Muniniteesh

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

    Muniniteesh

    感谢您的更新。  您能否对连接到 VREFHI/VREFLO 引脚的元件进行注释(请从 DS 中查看下面的内容)?

    我们需要一个外部精密基准来驱动这些引脚。  如果这些是浮动或接地的,它可能解释为什么你看到 4095 一直。

    此致、

    Matthew  

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

    Matthew、  

    感谢您的答复。 在我们的设计中、我们没有连接任何源极来驱动这些引脚、这就是为什么增减 4095 的原因  

    此致

    J.Muniniteesh