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.
请问楼主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 才来一次,