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.

[参考译文] MSP432WARE:MSP432P401R 中 ADC14的故障

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1186920/msp432ware-trouble-with-adc14-in-msp432p401r

器件型号:MSP432WARE

大家好、

我现在正在使用 ADC14创建一个项目、但 AD 结果似乎是错误的值。

这些是代码、

我已经设置了 ADC 输入通道的 P8SEL0和 P8SEL1。

unsigned long AD_Converter(unsigned short channel)
{
    unsigned long temp;
    unsigned short loop;

    temp=0;
    for(loop=0;loop<100;loop++)
    {
        __enable_irq();
        NVIC->ISER[0] |= 1 << ((ADC14_IRQn) & 31); //Enable ADC interrupt in NVIC module
        ADC14->CTL0 = ADC14_CTL0_SHT0_2 | ADC14_CTL0_SHP | ADC14_CTL0_ON; // Sampling time, S&H=16, ADC14 on
        ADC14->CTL1 = ADC14_CTL1_RES_3; // Use sampling timer, 14-bit conversion results
        switch(channel)
        {
            case Base:
                ADC14->MCTL[0] |= ADC14_MCTLN_INCH_21; // A21 ADC input select; Vref=AVCC
                break;
            case Back:
                ADC14->MCTL[0] |= ADC14_MCTLN_INCH_20; // A20 ADC input select; Vref=AVCC
                break;
            case Leg:
                ADC14->MCTL[0] |= ADC14_MCTLN_INCH_19; // A19 ADC input select; Vref=AVCC
                break;
        }
        ADC14->IER0 |= ADC14_IER0_IE0; // Enable ADC conv complete interrupt
        ADC_Flag=0;
        ADC14->CTL0 |= ADC14_CTL0_ENC | ADC14_CTL0_SC; // Start sampling/conversion
        while(ADC_Flag==0); // Use sampling timer, 14-bit conversion results
        temp+=ADC14->MEM[0];
    }
    temp=temp/100;
    return temp;
}

void ADC14_IRQHandler(void)
{
    ADC_Flag=1;
    ADC14->IER0 &= ~ADC14_IER0_IE0; // Disable ADC conv complete interrupt
}

原理图布线是一个15K 欧姆电阻器和一个连接到3V3电源和 GND 的 VR。

使用 ADC14将模拟信号传输到数字信号。

我不更改 VR、但我得到了 ADC 结果的差值。

甚至我在 ADC 输入通道和 GND 之间添加一个电容。

我使用仪表测量 ADC 通道的电压、电压值相同。

下图是 CCS 调试环境的屏幕截图。

我没有调整 VR、电压值也没有改变、但我得到了差分 AD 结果。

如何解决问题?

我的代码是否有任何错误?

BR、

Yu-Chuan、Chen

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

    您好、Yu-Chuan、

     TI.com 不再提供 MSP432P、因此对该器件的支持将受到限制。 话虽如此、 我建议您 :

     -是否在 MSP432WARE 库中尝试一些示例? 您是否会看到相同的问题? 如果它们正常工作、请参考这些示例来构建您的应用。

     -如果这些示例在您的电路板上也出现故障,则可能是硬件问题。 在这种情况下、您是否只有一个通道存在问题、或者其他通道也读取了错误的值? 请尝试其他渠道进行确认。  

     -您能在不同的电路板上重复同样的问题吗?

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

    我不确定我是否理解您的接线、但如果您有15K 输入阻抗进入引脚、则 SHT0=2可能太短、无法使采样电容器稳定。

    TRM (SLAU356I)第22.2.6.3节给出了基于输入阻抗的所需采样/保持时间的公式。 作为一个快速实验、尝试将 SHT0设置为一个较大的值、并查看您的症状是否发生变化。

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

    您好、Charles、

    感谢您的回复。

    如何进入 MSP432WARE 库?

    我通常会在每个 MCU 上获得 TI.com 技术支持的示例代码。

    BTW、

    我用以下方法解决了这个问题。

    使用多通道采样并获取我使用过的 AD 通道的每个结果。

    我可以为应用获得正确的 AD 结果。

    unsigned long AD_Converter(unsigned short channel)
    {
    	unsigned long temp,temp0,temp1,temp2;
    	unsigned short loop;
    
    	temp0=0;
    	temp1=0;
    	temp2=0;
    	for(loop=0;loop<100;loop++)
    	{
    		__enable_irq();
    		NVIC->ISER[0] |= 1 << ((ADC14_IRQn) & 31);							//Enable ADC interrupt in NVIC module
    
    	    ADC14->CTL0 = ADC14_CTL0_ON |										//ADC14 on
    	            ADC14_CTL0_MSC |											//ADC14 multiple sample and conversion
    	            ADC14_CTL0_SHT0__192 |										//extend sampling time
    	            ADC14_CTL0_SHP |											//ADC14 sample-and-hold pulse-mode select
    	            ADC14_CTL0_CONSEQ_3;										//Repeat-sequence-of-channels
    		//ADC14->CTL1 = ADC14_CTL1_RES_2;										// Use sampling timer, 12-bit conversion results
    		ADC14->CTL1 = ADC14_CTL1_RES_3;										// Use sampling timer, 14-bit conversion results
    		ADC14->MCTL[0] |= ADC14_MCTLN_INCH_21;								// A21 ADC input select; Vref=AVCC
    		ADC14->MCTL[1] |= ADC14_MCTLN_INCH_20;								// A20 ADC input select; Vref=AVCC
    		ADC14->MCTL[2] |= ADC14_MCTLN_INCH_19 | ADC14_MCTLN_EOS;			// A19 ADC input select; Vref=AVCC, end seq.
    		ADC_Flag=0;
    		ADC14->IER0 |= ADC14_IER0_IE2;										// Enable ADC conv complete interrupt
    		ADC14->CTL0 |= ADC14_CTL0_ENC | ADC14_CTL0_SC;						// Start sampling/conversion
    		Back_Timer=0;
    		while(ADC_Flag==0)								// Use sampling timer, 14-bit conversion results
    		{
    			if(Back_Timer>1)//avoid stuck
    				break;
    		}
    		temp0+=ADC14->MEM[0];
    		temp1+=ADC14->MEM[1];
    		temp2+=ADC14->MEM[2];
    	}
    	temp0=temp0/100;
    	temp1=temp1/100;
    	temp2=temp2/100;
    	switch(channel)
    	{
    		case Base:
    			temp = temp0;
    		break;
    		case Back:
    			temp = temp1;
    		break;
    		case Leg:
    			temp = temp2;
    		break;
    	}
    	return temp;
    }

    BR、

    余俊、陈

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

    大家好、Norten、

    [引用 userid="315608" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1186920/msp432ware-trouble-with-adc14-in-msp432p401r/4473210 #4473210"]

    如何进入 MSP432WARE 库?

    [/报价]

     请从 https://www.ti.com/tool/download/SIMPLELINK-MSP432-SDK/3.40.01.02下载 MSP432P SimpleLink SDK。  

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

    您好、Charles、

    感谢您的回复。

    我已安装 MSP432P SimpleLink SDK。

    我更喜欢使用经典的编码方式、因此如果没有寄存器设置、我就无法获得代码的含义。

    尽管如此、我使用另一种方法来实现相同的应用、并且它可以正常工作。

    我在回复中按了"Resolved (已解决)"、感谢您的帮助。

    我将查看 SimpleLink SDK 中的示例代码。

    BR、

    Norton