工具/软件:
您好、
我想在 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);
}