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.

[参考译文] MSP430FR6928:温度传感器读数

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1356750/msp430fr6928-temperature-sensor-readings

器件型号:MSP430FR6928
主题中讨论的其他器件: LM35

我尝试使用 MSP430FR6928的内部传感器提供的温度。  对于类似器件、我遵循了一个"开箱即用"应用中显示的建议。

在 ADC12_B 的配置中(程序只在代码开始时运行一次)、我执行了以下操作(包括那些与温度相关的指令:


void InitADC12_B (void){

// 1. 我创建了这个常量(浮点数) 、该常量在程序运行期间仅计算一次:

   Tmprtr_FACTOR = (((85-30)* 10)/(浮点)((CALADC12_12V_85C - CALADC12_12V_30C)* 10);


// 2. 我使用了1.2V 基准、这就是我使用的设置:

   while (Ref_A_isRefGenBusy (REF_A_BASE)
       ;

   REF_A_setReferenceVoltage (REF_A_BASE、REF_A_VREF1_2V); //选择内部基准电压= 1.2V
   Ref_A_enableReferenceVoltage (REF_A_BASE);              //内部基准打开
   Ref_A_enableTempSensor (REF_A_BASE);

   while (! Ref_A_isVariableReferenceVoltageOutputReady (REF_A_base)
       ;

//我找到了2个设置参考的例子...一个使用的 Ref_a_isRefGenBusy()和另一个使用的 Ref_a_isVariableReferenceVoltageOutputReady()...根据 DriverLib 手册中这些函数的描述,我无法理解使用了哪一个...所以我两者都使用了。

// 3. 我将使用5MHz 时钟作为 ADC12_B 时钟、因此我使用了256和512个采样周期。 这似乎是足够的。 我无法找到结果的差异。

   ADC12_B_setupSamplingTimer (ADC12_B_B_B_B_B_B_B_B_B_B_base、                              //这些是 ADC12CTL0寄存器中的 SHT0x 位
                              ADC12_B_CYCLEHOLD_512_CYCLES、
                              ADC12_B_CYCLEHOLD_16_CYCLES、              //这是默认值5MHz 至少4分频
                              ADC12_B_MULTIPLESAMPLESENABLE);           //无需为每次转换应用触发器。


   ADC12_B_initParam initParam ={0};     // initParam 是结构 ADC12_B_initParam 的实例

   initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;//程序代码将启动转换(SC)(默认)
   initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;          // CS 上的 MODOSC 5 MHz 将是转换器时钟(默认)
   initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;               //该分频器也是默认的
   initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;        //这也是分频器
   initParam.internalChannelMap = ADC12_B_TEMPSENSEMAP;                 //引出监测内核温度的内部传感器
   // initParam.internalChannelMap = ADC12_B_NOINTCH;                    //使用内部通道(例如 temp)、因此此参数被注释掉

   ADC12_B_init (ADC12_B_base、&initParam);


// 4. 温度转换的结果进入存储器4:

   //存储器4内部温度传感器
  configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_4;
  configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_TCMAP;                    //configureMemoryParam.inputSourceSelect =温度
  configureMemoryParam.refVoltageSourceSelect = ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS;
  configureMemoryParam.endOfSequence = ADC12_B_ENDOFsequence;
  configureMemoryParam.window比较 器选择= ADC12_B_WINDOW_Comparator_DISABLE;
  configureMemoryParam.differalModeSelect = ADC12_B_different_mode_disable;

  ADC12_B_configureMemory (ADC12_B_B_B_B_B_B_B_B_B_B_base、&configureMemoryParam);


// 5. 启动转换周期、当中断出现时...我就是这样做:

       Raw_Tmprtr =(ADC12_B_getResults (ADC12_B_B_B_B_B_B_B_B_B_B_B_B_MEMORY_4)- CALADC12_12V_30C);
       Last_die_Tmprtr = 10 *(长) Raw_Tmprtr * Tmprtr_FACTOR + 300;


可以看出,温度结果乘以10 ,最终在 last_die_Tmprtr ...这个 结果被保存到一个数组中,并最终被移动到 PC。
也许我错了这个、但是我认为在中断内部执行一个指令运算比进行一个除法运算更有效。
时间安排不是问题。 每2秒、uController 会执行5次测量、然后返回而不执行任何操作。

我的问题是:温度测量每2秒执行一次。 结果可以相互接近、但有时
达到2°C。 我用于开发的板几乎是空的。 它仅包含 uController、去耦电容器、对器件编程和提供对串行端口的访问的连接器、以及提供3.3V 为器件供电的基准电压发生器。 大多数测试是使用编程器提供的电压执行的。 我将使用 A2D 的多个输入、但此时它们没有信号并 通过10K 电阻器接地。 在着手构建数字滤波器之前、我想知道我的结果是否合理、或者我遇到了一些必须纠正的电气或固件问题。 我已经测试了其他监控外部信号的通道、它们对我来说看起来非常合理。 但对于所有其他通道/测量、我将使用3.3V 的外部基准。

此致

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

    如果这个中断实际上就是 MCU 正在执行的全部操作、那么每次操作需要多长时间并不重要。 2度代表多少个计数?

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

    根据写入 ROM 中的校准值:

    (CAL_ADC_12T85 - CAL_ADC_12T30)/(85-30)= 8.3  、即大约每度8次... 2°C 约16次

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

    卡洛斯先生阁下  

    您能尝试 在 https://www.ti.com/tool/download/SLAC668上运行 msp430fr69xx_adc12_10.c 示例代码吗?

    该代码是寄存器级操作、易于测试 计算 的温度功能。

    谢谢

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

    这些是我在 TemperatureDegC 中读取的值、执行6个循环:23.29  23.18  26.53  24.56  23.06 23.29   

    我还使用基于 FR5994的 Launchpad (我认为)...并在实时温度模式下使用 PC 应用程序来运行 OutOfTheBox 演示。 结果是平滑的、有时会出现两度变化的尖峰。 我实施了一个4抽头平均滤波器来暂时处理该问题。 我认为我不会使用此传感器。 我将放置一个外部 LDO。 几年前、我记得 F2619有一个类似的问题、最后我使用的是 LM35。

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

    >>这些是我在 TemperatureDegC 中读取的值,执行6循环: 23.29 23.18    26.53  24.56 23.06 23.29     

    请参阅下表注释2

    >>我实施了一个4抽头平均滤波器来暂时处理这个问题

    这是解决方案

    谢谢