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/TM4C129ENCPDT:内部温度测量设置

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/775222/ccs-tm4c129encpdt-internal-temperature-measurement-setup

器件型号:TM4C129ENCPDT

工具/软件:Code Composer Studio

关于 http://e2e.ti.com/support/microcontrollers/other/f/908/t/594823 、似乎仍然不清楚如何进行正确设置。

在一个应用中、ADC0以全速(2MHz)运行、ADC1也是如此。  ADC1仅用于内部温度测量。

通过使用为采样保持提供64个 ADC 时钟的配置、我们获得了一些远低于预期的测量值(使用热风枪时的测量范围为30-47°C、最高可达100°C)。

我们尝试读取3-10个连续读数(禁用全局中断)、但温度读数仍然很差。

只有添加过采样、我们才会获得有用的结果:ADCHardwareOversampleConfigure (ADC1_base、64);

这似乎很奇怪、因为与勘误表相比、这不符合逻辑。

有没有好的解释? 我们是否错过了什么?

代码如下所示:

初始化:

  //
   //设置两个 ADC 的时钟(ADC1_base 设置两个 ADC 的时钟)
   // adc_clock_divider = 30 ->将 ADC 时钟设置为对应于1MSP/s 的16MHz
   // adc_clock_divider = 15 ->将 ADC 时钟设置为对应于2MSP/s 的32MHz
   //
   ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、ADC_CLOCK_DIVIDER);

///------------------

//
//初始化用于内部芯片温度测量的内部 ADC1外设。
//温度测量是在-in 另一个函数中完成的-参见下面的。
//    

//
//设置序列发生器编号
//
uint32_t g_uisequencernum = 3;
静态空 ADC1Init (空)


   //
   //必须启用 ADC1外设才能使用。
   //
   MAP_SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);

   //
   //等待 ADC1外设就绪。
   //
   while (!map_SysCtlPeripheralReady (SYSCTL_Periph_ADC1))
   {}

    //
    //将自动平均值设定为64。
   //
   ADCHardwareOversampleConfigure (ADC1_base、64);

   //
   //在配置 ADC1采样序列发生器之前,确保其被禁用。
   //
   MAP_ADCSequenceDisable (ADC1_base、g_uisequencernum);

   //
   //使用处理器信号触发器启用采样序列。
   //
   MAP_ADCSequenceConfigure (ADC1_base、g_uisequencernum、ADC_TRIGGER_PROCESSORT0);

   //
   //按顺序配置步骤0。
   //
   ///map_ADCSequenceStepConfigure (ADC1_base、3、0、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END| ADC_CTL_SHOLD_16);
   
   /*
   *      设置 ADC 序列发生器的温度读数
   *
   * ADC_CTL_TS      :温度传感器选择
   * ADC_CTL_IE      :中断使能
   * ADC_CTL_shold_16   :采样保持16个 ADC 时钟
   * ADC_CTL_END      :序列结束选择
   *
   *
   MAP_ADCSequenceStepConfigure (ADC1_base、g_uisequencernum、0、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_SHOLD_64 | ADC_CTL_END);

   //
   //由于采样序列现在已配置,因此必须启用它。
   //
   MAP_ADCSequenceEnable (ADC1_base、g_uisequencernum);

   //
   //清除中断状态标志。  这样做是为了确保
   //中断标志在我们进行采样之前被清除。
   //
   MAP_ADCIntClear (ADC1_BASE、ADCIntClear);

   返回;

用于读取温度的函数:


   uint32_t ui32Temperature = 0;//用于从 ADC 读取值
   int32_t i32Temperature = 0;//用于计算实际温度
   uint8_t i = 3;
   
#if defined (target_IS_TM4C129_RA0)|| defined (target_IS_TM4C129_RA1)
   //如果平台是 TM4C129
   /*uint32_t n;
   taskENTER_critical ();   //<---- 输入临界区!
   IntMasterDisable();   //<--- 禁用中断!
   对于(n=0;n<1000;n++)
   {
      MAP_ADCIntStatus (ADC1_BASE、3、false);
   }*/
   //while (!map_ADCIntStatus (ADC1_base、3、false)){}//等待转换完成,正常采样模式启动的乒乓队列中仍可能存在一些采样。
   对于(i=3;i>0;i--)//运行3个循环以满足温度传感器内部的设置时间(请参阅勘误表: www.ti.com/.../spmz850c.pdf)
   {
      //请参阅中的 TivaWare 示例: /examples/peripherals/adc/temperature_sensor.c
      MAP_ADCProcessorTrigger (ADC1_base、g_uisequencernum);//触发 ADC 转换。
      while (!map_ADCIntStatus (ADC1_base、g_uisequencernum、false)){}//等待转换完成。
      MAP_ADCIntClear (ADC1_base、g_uisequencernum);//清除 ADC 中断标志。
      MAP_ADCSequenceDataGet (ADC1_base、g_uisequencernum、&ui32Temperature);//读取 ADC 值。
      i32温度=(int32_t) ui32温度;
   }
   /*IntMasterEnable();      //<--- 启用中断!
   taskEXIT_critical ();   //<---- 退出临界区!*/
   i32Temperature =(1475-(i32Temperature*2475)/4096)/10;//使用数据表中提供的非校准转换。
