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.

[参考译文] LAUNCHXL-F28379D:ADC 差分模式

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1511377/launchxl-f28379d-adc-diferential-mode

器件型号:LAUNCHXL-F28379D

工具/软件:

您好、  

我想在 F28379D 的差分 ADC 模式下读取变量、但在绘制数据时、信号会出现负偏移。 此外、当我增加采样频率而不是改善信号时、它开始失真。 也许您可以帮助我检查我是否做了错误的声明;我附加了我正在使用的代码。  

#include "driverlib.h"
#include "device.h"

#define EX_ADC_Resolution 16
#define ADC_BUFFER_SIZE 100 //定义数据存储缓冲区的大小

int16_t adcDifferentialResultBuffer[ADC_BUFFER_SIZE];
Volatile uint16_t adcBufferIndex =0;// volatile、因为它在 ISR 中发生了更改
Volatile int TBPRD =999;// volatile、因为它在 ISR 中发生了更改
Volatile int CMPA =10;// volatile、因为它在 ISR 中发生了更改
易失性 uint16_t acqps=14;


void configureADC (uint32_t adcBase);
void initEpwm();
void initADCSOC (void);
__ interrupt void adcA1ISR (void);

//
//主要
//
void main (void)

设备初始化();

device_initGPIO();


GPIO_setDirectionMode (16、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (16、GPIO_PIN_TYPE_STD);
GPIO_writePin (16、0);

interrupt_initModule();

Interrupt_initVectorTable();

INTERRUPT_REGISTER (INT_ADCA1、&adcA1ISR);

configureADC (ADCA_BASE);
initEpwm();
initADCSOC();


INTERRUPT_ENABLE (INT_ADCA1);


EINT;
ERTM;


EPWM_enableADCTrigger (EPWM1_BASE、EPWM_SOC_A);
EPWM_setTimeBaseCounterMode (EPWM1_BASE、EPWM_COUNTER_MODE_UP);

应该做

if (adcBufferIndex >= ADC_BUFFER_SIZE)

adcBufferIndex =0;
}

}
while (1);
}

void configureADC (uint32_t adcBase)

ADC_setPrescaler (adcBase、ADC_CLK_DIV_4_0);

ADC_setMode (adcBase、ADC_Resolution_16BIT、ADC_MODE_differential);


ADC_setInterruptPulseMode (adcBase、ADC_PULSE_END_OF_CONV);


ADC_enableConverter (adcBase);

DEVICE_DELAY_US (1000);
}


void initEPWM (void)

ePWM_disableADCTrigger (EPWM1_BASE、ePWM_SOC_A);


EPWM_setADCTriggerSource (EPWM1_BASE、EPWM_SOC_A、EPWM_SOC_TBCTR_U_CMPA);
EPWM_setADCTriggerEventPrescale (EPWM1_BASE、EPWM_SOC_A、1);


EPWM_setCounterCompareValue (EPWM1_BASE、EPWM_COUNTER_COMPARE_A、CMPA);
EPWM_setTimeBasePeriod (EPWM1_BASE、TBPRD);

EPWM_setClockPrescaler (EPWM1_BASE、
EPWM_CLOCK_DIVIDER_1、
ePWM_HSCLOCK_DIVIDER_1);

EPWM_setTimeBaseCounterMode (EPWM1_BASE、EPWM_COUNTER_MODE_STOP_FREEZE);
}


void initADCSOC (void)


ADC_setupSOC (ADCA_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、
ADC_CH_ADCIN0、acqps);

ADC_setInterruptSource (ADCA_BASE、ADC_INT_number1、ADC_SOC_NUMBER0);
ADC_enableInterrupt (ADCA_BASE、ADC_INT_number1);
ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);
}


__ interrupt void adcA1ISR (void)

GPIO_writePin (16、1);

int16_t RESULT_DIFF = ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER0);

if (adcBufferIndex < ADC_BUFFER_SIZE)

adcDifferentialResultBuffer[adcBufferIndex++]= Result_diff;
}
暴露

adcBufferIndex = 0;//复位以覆盖最旧的数据
adcDifferentialResultBuffer[adcBufferIndex++]= Result_diff;
}

ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);

if (true == ADC_getInterruptOverflowStatus (ADCA_BASE、ADC_INT_number1))

ADC_clearInterruptOverflowStatus (ADCA_BASE、ADC_INT_number1);
ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);
}


INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP1);
GPIO_writePin (16、0);
}

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

    您好:

    我可以想到您在较高采样率下看到负失调电压信号和失真的几个原因。 您能为我检查这些要点吗?

    - 对于16位分辨率、根据数据表、最小采集窗口应至少为320ns。 您选择的 ACQPS 是否满足此要求?

    - 在差分模式下,一个差分对由 ADCINx 和 ADCINx+1组成(偶数和下一个奇数通道)。 您能否确认将通道 A0和 A1用于差分测量?

    - 如何阅读 ADC 结果? 在差分模式下、结果是有符号整数。 满量程结果32767表示+VREF、而-32768表示-VREF。

    此致、

    Masoud