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.

TMS320F28377D: AD采集

Part Number: TMS320F28377D

本人想用28377芯片的16位差分采集,但是接线之后用16位分辨率的数据转换公式处理不太对,但是将转换公式中的65536换成4096就对了,这是为什么,是16位坏了吗

  • 你好,你软件配置正确了吗?可能你使用的还是12位的ADC。

  • 正确配置过了,然后接线是A0和A1通道相减

  • 你使用的是什么模式?你注意到了下图两点吗?

  •     AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);

    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; // 使用 ADCINA0 通道
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = 63; // 采样窗口长度
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // 使用软件触发

    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; // 使用 ADCINA1 通道
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 63; // 采样窗口长度
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 1; // 使用软件触发

    基本就改了这几个配置,然后公式模样是16位的,就把65535换成4096就可以,不知道为什么

  • 使用了EALLOW语句吗?方便的话分享下程序。

  • void ConfigureADC(void)
    {
    EALLOW;

    // 配置 ADC 控制寄存器和电源控制寄存器
    AdcaRegs.ADCCTL2.bit.PRESCALE = 6; // ADCCLK 分频器设置为 /4
    AdcbRegs.ADCCTL2.bit.PRESCALE = 6; // ADCCLK 分频器设置为 /4
    AdcdRegs.ADCCTL2.bit.PRESCALE = 6; // ADCCLK 分频器设置为 /4
    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);
    AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
    AdcSetMode(ADC_ADCD, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

    // 设置 ADC 的触发位置
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdcdRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    // 启动 ADC 电源
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    EDIS;
    }

    void SetupADCSoftware(void)
    {

    EALLOW;
    // 配置 ADC SOC0 和 SOC1
    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; // 使用 ADCINA0 通道
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = 63; // 采样窗口长度
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // 使用软件触发

    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; // 使用 ADCINA1 通道
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 63; // 采样窗口长度
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 1; // 使用软件触发

    AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; // 使用 ADCINB0 通道
    AdcbRegs.ADCSOC0CTL.bit.ACQPS = 14; // 采样窗口长度
    AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // 使用软件触发

    AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; // 使用 ADCINB1 通道
    AdcbRegs.ADCSOC1CTL.bit.ACQPS = 14; // 采样窗口长度
    AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 1; // 使用软件触发

    AdcdRegs.ADCSOC0CTL.bit.CHSEL = 0; // 使用 ADCINB0 通道
    AdcdRegs.ADCSOC0CTL.bit.ACQPS = 14; // 采样窗口长度
    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // 使用软件触发

    AdcdRegs.ADCSOC1CTL.bit.CHSEL = 1; // 使用 ADCINB1 通道
    AdcdRegs.ADCSOC1CTL.bit.ACQPS = 14; // 采样窗口长度
    AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = 1; // 使用软件触发

    // 配置 ADC 中断控制
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1; // EOC1 生成 ADC 中断
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; // 使能 ADC 中断
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除 ADC 中断标志

    AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1; //end of SOC1 will set INT1 flag
    AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
    AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared

    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 1; //end of SOC1 will set INT1 flag
    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
    EDIS;
    }

    这是AD配置部分的代码

  • 我输入的信号是个0-2V的方波,是不是输入信号的问题

  • AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // 使用软件触发

    该位为0才是软件触发。

    对于差分模式CHSEL是选中了两个通道的,所以你ADCA的SOC0和SOC1是冲突的。

    将ADCA的SOC1屏蔽掉再试一下。

  • 软件触发哪里我是选择的定时器触发,注释是当时忘记改了

    等我把soc1屏蔽掉我再看看,非常感谢您的解答

  • 好的,不客气