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.

[参考译文] MSP430G2553:内部温度传感器

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/643130/msp430g2553-internal-temperature-sensor

部件号:MSP430G2553

大家好,

我找到了一个内部温度传感器的示例,它工作正常。当我尝试将此代码与其他ADC通道一起使用时,问题就开始了。意思是, 我有其他正在使用的通道,设置中所有不同的是 ADC10CTL0的ADC10SHT_3 。在其他通道中,我使用 ADC10SHT_2。 当 在其他通道中启用采样和转换时,温度测量的数值不正常,并且在不同温度下ADC的输出没有变化。 我确实给ADC 30US和更多的是准确的,但仍然不好。

我相信 内部温度会有所不同,我只是不知道是什么。

请提供帮助。

10倍多

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

    您能否提供一组再现问题的最小代码,并说明您在评论中所做的更改?

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

    是的,当然。

    功能1:  

    长VBAT_SAMPLE()

    长电压= 0;
    const int num_of_SAMP =3;
    int i;
    长实际电压;
    /*现在我们有两个ADC函数,我们需要在每个函数的条目中更改通道。*/

    ADC10CTL0 = SREF_1 + ADC10SHT_2 + RefoN + ADC10ON + ADC10IE;//+ Ref2_5V;

    ADC10CTL1 = inch_0;//输入A0
    ADC10AE0 |= 0x01;// PA.0 ADC选项选择
    对于(i = 0;I< num_of_SAMP;I++)

    ADC10CTL0 || ENC | ADC10SC;//开始采样和转换
    延迟(1);
    电压+= ADC10MEM;
    }
    Voltage = voltage/num_of_SAMP;
    actual_voltage = 4000 -(int)(((890电压)/2)*10)+130;//890是4.0V的值,我们得到大约每100mV 22的下降。此函数的返回值以mV为单位。

    int j;
    IF (!(P1IN和CAP_INT.bit))

    IF ((actual_voltage<voltage_threshold)&&(actual_voltage > 2000))

    unset_heater();
    对于(j=0;j<LED_NUM;j++)
    受控(LED[j],开);//打开所有LED
    蜂鸣器(500);//激活蜂鸣器4000毫秒
    对于(j=0;j<LED_NUM;j++)
    受控(LED[j],关闭);//关闭所有LED
    low_voltage_flag = TRUE;//将此标志设置为1,以便系统知道电压已下降。

    mc = mc + mt/10;
    MT = 0;

    状态= STATUS_LPM3;//转至LPM3以节省电源,还可用于开始计算VD计时器。
    }
    否则

    //low_voltage_flag =假;
    }
    }
    返回Actual_voltage;
    ADC10CTL0 &=~ENC;
    ADC10CTL0 &=~ADC10SC;
    }

    功能2:

    int sample_light传感器()//对光传感器采样并返回采样值。 计算的值是代表感应到的光量的数值,但是无单位的

    长样本= 0;
    静态长z = 0;
    int i;
    int sample_avg_num = 10;
    int us;
    //static long CAL_V15;
    ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON+ ADC10ON + ADC10IE;
    ADC10CTL1 = inch_5;//输入A1
    ADC10AE0 |= 0x20;// PA.5 ADC选项选择
    对于(i=0;i<sample_avg_num;i++)

    ADC10CTL0 |= ENC + ADC10SC;//开始采样和转换
    us=22;//等待______ 因此,样品将是准确的
    同时(美国)

    __delay_cycles(1);//990用于1MHz
    美国--;
    }
    样本+= ADC10MEM;
    Z = ADC10MEM;
    }
    sample = sample/sample_avg_num;
    Sample =(SAMPE*(((((LON)(*CAL_15V)*100)/3.2768万))/100;//除以数据表中定义的使用ADC校准值的2^15

    #ifndef调试
    返回样本;
    #否则
    return VR_DEBUG;/260;
    #endif
    ADC10CTL0 &=~ENC;
    ADC10CTL0 &=~ADC10SC;
    }

    功能3:(带内部温度传感器)

    Int Temperature_measuring()

    //WDTCTL = WDTPW | WDTHOLD;//停止WDT
    长温度;
    int num_of_sample = 5;
    int i;
    int us=300;//等待______ 因此,样品将是准确的

    ADC10CTL1 = inch_10 | ADC10DIV_3;//温度传感器ADC10CLK/4
    ADC10CTL0 = SREF_1 | ADC10SHT_2 | REFON | ADC10ON | ADC10IE;
    ADC10CTL0 || ENC | ADC10SC;//开始采样和转换
    对于(i = 0;i < num_of_sample;I++)

    美国=300;
    同时(美国)

    __delay_cycles(1);//990用于1MHz
    美国--;
    }
    TEMP =温度+ ADC10MEM;
    }
    temp = temp/num_of_sample;
    //IntDegC1=(长)(*CAL_TEMP_15V_30C);
    //IntDegC2=(长)(*CAL_TEMP_15V_85C);
    //IntDegC4 =(temp - IntDegC1)*(55/(IntDegC2 - IntDegC1)+30;
    ADC10CTL0 &=~ENC;
    ADC10CTL0 &=~ADC10SC;
    回流(温度);
    }

    仅当在函数1和2中使用“ADC10CTL0 |= ENC + ADC10SC”时,才会出现此问题。 如果我在函数1和函数2中将此行置于注释之下,则温度函数的输出正常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    解决了这个问题,这是写在登记册上的顺序。