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.

28335和28377的ADC有哪些不一样,看寄存器的比较已经晕了

Other Parts Discussed in Thread: CONTROLSUITE

28335和28377的ADC有哪些不一样,看寄存器的比较已经晕了

  • 简单来说,F28377D/S的ADC模块个数由F28335的一个增加到了4个,并且由原来只支持12位变成每一个都可以单独配置为12位或16位,对应使用单端或差分输入。F28377D/S的每个ADC只有一个采样保持器(S/H),但原来的F28335有两个。F28377D/S的ADC采样范围由原来的3v扩大到3.3v,可同时支持内部或外部参考。它的采样机制比F28335更加灵活,使用SOC进行触发,可以采样任意通道,并且有多个触发源,还支持SOC的优先级配置。最后,F28377D/S的ADC增加了后端处理单元PPB,可以在硬件上对ADC采样结果进行处理,比较实现比较和零偏补偿等等,然后产生对应的中断或者事件对EPWM进行触发。

    如果看得比较麻烦,建议可以先了解一下Piccolo系列比如F2803x或者F2806x等的ADC是如何工作的,然后再进一步了解F28377D/S,因为后者是在前者的基础上增加了更多功能和灵活性。也可以使用TI例程进行测试进行学习。

  • 1.在F28377S上,LaunchPad只给出了ADCA和ADCB的引脚,频道选择的时候,如果我想用ADCB的第二个通道是直接使用AdcbRegs.ADCSOC1CTL.bit.CHSEL     = 2;这样吗?还是怎么回事;

    还有一个问题,如果只有AB的引脚,那C和D的引脚又在哪?是使用引脚复用吗?

  • 是的,只有ADC A和ADC B模块是有引脚接出来了的,请参考C:\ti\controlSUITE\development_kits\LAUNCHXL-F28377S\HwDevPkg路径下的原理图LAUNCHXL-F28377S.pdf第6页。如果要使用ADC C和ADC D,只能自己另画控制板,或者使用TI提供的其它开发板。

    .

    如果想对ADCINB2通道进行采样,可以使用ADC B的任意一个SOC寄存器(ADCSOCxCTL)进行配置,是通过它的CHSEL进行选择,请仔细查看该寄存器的定义和详细说明。

  • 非常谢谢你的回答,让我扫去了很多迷茫。

    我查看并阅读了你说的相关资料,并参照例程进行了AD的设置,设置如下:

    ADC初始化程序:

    AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
    AdcaRegs.ADCCTL2.bit.RESOLUTION = RESOLUTION_12BIT;//0
    AdcaRegs.ADCCTL2.bit.SIGNALMODE = SIGNAL_SINGLE;//0

    //Set pulse positions to late
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    //power up the ADC
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    ADC采样频道设置:

    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2; // SOC1 will convert pin A2
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 4; // 
    // Configure PPB to eliminate subtraction related calculation
    AdcaRegs.ADCPPB2CONFIG.bit.CONFIG = 1; // PPB is associated with SOC1
    AdcaRegs.ADCPPB2OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    ADC结果读取:

    do
    {
    //
    //convert, wait for completion, and store results
    //start conversions immediately via software, ADCA
    //
    AdcaRegs.ADCSOCFRC1.all = 0x0003; //SOC0 and SOC1

    //
    //wait for ADCA to complete, then ackn
    while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    //
    //wait for ADCB to complete, then acknowledge flag
    //
    //while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0);
    //AdcbRegs.ADCINTFLGCLR.b

    //
    //store results
    //
    AdcaResult0 = AdcaResultRegs.ADCRESULT0;
    AdcaResult1 = AdcaResultRegs.ADCRESULT1;

    asm(" ESTOP0");

    }while(1);

    在这样的情况下,在接电位器的情况下,AD并不能采集数据,您能再帮我看下错误在哪吗

  • 请详细对照TRM里这些寄存器的位设置为你程序里的值时,了解具体是什么含义。

    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2; // SOC1 will convert pin A2
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 4; //


    以上配置里,你需要采样ADC A模块的A2通道,使用的采样窗口是30,触发源为GPIO,那么你可以确定电位器接的是A2通道吗?你有通过GPIO触发ADC进行采样吗?从你的代码里看,你是使用AdcaRegs.ADCSOCFRC1.all = 0x0003; //SOC0 and SOC1 软件来触发SOC0和SOC1的,可是实际情况是它不会生效,除非TRIGSEL位等于0:

    04h ADCTRIG4 - GPIO, ADCEXTSOC