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.

2812 内部ADC 16通道采样速度能达到200K吗,

2812 内部ADC 16通道采样速度能达到(每个通道)200K, 那么AD的转换速度最低要200*16 =3.2MHz, 比手册上说的12.5MHZ小的多, 但定时器设置1/200K时时间, 定时器中断(速度)正常,  开ADC后,   ADC的中断速度低很多,比200K    是怎么回事.

  • 请问楼主ADCCLK配置是多少MHz?确认你的ACQ_PS是怎么设置的,F2812 ADC的转换速度达到3.2MHz即200uS内转完16个通道是没有问题的不管是采用顺序采样模式还是同步采样模式,另外楼主的中断服务函数执行时间由多长?如果超过5us的话,ADC中断速度体现出来也会有问题!

  • 不是200uS内, 是1/200KHz = 5uS内完成16通道的数据采集, 并读出来。

    ADC 初始化部分代码

    AdcRegs.ADCTRL3.bit.ADCCLKPS = 1; //对高速外设时钟HSPCLK进行2*ADCCLKPS分频

    AdcRegs.ADCTRL1.bit.CPS=0; //对外设时钟进一步分频产生ADCLK  1为二分频

    AdcRegs.ADCTRL1.bit.ACQ_PS = 2;//1; //采样窗口 ACQ_PS+1*ADCLK

    AdcRegs.ADCTRL1.bit.CONT_RUN=0; //0表示启动/停止模式,写1表示连续转换模式

    //1为级联(单排序)模式,0为双排序模式

    AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //级联模式,SEQ1和SEQ2作为单个16状态序列发生器工作

    AdcRegs.ADCTRL3.bit.SMODE_SEL=0; ////0为顺序采样模式,1为同时采样模式

    AdcRegs.MAX_CONV.bit.MAX_CONV=15; //最大转换通道寄存器

    AdcRegs.ADCTRL2.bit.RST_SEQ1=0; //

    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; // 启用SEQ1中断

    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; // SEQ1中断模式, 1为每隔一序列结束时设置中断

    AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; // EV-A 启动SOC1

    AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;

    //  中断改变IO脚, 用示波器观察,采样时刻及频率,

    // 中断200K时, 可观察到100K的方波

    interrupt void EVA_TIMER1_ISR(void)

    {

       // Enable more interrupts from this timer

    EvaRegs.EVAIMRA.bit.T1PINT = 1;

    // Note: To be safe, use a mask value to write to the entire

    // EVAIFRA register.  Writing to one bit will cause a read-modify-write

    // operation that may have the result of writing 1's to clear

    // bits other then those intended.

       EvaRegs.EVAIFRA.all = BIT7;

    // Acknowledge interrupt to recieve more interrupts from PIE group 2

    PieCtrl.PIEACK.all = PIEACK_GROUP2;

    if (timer & 0x0001)

    {

    LED1 =0;

    LED2 =0;

    }

    else

    {

    LED1 =1;

    LED2 =1;

    }

    timer++;

    timer &= 0x03;

    }

    // 采样频率在200K时, 周期为5uS , 既在5US内要转换16通道数据并读出。

    interrupt void ADC_16CHs(void)

    {

    ADC_CHs[0][ADC_Count] = (long) AdcRegs.RESULT0  << 12;

    ADC_CHs[1][ADC_Count] = (long) AdcRegs.RESULT1  << 12;

    ADC_CHs[2][ADC_Count] = (long) AdcRegs.RESULT2  << 12;

    ADC_CHs[3][ADC_Count] = (long) AdcRegs.RESULT3  << 12;

    ADC_CHs[4][ADC_Count] = (long) AdcRegs.RESULT4  << 12;

    ADC_CHs[5][ADC_Count] = (long) AdcRegs.RESULT5  << 12;

    ADC_CHs[6][ADC_Count] = (long) AdcRegs.RESULT6  << 12;

    ADC_CHs[7][ADC_Count] = (long) AdcRegs.RESULT7  << 12;

    ADC_CHs[8][ADC_Count] = (long) AdcRegs.RESULT8  << 12;

    ADC_CHs[9][ADC_Count] = (long) AdcRegs.RESULT9  << 12;

    ADC_CHs[10][ADC_Count] = (long) AdcRegs.RESULT10  << 12;

    ADC_CHs[11][ADC_Count] = (long) AdcRegs.RESULT11  << 12;

    ADC_CHs[12][ADC_Count] = (long) AdcRegs.RESULT12  << 12;

    ADC_CHs[13][ADC_Count] = (long) AdcRegs.RESULT13  << 12;

    ADC_CHs[14][ADC_Count] = (long) AdcRegs.RESULT14  << 12;

    ADC_CHs[15][ADC_Count] = (long) AdcRegs.RESULT15  << 12;

    ADC_Count++;

    if (ADC_Count >= FFT_LEN)

    {

    EvaRegs.T1CON.bit.TENABLE = 0;

    ADC_Count &= FFT_LEN-1;

    IsOK =1;

    }

    // Reinitialize for next ADC sequence

    AdcRegs.ADCTRL2.bit.RST_SEQ1=1;

    AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;

    PieCtrl.PIEACK.bit.ACK1=1;

    EINT;

    }

    实际工作时, 观察采样远大于5uS 才来一次,

x 出现错误。请重试或与管理员联系。