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.

[参考译文] MSP430FR6047:VREF+作为 RTD 的电压源、导致不良 ADC 结果

Guru**** 2553700 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/739658/msp430fr6047-vref-as-voltage-source-for-rtd-causing-bad-adc-results

器件型号:MSP430FR6047

你好!  

我想使用具有2.0V 内部基准电压的 ADC12测量 PT1000的温度、其中 PT1000由 VREF+ 引脚供电(REFOUT 启用)。 现在 VREF+引脚上的电压为2V、但在使用 ADC 进行测量时、似乎电压会降至1V、结果波动很大。  我使用 VREF 作为传感器的电压源的原因是具有稳定的已知值。  

连接(RTD 是 PT1000的一端、另一端是 GND):

代码:

void hal_adc_init (void)
{
// PT1000 ADC 测量
GPIO_setPeripheralModuleFunctionInputPin (RTD_ADC_PORT、
RTD_ADC_PIN、
GPIO_ternary_module_function);// P2.0 A6 PT1000 ADC 输入
GPIO_setPeripheralModuleFunctionOutputPin (RTD_VCC_PORT、
RTD_VCC_PIN、
GPIO_ternary_module_function);// VREF+、// PT1000 P1.1的电源


//如果参考生成器忙,请等待
while (Ref_A_isRefGenBusy (REF_A_base))
{
;
}

//选择内部基准= 2.0V
Ref_A_setReferenceVoltage (REF_A_base、
REF_A_VREF2_0V);


//初始化 ADC12B 模块
/*
* ADC12B 模块的基地址
*使用内部 ADC12B 位作为采样/保持信号来开始转换
*使用 MODOSC 5MHZ 数字振荡器作为时钟源
*使用默认的时钟分频器/预分频器1
*不使用内部通道
*
ADC12_B_initParam initParam ={0};
initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
initParam.internalChannelMap = ADC12_B_TEMPSENSEMAP;
ADC12_B_init (ADC12_B_B_base、&initParam);

//默认情况下禁用 ADC12模块
//ADC12_B_ENABLE (ADC12_B_B_B_BASE);

/*
* ADC12B 模块的基地址
*对于内存缓冲区0-7采样/保持、持续256个时钟周期(使用 MODOSC 时为47us-64us)
*对于内存缓冲区8-15采样/保持32个时钟周期(使用 MODOSC 时为5.9us - 8us)-错误? T.H
*启用多路采样
*
ADC12_B_setupSamplingTimer (ADC12_B_BASE、
ADC12_B_CYCLEHOLD_256_CYCLES、
ADC12_B_CYCLEHOLD_256_CYCLES、
ADC12_B_MULTIPLESAMPLESENABLE);


/*
* ADC12B 模块的基地址(外部 PT1000传感器)
*配置内存缓冲区9.
*输入 A6 (外部 PT1000温度 传感器)到存储器缓冲器0
* Vref+= IntBuffer
* Vref-= AVss
*
configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_1;
configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_A6;
configureMemoryParam.refVoltageSourceSelect =
ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS;
configureMemoryParam.endOfSequence = ADC12_B_ENDOSEQUENCE;
configureMemoryParam.windowComparatorSelect =
ADC12_B_WINDOW_Comparator_DISABLE;
configureMemoryParam.特色 模式选择=
ADC12_B_different_mode_disable;
ADC12_B_configureMemory (ADC12_B_B_base、&configureMemoryParam);



} 

int32_t ADC_corrected_tp1000;//外部传感器

//打开 RTD_VCC
GPIO_setOutputLowOnPin (RTD_VCC_PORT、RTD_VCC_PIN);
GPIO_setAsOutputPin (RTD_VCC_PORT、RTD_VCC_PIN);

//启用 ADC12模块; 花费100ns 来稳定
ADC12_B_ENABLE (ADC12_B_base);

//打开基准电压和 VREF+输出
Ref_A_enableReferenceVoltageOutput (REF_A_base);
Ref_A_enableReferenceVoltage (REF_A_base);

while (Ref_A_isableReferenceVoltageOutput!= Varion_REF_A 就绪!Varion_A 就绪!
;

__disable_interrupt ();
PT1000_rdy = false;

ADC12_B_clearInterrupt (ADC12_B_B_BASE,
0、
ADC12_B_IFG1
);

//启用内存缓冲区0和1中断
ADC12_B_enableInterrupt (ADC12_B_B_BASE、
ADC12_B_IE1、
0、
0);
/*
* ADC12B 模块的基地址
*开始转换到内存缓冲区0到1
*使用多通道单次转换模式
/ADC12_B_startConversion
(ADC12_B_B_B_base、
ADC12_B_START_at_ADC12MEM1、
ADC12_B_SINGLECHANNEL);

while (PT1000_rdy = false)
{
_bis_SR_register (LPM0_bits + GIE);// LPM0、ADC10_ISR 将强制退出
__no_operation(); //仅用于调试
_disable_interrupt ();
}
_enable_interrupt ();
ADC12_B_disableInterrupt (ADC12_B_B_base、
ADC12_B_IE1、
0、
0);


//禁用 VCC_SENSE_EN
GPIO_setAsInputPin (RTD_VCC_PORT、RTD_VCC_PIN);

//关闭基准电压和 VREF+输出
Ref_A_disableReferenceVoltage (REF_A_base);
Ref_A_disableTempReferenceOutput (REF_A_base);//



禁用 ADC12_ADC12模块

/ ADC12。 传感器计算
//针对2.0V 基准误差进行调整
// ADC (已校正)= ADC (原始) x CAL_ADC20VREF_FACTOR x 1/2^15
ADC_corrected_tp1000 =(int32_t) PT1000_raw * cal_ref_ptr[CAL_ADC_20VREF_FACTOR ];
ADC_corrected_tp1000 >=15;

//调整增益
//ADC (GAIN_CORDED)= ADC (RAW) x CAL_ADC_GAIN_FACTOR x 1/2^15
ADC_CORDED_tp1000 =(Int32_t) PT1000_RAW * cal_ADC_PTR[CAL_ADC_GAIN_FACTOR ];
ADC_CORDETAGE_Tp1000 >=15;

//调整偏移
// ADC (offset_corrected)= ADC (raw)+CAL_ADC_offset
ADC_corrected_tp1000 = PT1000_raw +(int16_t) cal_ADC_PTR[CAL_ADC_OFFSET];

//计算温度
//浮点 PT1000_factor = 0.259;
//浮点=(1000*ADC_temp_t1000)
从 RAW (1000°)-402459 (t1000)(从 ADC_RAW -40p1000)(t1000)(t1000)/t1000到40p1000 (t1000)(t1000)/t1000)(t1000)(从1000°-402459 (从1000)(t1000)(t1000到40p1000)(t1000)(t1000)/t1000 (从1000 

在使用 ADC 进行测量时、是否甚至可以将内部基准电压用作电源? 我是否需要 VREF+引脚上的电容器? (需要低功耗解决方案)

感谢所有帮助和提示!

此致、
Thibult  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thibult、您好!
    对我来说、问题主要与您的硬件设置有关。 请记住、基准电压指定为拉电流最大值 1000µA μ A。 PT1000表示在0°C 时为1000欧姆。 这可能是您插入与 PT1000传感器和基准输出串联的1000 Ω 电阻器以获得2kOhm 电阻的原因、这意味着2V/2kOhm = 1000µA Ω。 但我想您在这里缺少多个方面。
    ADC 输入与传感器并联、因此当它处于活动状态时、它会额外加载基准、因此您超出了基准规格。
    PT1000的串行1k Ω 电阻和串行1k Ω 电阻为采样电容器创建了相当高的源阻抗、需要对其进行充电。 因此、即使忽略基准电流规格、您也需要很长的采样时间、以便对采样电容器进行足够准确的充电、使其达到传感器的电压。 这方面的问题通常是使用 ADC 前的缓冲器、降低源阻抗、或者在 ADC 输入端应用足够大的 C 语言时至少应用一个 RC 组件。
    最后、我在 PT1000数据表中研究了建议的 PT1000元件3mA 拉电流。

    因此,我想说,由于上述原因,这不是一个稳定可靠的设置的好方法。

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

    两个问题:
    您使用了因子2分压器
    2.根据 www.ti.com/.../msp430fr6047.pdf
    VREF+端子上的 VREF 最大负载电流为10uA。
    您的电路采用1mA 电流。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    哦、我看到相关问题是错误的、它是以下问题: e2e.ti.com/.../2688548

    数据表: www.te.com/.../DDEController

    它指定了最大500uA 的电流、因此我认为我可以正常工作。 但是、您会建议使用 GPIO 输出 VCC (3.6V)吗?

    再次感谢。
    此致、
    Thibult
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Tomasz、
    很抱歉、1000µ 10µA 基准指定了-k Ω-+k Ω。 这意味着它只能灌入10µA μ A、但能够拉取1000µA μ A。 这是有道理的、因为电压基准通常不是设计用于灌电流、而是用于拉电流。

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

    关于前一个线程、当时我没有检查 VREF 负载、我预期您确实检查过、但我告诉过您有关1mA 漏极的情况。
    使用 GPIO 不是个好主意、因为 GPIO 不能保证 VCC。
    使用 Vcc 和3.6V/0.5mA = 7.2kOhm 如果温度不低于0°C、则会为您提供6.2kOhm 的串联电阻器。
    您将得到500mV @ 0摄氏度和温度。 分辨率将下降大约2倍。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我意识到、在我对 Thibault 做出回应后。
    感谢您的解决。
    此外、我以前没有检查过:
    输入多路复用器开启时的典型值为0.5kOhm、最小未指定-极快的 SDC12_B
    我们的同事已拒绝使用外部电路进行 RTD 设计。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thibult、您好!
    从 GPIO 获取 PT1000的问题意味着将 GPIO 电源的所有噪声和变化应用于传感器。 这意味着、您的测量结果将由这些干扰和变化叠加。
    此外、我认为使用 PT1000进行的典型精确温度测量是使用所谓的惠斯通电桥进行的。 可能需要考虑的选项、包括使用外部更强大的电压或电流基准。

    此致
    Peter