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:ADC 输入引脚不是三态的

Guru**** 2546020 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/864421/msp430g2553-adc-input-pin-is-not-tristate

器件型号:MSP430G2553

我使用 MSP430G2553对模拟输入进行采样并进一步处理。 当我检查 ADC 输入引脚 A0处的电压时、即使 输入未连接、电压也为1.4V。 然后我尝试从外部将其下拉、然后它下降到1.1V 而不是0V。我需要 ADC 的三态输入、因为我是通过精密整流器提供输入、因此我无法检测到低于1.4V 的输入电平。 这里是它 代码。

#include
int PWM (int a);
int main (void){
浮点 ERR = 0、ref = 122、Vadc = 0、Kp = 1、Ki = 0.4、P = 0、 I = 0、PImax = 1000、PI = 0;

   WDTCTL = WDTPW + WDTHOLD;

           ADC10CTL0 = SREF_1 + REFON + REF2_5V + ADC10ON+ MSC;
           ADC10CTL1 = CONSEQ_2;//重复单次转换
           ADC10AE0 = INCH_0;
           ADC10CTL0 |= ENC + ADC10SC;
           Vadc = ADC10MEM;


               while (1)
               {
                   Vadc = ADC10MEM;
                   ERR = ref - Vadc;
                   P = Kp * err;


                   如果(PI + Ki * err < PImax)
                       I = I + Ki * err;

                   PI = P + I;

                   IF (PI > PImax)
                       PI = PImax;
                  PWM (PI);
               }

           }

    int PWM (int a)  {
           P1DIR |= BIT2;
           P1SEL |= BIT2;
           TA0CCR0 = 1000;//在定时器 A0捕捉/比较0寄存器中将周期设置为1000us。
           TA0CCTL1 = OUTMOD_7;
           TA0CCR1 = A;//电源开启的周期(以微秒为单位)。 它是时间的一半、这相当于50%的占空比。
           TA0CTL = tassel_2 + MC_1;//tassel_2选择 SMCLK 作为时钟源、并且 MC_1告诉它向上计数到 TA0CCR0中的值。
    返回0;


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

    您是否正在使用 Launchpad? 在 Launchpad 上(每个)、P1.0连接到 LED。 只需移除跳线、也可以使用、例如 A3 A4。

    >       ADC10AE0 = INCH_0;

     INCH_0 = 0、因此这不会太大。 尝试:

    >       ADC10AE0 = BIT0;   //使 A0 (P1.0)成为一个模拟输入引脚  

    [编辑:我刚刚记住 A3 (P1.3)是一个按钮。 我认为 A4 (P1.4)是不受影响的、但无论如何要检查。]

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

    我尝试移除跳线、但问题仍然存在。 也尝试使用 A1 - A6端口、但问题未解决。  

    对于 A0以外的位、ADC 未给出正确的结果。 当输入从0到2.5V 变化时、它显示的值介于0x267到0x287之间

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

    > 表示 A0以外的位

    这是否意味着 A0现在正在生成正确的结果?

    > 也尝试使用 A1 - A6端口

    您是如何(确切地)尝试其他端口的? 您是否设置了 INCH 和相关的 AE0位?

    USB-UART 通过"桥接"接头(J101)上的 RXD/TXD 跳线使用 P1.1-2。 P1.3连接到按钮、该按钮(取决于您拥有的 Launchpad)可能连接上拉电阻器、也可能没有连接上拉电阻器。

    您的输入源是什么? 如果源阻抗不是很低、SHT=0会非常短。

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

    这是否意味着 A0现在正在生成正确的结果?

    A0从未产生错误的结果。但是移除跳线后、通道 A0仍然会出现1.5V 左右的引脚电压问题、 因此、当通过精密整流器提供输入时、当输入电压低于1.5V 时、它不会对输入进行采样、因为当输出端子处的电压大于输入时、精密整流器将不工作(我已通过精密连接信号源与 ADC 的连接图 整流器)。 因此、在我的应用中、引脚(ADC 输入)必须是三态的。

     我尝试使用 A4通道并设置 INCH_4和 AE0位4、但它未显示正确的结果、但 即使未连接输入源、输入引脚上的电压仍约为1.5V。 这是代码

    #include
    int PWM (int a);
    int main (void){
    浮点 ERR = 0、ref = 600、Vadc = 0、Kp = 1、Ki = 0.4、P = 0、 I = 0、PImax = 1000、PI = 0;

       WDTCTL = WDTPW + WDTHOLD;

               ADC10CTL0 = SREF_1 + REFON + REF2_5V + ADC10ON+ MSC;
               ADC10CTL1 = CONSEQ_2 + INCH_4;//重复单次转换
               ADC10AE0 = BIT4;    //使 A4 (P1.4)成为一个模拟输入引脚
               ADC10CTL0 |= ENC + ADC10SC;
               Vadc = ADC10MEM;

               //_Bis_SR_register (GIE);


                   while (1)
                   {

                       Vadc = ADC10MEM;
                       ERR = ref - Vadc;
                       P = Kp * err;


                       如果(PI + Ki * err < PImax)
                           I = I + Ki * err;

                       PI = P + I;

                       IF (PI > PImax)
                           PI = PImax;
                       如果(PI < 0)
                           PI = 0;
                      PWM (PI);
                   }

               }

        int PWM (int a)  {
               P1DIR |= BIT2;
               P1SEL |= BIT2;
               TA0CCR0 = 1000;//在定时器 A0捕捉/比较0寄存器中将周期设置为1000us。
               TA0CCTL1 = OUTMOD_7;
               TA0CCR1 = A;//根据 PI 输出设置占空比
               TA0CTL = tassel_2 + MC_1;//tassel_2选择 SMCLK 作为时钟源、并且 MC_1告诉它向上计数到 TA0CCR0中的值。
        返回0;


    此波形显示 A4引脚配置为输入通道后的电压。

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

    当我在 G2 Launchpad (修订版1.5)上运行此代码并将 P1.4连接到 GND/VCC 时、我分别得到0/0x3FF。 未连接时、它看起来稳定在1.5V 左右、但我可以用手指触摸引脚来改变它+/-0.4V。 这或多或少是我期望它的行为方式。

    我不确定我是否理解整流器的影响、但我不是 EE。

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

    整流器的输出应具有极低的阻抗、并且能够毫无问题地驱动 MCU 输入。

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

    由于该二极管、您的信号源只能提供电流。 您需要在该二极管的 ADC 侧进行一些操作来灌入电流、否则它将会浮动。 一个1K 电阻器应该能够实现这个目的。 尽管它可能会因采样时间而异。

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

    中等负载电阻器应该能够实现这一目的。 通常、您会跟随具有某种峰值检测器的精密整流器。

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

    一个1K 电阻器应该能够实现这个目的。

    我也尝试过、但在中不起作用、因此我在 MCU 和整流器之间添加了缓冲级。 现在它工作正常