TI中文支持网
TI专业的中文技术问题搜集分享网站

28069AD采样问题,多个SOC同采一个通道,结果有的soc跳动,有的soc读到错误值,有的正确

我一开始是读16路不同通道的ADC,结果有一路始终不正确,于是改成多个SOC读取同一个通道,结果如标题所示,有的正确,有的错误,有的在大概的范围内跳动。原来采不到的那个soc还是采不到正确的数据。

我用的是软件强制触发,在PWM终端使用 AdcRegs.ADCSOCFRC1.all = 0xFFFF;去触发所有通道。初始化也是按照软件触发取配置的

配置程序如下:

void InitAdc(void)
{
extern void DSP28x_usDelay(Uint32 Count);

EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();
EDIS;

EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 1; // Select exteral BG
// AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG
EDIS;

DELAY_US(ADC_usDELAY); // Delay before converting ADC channels

EALLOW;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;//45M CLK
EDIS;

DELAY_US(ADC_usDELAY); // Delay before converting ADC channels

// Configure ADC
EALLOW;
//默认就是 单个采样模式了

//打开这段话,就是要等待adc转换完再去读
//配合这一段
// while(AdcRegs.ADCINTFLG.bit.ADCINT1==0);
// AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

//两个转换器同时采样 不好使,不用了
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN2 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN4 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN6 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN8 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN10 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN12 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN14 = 1;

//Force SOCx flag bit to 1. This will cause a conversion to start once priority is given to SOCx.
// AdcRegs.ADCSOCFRC1.all = 0xff;

//SOC 连续采样,赋值与通道连接如下
//0-7为A0到A7
//8-16为B0到B7
AdcRegs.ADCSOC0CTL.bit.CHSEL = 8; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 1; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC3CTL.bit.CHSEL = 3; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC4CTL.bit.CHSEL = 4; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC5CTL.bit.CHSEL = 5; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC6CTL.bit.CHSEL = 6; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC7CTL.bit.CHSEL = 7; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC8CTL.bit.CHSEL = 8; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC9CTL.bit.CHSEL = 9; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC10CTL.bit.CHSEL = 10; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC11CTL.bit.CHSEL = 11; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC12CTL.bit.CHSEL = 12; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC13CTL.bit.CHSEL = 13; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC14CTL.bit.CHSEL = 14; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC15CTL.bit.CHSEL = 8; //set SOC1 channel select to ADCINA4/ADCINB4
// ADC转换优先级直接按照默认
//–>HIKE ,AD选择触发源,软件触发 P34
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0; //软件触发
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC15CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA

AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 0; //
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 0; //
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 0;

//单个通道的实际采样时间 222ns
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC4CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC5CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC6CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC7CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC9CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC10CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC11CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC12CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC13CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC14CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC15CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles

EDIS;

}

ad采样

AdcRegs.ADCSOCFRC1.all = 0xFFFF;

SampleObj.nADCResult[1] =  AdcResult.ADCRESULT1; 

。。。。。

SampleObj.nADCResult[15] =  AdcResult.ADCRESULT15; 

FLY LEE:

AdcRegs.ADCSOC8CTL.bit.CHSEL = 8

adcsoc8这个有问题,一直采到错误值,无奈啊,怀疑买到了假芯片

我一开始是读16路不同通道的ADC,结果有一路始终不正确,于是改成多个SOC读取同一个通道,结果如标题所示,有的正确,有的错误,有的在大概的范围内跳动。原来采不到的那个soc还是采不到正确的数据。

我用的是软件强制触发,在PWM终端使用 AdcRegs.ADCSOCFRC1.all = 0xFFFF;去触发所有通道。初始化也是按照软件触发取配置的

配置程序如下:

void InitAdc(void)
{
extern void DSP28x_usDelay(Uint32 Count);

EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();
EDIS;

EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 1; // Select exteral BG
// AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG
EDIS;

DELAY_US(ADC_usDELAY); // Delay before converting ADC channels

EALLOW;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;//45M CLK
EDIS;

DELAY_US(ADC_usDELAY); // Delay before converting ADC channels

// Configure ADC
EALLOW;
//默认就是 单个采样模式了

//打开这段话,就是要等待adc转换完再去读
//配合这一段
// while(AdcRegs.ADCINTFLG.bit.ADCINT1==0);
// AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

//两个转换器同时采样 不好使,不用了
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN2 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN4 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN6 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN8 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN10 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN12 = 1;
// AdcRegs.ADCSAMPLEMODE.bit.SIMULEN14 = 1;

//Force SOCx flag bit to 1. This will cause a conversion to start once priority is given to SOCx.
// AdcRegs.ADCSOCFRC1.all = 0xff;

//SOC 连续采样,赋值与通道连接如下
//0-7为A0到A7
//8-16为B0到B7
AdcRegs.ADCSOC0CTL.bit.CHSEL = 8; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 1; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC3CTL.bit.CHSEL = 3; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC4CTL.bit.CHSEL = 4; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC5CTL.bit.CHSEL = 5; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC6CTL.bit.CHSEL = 6; //set SOC0 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC7CTL.bit.CHSEL = 7; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC8CTL.bit.CHSEL = 8; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC9CTL.bit.CHSEL = 9; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC10CTL.bit.CHSEL = 10; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC11CTL.bit.CHSEL = 11; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC12CTL.bit.CHSEL = 12; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC13CTL.bit.CHSEL = 13; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC14CTL.bit.CHSEL = 14; //set SOC1 channel select to ADCINA4/ADCINB4
AdcRegs.ADCSOC15CTL.bit.CHSEL = 8; //set SOC1 channel select to ADCINA4/ADCINB4
// ADC转换优先级直接按照默认
//–>HIKE ,AD选择触发源,软件触发 P34
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0; //软件触发
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA
AdcRegs.ADCSOC15CTL.bit.TRIGSEL = 0; //PWM1A 触发 ADCSOCA

AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 0; //
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 0; //
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 0;

//单个通道的实际采样时间 222ns
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC4CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC5CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC6CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC7CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC9CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC10CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC11CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC12CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC13CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC14CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles
AdcRegs.ADCSOC15CTL.bit.ACQPS = 6; //set SOCx S/H Window to (ACQPS+1) ADC Clock Cycles

EDIS;

}

ad采样

AdcRegs.ADCSOCFRC1.all = 0xFFFF;

SampleObj.nADCResult[1] =  AdcResult.ADCRESULT1; 

。。。。。

SampleObj.nADCResult[15] =  AdcResult.ADCRESULT15; 

Xupeng(FAA) He:

回复 FLY LEE:

你好,手头暂时没有开发板,不过有如下建议:首先如果你用的自己做的板子,请再检查下是否有虚焊。如果你手头还有这个开发板,请想办法用同一个程序进行交叉验证,看看是否存在外设损坏的情况。

赞(0)
未经允许不得转载:TI中文支持网 » 28069AD采样问题,多个SOC同采一个通道,结果有的soc跳动,有的soc读到错误值,有的正确
分享到: 更多 (0)