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.

[参考译文] EK-TM4C1294XL:ADC 差分模式

Guru**** 2482105 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/707171/ek-tm4c1294xl-adc-differential-mode

器件型号:EK-TM4C1294XL

您好!

我已将 ADC 设置为单端操作、并提供了准确的读数。

但是、当我将其更改为差分模式时、我会得到一些毫无意义的值。 我按照差分示例操作、不确定发生了什么情况;当我将 PE2接地、将 PE3接至3.3V 时、我得到的 ADC 读数为4095、这是正确的。 但是、如果我将 PE2和 PE3接地、我会得到大约1900的读数、它在这个范围内会跳很多+/-几百个读数。 在单端操作中、当我将 PE3接地时、我将获得预期读数0、峰值为4、偶尔会一次。

我有一个电流传感器(通过 LEM 提供电压输出的 XS 20-NP)、该传感器有一个基准电压、我正在尝试测量基准电压(大约2.5V)与电压输出之间的差异。 如果没有电流、传感器输出和参考值将为我提供相同的 2.5V 值。 当 PE2连接到电压基准引脚且 PE3连接到 Vout 引脚时、我本来期望的、在没有电流过的情况下、我会为 ADC 获得0值、但是、当两个引脚都接地时、我将获得相同类型的值。

以下是我的代码、我们希望您能提供任何帮助。

void ConfigureADC (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
GPIOPinTypeADC (GPIO_Porte _BASE、(GPIO_PIN_3 | GPIO_PIN_2));
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0))
{
}
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceStepConfigure (ADC0_BASE、3、0、(ADC_CTL_D | ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END));
ADCSequenceEnable (ADC0_BASE、3);
ADCIntClear (ADC0_BASE、3);
}
void ADCGetValue (void)
{
uint32_t ADCValues[1];
uint32_t VoltageValue = 0;
uint32_t 电流值= 0;
TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);
ADCProcessorTrigger (ADC0_BASE、3);
while (!ADCIntStatus (ADC0_BASE、3、false))
{
}
ADCIntClear (ADC0_BASE、3);
ADCSequenceDataGet (ADC0_BASE、3、ADCValues);
VoltageValue =(uint32_t)((float)(ADCValues[0]*3300)/4096);
AmperageValue =(10000*((uint32_t)(ADCValues[0]- 3103)))/775;
UARTprintf ("ADC 值=%d\n"、ADCValues[0]);
UARTprintf ("电压值(mV):%3D\n"、VoltageValue);
UARTprintf ("当前值(mA):%3D\n"、安培值);
// SysCtlDelay (10000000);
}

void ADCTimerConfig (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);
TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE);
TimerClockSourceSet (Timer1_base、timer_clock_system);
TimerLoadSet (Timer1_base、timer_A、g_ui32SysClock);
IntRegister (INT_TIMER1A、ADCGetValue);
IntPrioritySet (INT_TIMER1A、2);//更改优先级
TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);
TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT);
IntEnable (INT_TIMER1A);
TimerEnable (Timer1_base、timer_A);



} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还有一个观察结果、在 PE2接地、PE3接传感器输出、无电流流经传感器的差分操作中、我看到的是2.9V、实际电压约为2.5V。 当我使用单端操作程序对 MCU 进行重新编程时、它的读数为2.5V、这正是它应该读取的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您在 Vref+、Vref-、VIN+和 VIN-上驱动什么。 预期的 ADC 值是多少?

    请确保您的两个输入确实处于"差分模式"、而不是两个以接地为基准的输入。 有关详细信息、请参阅 ADC 数据表。 以下摘录。

    差分模式下采样的电压是奇数通道和偶数通道之间的差值:
    ■Ω 输入正电压:VIN+= VIN_LEV (偶数通道)
    ■Ω 输入负电压:VIN-= VIN_ODD (奇数通道)
    输入差分电压定义为:VIND = VIN+- VIN-、因此:
    ■如果 VIND = 0、则转换结果= 0x800
    ■如果 VIND > 0、则转换结果> 0x800 (范围为0x800–0xFFF)
    ■如果 VIND < 0、则转换结果< 0x800 (范围为0–0x800)
    使用差分采样时、以下定义相关:
    ■Ω 输入共模电压:VINCM =(VIN+ VIN-)/ 2.
    ■基准正电压:VREFP
    ■基准负电压:VREFN
    ■基准差分电压:VREFD = VREFP - VREFN
    ■基准共模电压:VREFCM =(VREFP + VREFN)/2
    以下条件在差分模式下提供最佳结果:
    ■VIN_EVEN 和 VIN_ODD 必须在(VREFP 至 VREFN)范围内才能实现有效转换
    结果
    ■最大可能的差分输入摆幅或最大差分范围为:-VREFDto
    VREFD、因此最大峰间输入差分信号为(+VREFD --VREFD)= 2 *
    VREFD= 2 *(VREFP - VREFN)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的错误、我应该更仔细地阅读数据表