我一开始是读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:
你好,手头暂时没有开发板,不过有如下建议:首先如果你用的自己做的板子,请再检查下是否有虚焊。如果你手头还有这个开发板,请想办法用同一个程序进行交叉验证,看看是否存在外设损坏的情况。
TI中文支持网



