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.

[参考译文] MSP430-ADC10:从ADC10中多次读取任意可能的PIN选择

Guru**** 2548020 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/577392/msp430-adc10-the-multiple-read-from-adc10-for-any-possible-pin-selection

部件号:MSP430-ADC10

大家好!

这是我在论坛上的第一期。 我在使用MSP430的机器人项目上遇到了问题。 因此,我想从MSP上的多个引脚读取ADC值。 当我选择PIN0作为引脚的起始引脚时,引脚为PIN1,PIN2,PIN3,一切正常,读数正常, 值正常。 此外,我想通过蓝牙模块传输这些数据,因此我不能使用PIN1和PIN2 (PIN1和PIN2保留用于UART通信)。 因此,我修改了引脚配置和必要的寄存器更改,并选择了PIN0,PIN3,PIN4,PIN5来读取ADC值,但以前工作的代码不起作用。 我正在共享下面的代码,如果您遇到此类问题,请联系我。 感谢您的关注。

此致

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

    您的代码似乎没有附加到帖子中。 您是否可以使用重复您遇到的问题的简化代码片段进行回复? 另外,您运行此代码的MSP430器件型号是什么?

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

    您好,Caleb,

    对粗心大意感到抱歉。 我正在使用MSP430 G2553,我通过使用单通道, 每个PIN的单转换模式,但我共享第一个不工作的代码,实际上我想知道为什么它不工作,或者为什么msp430g2553不能测量任何PIN间隔的电压。 感谢Caleb的关注!

    "第一个无法正常工作的代码"

    #include <msp430g2553.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <signal.h>

    无符号int电压[4];

    void PIN_Config(void);
    void ADC_Config (void);
    void ADC_Reading (void);

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;

    PIN_Config();
    ADC_Config();

    而(1){
    ADC_Reading();
    _enable_interrupts();
    }
    }

    void PIN_Config (void){
    P1SEL = BIT1 | BIT2;
    P1SEL2 = BIT1 | BIT2;
    P1DIR = 0xF0;
    P1OUT (输出)&=~0x00;
    P1IE |= 0x0F;
    P1IES |= 0x0F;
    P1IFG = 0x00;
    P2DIR = 0xFF;
    P2OUT &=~0x00;
    }

    void ADC_Config (void){
    ADC10CTL1 = inch_5+ CONSEQ_3;
    ADC10CTL0 = SREF_0 + ADC10ON + ADC10IE + MSC;
    ADC10DTC0 = ADC10CT;
    ADC10DTC1 = 0x4;
    ADC10AE0 |= 0x39;
    }

    void ADC_Reading(void){
    ADC10CTL0 &=~ENC;
    while (ADC10CTL1和BUSY);
    ADC10SA =(无符号int)电压;
    ADC10CTL0 |= ENC + ADC10SC;
    }

    "第二个运行良好的准则"

    #include <msp430g2553.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <signal.h>

    无符号int X_Axis;
    无符号int Y_Axis;
    无符号int Z_Axis;
    无符号int Gripper;

    void PIN_Config(void);
    void ADC_Config (void);
    void ADC_Reading_X_Axis (void);
    void ADC_Reading_Y_Axis (void);
    void ADC_Reading_Z_Axis (void);
    void ADC_Reading_Gripper (void);

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;

    PIN_Config();
    ADC_Config();

    而(1){
    ADC_Reading_X_Axis();
    ADC_Reading_Y_Axis();
    ADC_Reading_Z_Axis();
    ADC_Reading_Gripper ();

    _enable_interrupts();
    }
    }

    void PIN_Config (void){
    P1SEL = BIT1 | BIT2;
    P1SEL2 = BIT1 | BIT2;
    P2DIR = 0xFF;
    P2OUT &=~0x00;
    }

    void ADC_Config (void){
    ADC10CTL0 = SREF_0 + ADC10ON + ADC10IE;
    }

    void ADC_Reading_X_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_0 + CONSEQ_0;
    ADC10AE0 |= BIT0;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    X_Axis = ADC10MEM;
    }

    void ADC_Reading_Y_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_3 + CONSEQ_0;
    ADC10AE0 |= BIT3;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Y_Axis = ADC10MEM;
    }

    void ADC_Reading_Z_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_4 + CONSEQ_0;
    ADC10AE0 |= BIT4;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Z_Axis = ADC10MEM;
    }

    void ADC_Reading_Gripper (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_5 + CONSEQ_0;
    ADC10AE0 |= BIT5;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Gripper = ADC10MEM;
    }

    #pragma vector = ADC10_vector
    __interrupt void ADC10_ISR(void)

    }

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

    您好,CAN,

    您能否更具体地说明错误代码导致的问题? 您是否看到错误值,无值等? 此外,您是否已了解 MSP430G2553的MSP430Ware示例? 示例msp430g2x33_ADC10_14.c显示了如何以与您尝试完成的操作非常相似的方式使用信道重复序列模式。  

    此致,  
    Caleb Overbay

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

    无符号int电压[4];

    void PIN_Config(void);
    void ADC_Config (void);
    void ADC_Reading (void);

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;

    PIN_Config();
    ADC_Config();

    而(1){
    ADC_Reading();
    _enable_interrupts();
    }
    }

    void PIN_Config (void){
    P1SEL = BIT1 | BIT2;
    P1SEL2 = BIT1 | BIT2;
    P1DIR = 0xF0;
    P1OUT (输出)&=~0x00;
    P1IE |= 0x0F;
    P1IES |= 0x0F;
    P1IFG = 0x00;
    P2DIR = 0xFF;
    P2OUT &=~0x00;
    }

    void ADC_Config (void){
    ADC10CTL1 = inch_5+ CONSEQ_3;
    ADC10CTL0 = SREF_0 + ADC10ON + ADC10IE + MSC;
    ADC10DTC0 = ADC10CT;
    ADC10DTC1 = 0x4;
    ADC10AE0 |= 0x39;
    }

    void ADC_Reading(void){
    ADC10CTL0 &=~ENC;
    while (ADC10CTL1和BUSY);
    ADC10SA =(无符号int)电压;
    ADC10CTL0 |= ENC + ADC10SC;
    }


    在此代码中,当PIN0,PIN1,PIN2,PIN3用作模拟输入(ADC10CTL1 = inch_3+ CONSEQ_3和ADC10AE0 |= 0x0F;)时,从ADC读取的值是正确的,但当我将输入引脚更改为PIN0,PIN3,PIN4,PIN5 (C10AQ= IN0,C10AQ= 5)时,IN= 值不正确,例如有时坏值,有时像无读数。 虽然下面的代码是解决此问题的一种方法,并且它运行良好,但为什么上面的代码不工作,这是我的问题。

    #include <msp430g2553.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <signal.h>

    无符号int X_Axis;
    无符号int Y_Axis;
    无符号int Z_Axis;
    无符号int Gripper;

    void PIN_Config(void);
    void ADC_Config (void);
    void ADC_Reading_X_Axis (void);
    void ADC_Reading_Y_Axis (void);
    void ADC_Reading_Z_Axis (void);
    void ADC_Reading_Gripper (void);

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;

    PIN_Config();
    ADC_Config();

    而(1){
    ADC_Reading_X_Axis();
    ADC_Reading_Y_Axis();
    ADC_Reading_Z_Axis();
    ADC_Reading_Gripper ();

    _enable_interrupts();
    }
    }

    void PIN_Config (void){
    P1SEL = BIT1 | BIT2;
    P1SEL2 = BIT1 | BIT2;
    P2DIR = 0xFF;
    P2OUT &=~0x00;
    }

    void ADC_Config (void){
    ADC10CTL0 = SREF_0 + ADC10ON + ADC10IE;
    }

    void ADC_Reading_X_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_0 + CONSEQ_0;
    ADC10AE0 |= BIT0;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    X_Axis = ADC10MEM;
    }

    void ADC_Reading_Y_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_3 + CONSEQ_0;
    ADC10AE0 |= BIT3;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Y_Axis = ADC10MEM;
    }

    void ADC_Reading_Z_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_4 + CONSEQ_0;
    ADC10AE0 |= BIT4;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Z_Axis = ADC10MEM;
    }

    void ADC_Reading_Gripper (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_5 + CONSEQ_0;
    ADC10AE0 |= BIT5;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Gripper = ADC10MEM;
    }

    #pragma vector = ADC10_vector
    __interrupt void ADC10_ISR(void)

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

    您好,CAN,

    有关无法正常工作的代码的一些注释:

    1. 尝试在ADC10CTL0中增加样品和保持时间。
      1. 尝试ADC10SHT_2
    2. 我看到您已经为ADC启用了中断,但没有使用它们。 当转换开始时,您需要给它足够的时间进行完整测量。 读取之前的值可能意味着它们不正确。 在访问结果或开始另一个转换之前,请尝试等待直至ADC中断标志已设置。 在前面提到的MSP430Ware示例中可以找到这方面的一个示例。  
    3. 最后,我强烈建议更仔细地研究MSP430Ware示例。 它的功能与您在这里尝试实现的功能非常相似。  

    此致,  
    Caleb Overbay

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

    再次感谢您的关注,Caleb,但我使用上面分享的第二个代码解决了问题。 然而,你提到你的最后一条评论与读数不正确有关的情况,却发生在我身上。 在下面的代码中,I从Y,Z和Gripper读取正确的值,但X不正确。 我猜ADC没有足够的时间来测量正确的值,但这只发生在X (首先测量)上。 如何修复? 每次转换前我都有"while (ADC10CTL1 & BUSY)"行。 这还不够吗? 此外,代码有时正在运行时,我还会收到“Isr16.asm”警告。 这意味着什么?如何解决? 最后,您对"我看到您已经为ADC启用了中断,但没有使用它们"的理解是什么。 ? 再次感谢您的回复。

    #include <msp430g2553.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <signal.h>

    Int X_Axis;
    Int Y_轴;
    Int Z_轴;
    Int Gripper;

    void PIN_Config(void);
    void Time_Config (void);
    void UART_Config(void);
    void ADC_Config (void);
    void ADC_Reading_X_Axis (void);
    void ADC_Reading_Y_Axis (void);
    void ADC_Reading_Z_Axis (void);
    void ADC_Reading_Gripper (void);

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;

    PIN_Config();
    Time_Config();
    UART_Config();
    ADC_Config();

    而(1){
    ADC_Reading_X_Axis();
    ADC_Reading_Y_Axis();
    ADC_Reading_Z_Axis();
    ADC_Reading_Gripper ();

    _enable_interrupts();
    }
    }

    void PIN_Config (void){
    P1SEL = BIT1 | BIT2;
    P1SEL2 = BIT1 | BIT2;
    P2DIR = 0xFF;
    P2OUT &=~0x00;
    }

    void Time_Config (void){
    DCOCTL = 0;
    BCSCTL1 = CALC1_1MHz;
    DCOCTL = CALDCO_1MHz;
    }

    void UART_Config (void){
    UCA0CTL1 || UCSSEL_2;
    UCA0BR0 = 104;
    UCA0BR1 = 0;
    UCA0MCTL = UCBRS_1;
    UCA0CTL1 &=~UCSWRST;
    IE2 |= UCA0TXIE;
    }

    void ADC_Config (void){
    ADC10CTL0 = SREF_0 + ADC10ON + ADC10IE;
    }

    void ADC_Reading_X_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_0 + CONSEQ_0;
    ADC10AE0 |= BIT0;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    X_Axis = ADC10MEM;
    UCA0TXBUF = X_Axis;
    }

    void ADC_Reading_Y_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_3 + CONSEQ_0;
    ADC10AE0 |= BIT3;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Y_Axis = ADC10MEM;
    UCA0TXBUF = Y_Axis;
    }

    void ADC_Reading_Z_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_4 + CONSEQ_0;
    ADC10AE0 |= BIT4;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Z_Axis = ADC10MEM;
    UCA0TXBUF = Z_Axis;
    }

    void ADC_Reading_Gripper (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_5 + CONSEQ_0;
    ADC10AE0 |= BIT5;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Gripper = ADC10MEM;
    UCA0TXBUF = Gripper;
    }

    #pragma vector = ADC10_vector
    __interrupt void ADC10_ISR(void)

    ADC10MEM =(ADC10MEM >> 7);
    }

    #pragma vector=USCIAB0TX_vector
    __interrupt void USCI0TX_ISR(void)

    IE2 &=~UCA0TXIE;
    }

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

    您好,CAN,

    我之前的所有评论都是为了回答您的问题,即为什么第一组"不工作"的代码失败。 我仍然建议尝试通过一系列转换来完成此任务,而不是使用您创建的单通道方法。 单通道方法需要更长的时间来执行。

    现在回答您关于为什么单通道方法上的X读数不起作用的问题。 为什么要在ADC ISR中移动ADC10MEM寄存器? 我怀疑这是您问题的原因。 它在代码中似乎没有作用,如果ISR在ADC_Reading_XXXX()之前执行,它将破坏您的结果。 与"while (ADC10CTL1 & BUSY)"一起使用的方法是轮询实现,不需要使用中断。 如果不打算使用ADC中断,则应在AADC10CTL0寄存器中禁用它们。  另外,尝试将采样和保持时间从当前设置的4增加到8个ADC时钟周期。

    最后,请查看MSP430Ware中提供的ADC代码示例。 它们显示了如何正确使用应用程序的中断,就像这个应用程序一样。

    此致,

    Caleb Overbay

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

    首先,我研究了MSP430 Ware ADC的示例,但使用不同的PIN选择(如我的项目)时出现了任何问题。 它仅使用PIN0和PIN1,因此使用连续的PIN选择。 当我连续连接引脚时,我的代码也运行良好。

    因此,在阅读您的评论之后,我对其他代码进行了一些更改;删除了ADC_ISR,禁用了中断,并将ADC10CTL寄存器中的SHT增加到8,但仍存在相同的问题。 ADC在完成X_Axis读数之前传递到Y_Axis。 我还尝试了代码中的一些“while (ADC10CTL1 & BUSY);”行,但我没有更正。 很可能,我无法将“while (ADC10CTL1 & BUSY);”放置到正确的行。

    此外,我真的想通过多个渠道的重复序列来完成此任务,但在此之前,我必须准备预览,直到第一个截止日期。 完成此部分后,我将这些数据发送到带蓝牙模块的MSP432,并将使用MSP432驱动4个具有这些数据的电机。 实际上,我为接收器零件准备了一个试用代码,但我无法在发送器零件完全结束之前尝试。 因此,如果我能够进行良好的预览,我可以通过重复序列多通道转换更改ADC部件,直到第二个截止日期。 这就是为什么我更喜欢简单的方法来快速完成这项工作。 :)

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

    您好,CAN,

    使用以下代码时,我看不到您所描述的问题。 遇到此问题时,您是在CCS调试器中查看X_Axis,Y_Axis等变量,还是尝试通过终端查看它们? 我没有调试您的UART代码,但从一眼看,我发现也可能存在问题。

    #include <MSP430-h>
    #include <stdlib.h>
    #include
    <signal_h>
    
    int X_Axis;
    int Y_Axis;
    int Z_Axis;
    int Gripper;
    
    void PIN_Config(void);
    void Time_Config (void);
    void UART_Config (void);
    void ADC_Config (void);
    void ADC_Reading_X_Axis (void);
    void ADC_Reading_Y_Axis (void);
    void ADC_Reading_Z_Axis (void);
    void ADC_Reading_Gripper (void);
    
    void main (void)
    {
    WDTCTL = WDTPW + WDTHOLD;
    
    PIN_Config();
    Time_Config();
    UART_Config();
    ADC_Config();
    
    同时(1)
    {
    ADC_Reading_X_Axis();
    ADC_Reading_Y_Axis();
    ADC_Reading_Z_Axis();
    ADC_Reading_Gripper ();
    _enable_interrupts();}
    
    }
    
    作废PIN_Config(void){
    P1SEL = BIT1 | BIT2;
    P1SEL2 = BIT1 | BIT2;
    P2DIR = 0xFF;
    P2OUT &=~0x00;
    }
    
    void Time_Config(void){
    DCOCTL = 0;
    BCSCTL1 = CALC1_1MHz;
    DCOCTL = CALDCO_1MHz;
    }
    
    void UART_Config(void){
    UCA0CTL1 || UCSSEL_2;
    UCA0BR0 = 104;
    UCA0BR1 = 0;
    UCA0MCTL = UCBRS_1;
    UCA0CTL1 &=~UCSWRST;
    IE2 |= UCA0TXIE;
    }
    
    void ADC_Config(void){
    ADC10CTL0 = SREF_0 + ADC10ON + ADC10SHT_1;
    }
    
    作废ADC_Reading_X_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_0 + CONSEQ_0;
    ADC10AE0 |= BIT0;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    X_Axis = ADC10MEM;
    UCA0TXBUF = X_Axis;
    }
    
    void ADC_Reading_Y_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_3 + CONSEQ_0;
    ADC10AE0 |= BIT3;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Y_Axis = ADC10MEM;
    UCA0TXBUF = Y_Axis;
    }
    
    void ADC_Reading_Z_Axis (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_4 + CONSEQ_0;
    ADC10AE0 |= BIT4;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Z_Axis = ADC10MEM;
    UCA0TXBUF = Z_Axis;
    }
    
    void ADC_Reading_Gripper (void){
    ADC10CTL0 &=~ENC;
    ADC10CTL1 = inch_5 + CONSEQ_0;
    ADC10AE0 |= BIT5;
    ADC10CTL0 |= ENC + ADC10SC;
    while (ADC10CTL1和BUSY);
    Gripper = ADC10MEM;
    UCA0TXBUF = Gripper;
    }
    
    
    #pragma vector=USCIAB0TX_vector
    __interrupt void USCI0TX_ISR(void)
    {
    IE2 &=~UCA0TXIE;
    } 

    此致,  
    Caleb Overbay

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

    您好,Caleb,

    当然,我正在调试器的“表达式”窗口中检查它们。 如果我总结一下我的项目,我有2轴2操纵杆模块,它具有0V至3.3V输出并为MSP430 Vcc提供电源,我进行了一些校准以轻松控制MSP432将驱动的电机,这就是我使用位移的原因。 这为每个轴提供了一个从0到7的值。 如果为0,则表示轴输出为0V或ADC10MEM值为0;如果为7,则表示轴输出为3.3V或ADC10MEM为1023。  遗憾的是,尽管所有轴(X_Axis除外)在将其置于其最大位置时都给出71023或3.3V,但X_Axis无法达到其最大值。 我正在共享调试器窗口和值的屏幕截图。 此外,我猜UART部分正在工作,我正在寄存器窗口中检查UCA0TXBUF,但如果您认为有问题,请与我分享。

    此致

    上图右侧的值与中央位置操纵杆模块有关。 当三轴给出4时,X_Axis为3。 下图的值与操纵杆的最大位置有关,如图所示,X_Axis为6,其他值为7。

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

    您好,CAN,

    由于我已经外出了几天,我对延迟回复表示歉意。 既然您已经描述了值班的原因,我想我会更好地理解您的问题。 我们首先讨论UART代码。

    当您进行ADC测量时,您会立即将结果放入TXBUF。 我建议在将任何内容写入此缓冲区之前检查TX中断标志。 通过先检查此项,您可以确保不会覆盖缓冲区中尚未发送的内容。 添加while (IFG2和UCA0TXIFG);在写入缓冲区之前应执行此操作。 另外,我看到您在UART_Config()中启用了线路IE2 |= UCA0TXIE的TX中断,但当您进入线路IE2 &=~UCA0TXIE;的ISR时,禁用这些中断。 此处采用的方法不需要中断,因此您可以简单地禁用UART中断并从代码中删除ISR。 在这里,我要再次向您介绍 具有 显示最佳实践的UART示例的MSP430Ware。  

    最后,我仍然看不到您所看到的ADC结果。 使用相同的代码并将VCC应用到X_Axis,在将ADC10MEM右移7后,我始终获得预期的结果7。 可能有多种因素导致测量差异。 MSP430G2553用户指南的22.2 .5.1 部分提供了计算最小采样时间的公式。 请查看它并查看您是否满足此X_Axis输入的规格。

    此致,  

    Caleb Overbay

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

    我对再次迟交的责任非常草率。 我在上面的回答中提到的不正确的测量基于内部连接到PIN0的LED。 当我移除PIN0和LED之间的跳线时,测量结果更好,更准确。 再次感谢您的关注。 我非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,CAN,

    很高兴听到有一个简单的解决方案。 感谢您更新您的帖子以告知我们!

    此致,
    Caleb Overbay