其他
   //如果平台是 LM3S9D92
   对于(i=3;i>0;i--)//运行3个循环以满足温度传感器内部的设置时间(请参阅勘误表)
   {
      ADCIntClear (ADC0_BASE、G_uisequencernum);//清除任何旧中断
      ADCProcessorTrigger (ADC0_BASE、g_uisequencernum);//启动下一个 ADC 温度转换
      while (!ADCIntStatus (ADC0_BASE、g_uisequencernum、false)){}//等待采样序列完成。
      ADCSequenceDataGet (ADC0_BASE、g_uisequencernum、&ui32温度);
      i32温度=(int32_t) ui32温度;
   }
   i32Temperature = 147-((i32Temperature*225)/1024);//计算腹腔
#endif

  pushinteger (int32_t) i32温度;

   返回1;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试重现您的结果、但没有。 我确实看到使用硬件过采样时读数稳定得多、但这是因为它对我的基准电压上的噪声取平均值(我使用的是 Launchpad)。 我没有看到对外部温度变化的响应有任何问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在输入引脚 PortE3上、我们有一个基于数字 Vcc (测量值=3、38V)的分压器(220 Ω/10kohm)、因此该引脚的输入电压略低于 Vcc。 PE3未初始化、因此为高阻抗输入。 通过降低该输入电压、温度测量变为正常。

    我们尝试使 E3成为模拟输入(Ain0)、但结果仍然相同。

    我们假设一些输入保护电路处于活动状态并对温度测量产生影响。

    这是预期行为吗?

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

    只要您低于 Vccad、输入保护电路就不是问题所在。 在采样之间、模拟多路复用器开关默认为通道0、这意味着如果源电阻在分配的采样时间内过高、引脚 PE3上的电压会影响 ADC 结果。 温度传感器上的源电阻较高。 以16MHz 运行 ADC 且仅使用4个时钟采样周期、当 PE3连接到3.3V 而不是 GND 时、我看到大约有10C 的差异。 当我将采样时间增加到16个时钟周期时、该差异消失了。

    ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_TS | ADC_CTL_IE |
    ADC_CTL_SHOLD_16 | ADC_CTL_END);
    

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

    实际上、我们还尝试在采样时间内使用更多的时钟周期、但在诸如80摄氏度的高温下、它仍然提供低读数。

    当我们使用处理器在 Ain1和 Ain2的完整12位范围内进行测量时、如果这种行为也适用于其他模拟输入、则会引起关注。 如果有关源阻抗与采样时间的文档仍然有效,您会感兴趣吗?

    我们知道 Ain0 (ADC#13)的勘误表和温度传感器的勘误表(ADC#09)、但也许应该针对这种行为扩展文本。

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

    这个问题是一个通用的 ADC、因为如果采样时间不够长、采样电容器无法与要转换的外部电压相等、那么采样电容器上之前的电荷将影响下一次转换。  数据表中记录了模拟多路复用器的最大电阻(2.5K 欧姆)和采样电容器的最大电容(10pF)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确、数据表中记录了采样电容器的充电情况。 但它需要一些非常聪明的读数来了解序列发生器的实际序列。 通过了解实际的"来自哪里"电平和输入、我们可以将其考虑在内、从而实现精确的高速测量。 令人惊讶的是、即使将 A0配置为数字输入、它似乎是温度传感器的"来自输入引脚的位置"。 从我们的测量结果来看、该引脚在存储电荷电容器最后一个采样的存储器方面影响 ADC 通道 A0和 A1。 我们在其他高速 ADC 输入上确实有一些串行电阻器来减缓高频振铃、但在采样电容器充电时、即使是100欧姆也是高阻抗。
    问:是否可以更详细地描述电容器将看到的电扫测序列?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ADC 序列发生器将在采样时间内连接为每个步进选择的模拟多路复用器通道、并在转换时间内断开连接。 如果采样时间不足、采样电容器上保留的结果电压将影响下一步的通道。 传闻证据表明、在序列间、多路复用器连接模拟通道0。 如果采样时间不足、第一步中选择的任何通道都将受到通道0采样电容器上的电压的影响。

    [引用 user="Peter Johansen "]对于采样电容器的充电、即使是100欧姆也是高阻抗

    模拟多路复用器的内部电阻最高可达2.5K 欧姆。 即使如此、在低阻抗(100欧姆)源上使用标准4周期采样时间时、我也没有遇到任何问题。

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

    感谢您尽可能地进行讨论和验证。