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:读取NTC时出现问题

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/629358/msp430g2553-trouble-in-reading-ntc

部件号:MSP430G2553

您好,

我正在使用10k NTC热敏电阻和MSP430G2553 MCU设计一个简单的温度计。

读数电路是典型的分压器,NTC被拉至Vcc。 下拉电阻器是4.7K电阻器。

使用的ADC通道为A0 (MCU的WFP 1.0)。

转换是使用查找表条目的线性插值进行的,我在该表中输入了电压和温度值。

在我决定在分压器信号和ADC输入之间放置一个RC低通滤波器之前,代码似乎工作正常(r = 10k - C = 100N)

在这一修改之后,我有以下奇怪的行为:

_如果我在安装了过滤器的情况下启动系统,温度始终为0°C

_如果我取下滤波器的电容器,则读数正确。 接下来,如果我再次放置电容器(在系统运行时),电压值不再改变。

为什么电容器会对读数产生这种影响?

提前感谢

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

    为了帮助您了解正在发生的情况,请提供硬件设置的某种图示/图表,以及如何配置GPIO和ADC外设的代码片段。

    此致,

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

    您好,

    硬件设置如下所示:

    VCC是3.5V,来自启动板。 电路的其余部分包括由MCU驱动的4位7段显示屏。

    下面是用于配置端口的代码

    void init_gPIO_port (void)

    reset_all_gPIO();

    CONFIG_GPIO _AS输入(S2_PORT,S2_PIN);                //配置为输入的WFP 1.3 (开关S2)
    enable_port_interrupt (S2_port,S2_PIN);                //启用WFP 1.3 (交换机S2)中断
    enable_pull_fer器(S2_port,S2_PIN);                 //启用WFP 1.3 (开关S2)内部上/下电阻
    Set_GPIO高电平(S2_port,S2_PIN);                      //为WFP 1.3 选择上拉电阻器(开关S2)
    select_H_to_L_interrupt_edge (S2_port,S2_PIN);         //用于WFP 1.3 的High_to_Low Edge中断(交换机S2)

    clean_interrupT_flag (S2_port,S2_PIN);                  //清除WFP 1.3 的中断标志(开关S2)

    CONFIG_GPIO_AS输出(DEG_PORT,DEG_PIN);            //WFP 2.6 作为输出(deg符号)

    CONFIG_GPIO _AS输出(DIG1_PORT,DIG1_PIN);            //WFP 1.1 作为输出(数字1)
    CONFIG_GPIO _AS输出(DIG2_PORT,DIG2_PIN);            //WFP 1.2 作为输出(数字2)
    CONFIG_GPIO _AS输出(DIG3_PORT,DIG3_PIN);            //WFP 2.7 作为输出(数字3)
    CONFIG_GPIO_AS输出(DIG4_PORT,DIG4_PIN);            //WFP 1.4 作为输出(数字4)

    CONFIG_GPIO _AS输出(SEGDEG_PORT,SEGDEG_PIN);    //WFP 1.5 AS输出(DEG段)

    CONFIG_GPIO _AS输出(SEGA_PORT,SEGA_PIN);          //WFP 1.6 作为产出(段A)
    CONFIG_GPIO_AS输出(SEGB_PORT,SEGB_PIN);          //WFP 1.7 作为输出(B段)
    CONFIG_GPIO_AS输出(SEGC_PORT,SEGC_PIN);          //WFP 2.0 作为输出(C段)
    CONFIG_GPIO_AS输出(SEGD_PORT,SEGD_PIN);         //WFP 2.1 作为输出(D段)
    CONFIG_GPIO_AS输出(SEGE_PORT,SEGE_PIN);         //WFP 2.2 作为产出(段E)
    CONFIG_GPIO_AS输出(SEGF_PORT,SEGF_PIN);         //WFP 2.3 作为产出(段F)
    CONFIG_GPIO _AS输出(SEGG_PORT,SEGG_PIN);         //WFP 2.4 作为输出(G段)
    CONFIG_GPIO _AS输出(DOT_PORT,DOT_PIN);            //WFP 2.0 作为输出(段点)

    CONFIG_PORT_AS GPIO (DEG_PORT,DEG_PIN);              //将WFP 2.6 配置为GPIO,用于度点驱动
    CONFIG_PORT_AS GPIO (DIG3_PORT,DIG3_PIN);             //将WFP 2.7 配置为数字3驱动的GPIO
    }

    void init_ADC10 (void)

    ADC10_CONFIG_CK (ADC10CK_OSC,ADC10CK_DIV_1);                                            //将ADC10内部振荡器除以1
    ADC10_CONFIG_SH (ADC10SHS_OSC,ADC10SHT_16);                                             //为CK设置16个S-H周期和内部振荡器
    ADC10_CONFIG_VREF (ADC10REF_VREF,ADC10VREF_2_5V);                                      //设置内部2.5V参考电压
    ADC10_CONFIG_DTC (ADC10_1block_DTC,ADC10_RESET_CON_DTC,MAX_NR_of_Conversions);  //配置DTC
    ADC10_INTERRUCT_ENable();
    }

    温度由以下功能感测

    void sense温度(void)

    ADC10_PWR_ON();                                                            //启用转换
    当(ADC10CTL1和占线);                                                     //如果ADC10正忙,请等待
    ADC10_SELECT_CHANNELS (ADC10CH_A0,ADC10AE_A0);                          //选择WFP 1.0 作为ADC输入
    ADC10_CONFIG_operations (ADC10_REPEATE_SINGLE_CH,ADC10DF_Straight);  //重复单通道,直向数据格式
    ADC10_ENable_DTC (temp_samples);                                           //将数据传输到下一个阵列(DTC自动递增地址)
    ADC10_START_conversion ();                                                //启用转换和转换开始
    同时(!(ADC10CTL0和ADC10IFG));                                              //如果ADC10正忙,请等待
    ADC10_Clear_IFG();                                                        //清除中断
    ADC10_halt ();                                                             //停止ADC10
    ADC10_PWR_OFF();                                                         //禁用转换

    }

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

    由于ADC会测量电压,然后您使用代码将其转换为温度,因此让我们继续关注电压读数上升的原因。 您是否尝试使用示波器测量A0上的输入电压,以查看该针脚上的电压是否是您所期望的?

    请问,您的解决方案是否需要低通滤波器来实现如此缓慢的模拟系统? 热敏电阻会逐渐对温度变化作出响应,因此,如果没有高频噪声或切换,则确实需要低通滤波器。 我只是问一下,因为根据您的说法,系统在没有RC滤波器的情况下运行良好。

    此致,

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

    Matt,

    我只为我的微控制器编程培训做这个小项目,因此它不会有真正的应用领域。

    目前我正在使用启动板为系统供电,但将来的想法是使用电池和直流-直流开关转换器。 因此,我放置了R-C过滤器。

    不管怎样,我检查了A0输入端的电压,我发现读数与实际电压值一致。

    特别是当系统在安装了电容器的情况下启动时,电压只有几毫伏。

    在第二种情况下,当我在系统运行的情况下放置电容器时,即使我尝试加热热热热敏电阻,电压也会以相同的值被吸入。

    假设我肯定不能使用筛选器,现在我很想了解这种行为的原因。

    此致

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

    这种电压行为非常奇怪。 在调试意外电压行为时,最好隔离电路的各个方面,以确定问题的根本原因。

    尝试在冷却时测量C1阳极上的电压,并在热敏电阻未连接到A0输入时加热,以查看是否仍然存在奇数行为。 如果是,则外部部件或电路存在问题。 如果您发现问题只发生在连接到ADC的电路上,那么RC低通滤波器和ADC的内部电路可能会出现一些奇怪的情况,这可能是您看到RC出现意外读数的原因 连接了低通滤清器。

    此致,

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

    如果您认为此问题已解决,请继续并选择我的上述帖子已解决您的问题,以便我们可以关闭此线程。

    谢谢!

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

    R3实际上不是10K,而是1兆或其他一些非常高的价值,这是否有任何可能性?  或者R3可能只是有缺陷?  这可能解释了您所看到的内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Matt,
    很抱歉,我没有再处理这个问题,因为我参与了其他问题。
    无论如何,我同意你的看法,这个问题应该通过部分地调试电路来解决。
    我想我们可以闭上这个线。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    George,
    不是,电阻是10k,我用万用表测量过。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    达尼洛

    感谢您的回复,我当然祝您好运! 如果您有任何其他问题,请随时为您的问题添加新的线索。

    此致,

    Matt Calvo