请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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

