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.
我在ADC中断中放了让某个IO口状态反转的语句通过示波器查看该IO口输出的PWM波来确定ADC的采样速率,发现ADC采样速率最高只达到625KHz,请问这是为什么。有关ADC的设置如下:
InitAdc(); //ADC初始化
AdcOffsetSelfCal();
//使用内部基准电源VREFLO在内部与ADC连接,用于采样,选择ADCINB5作为所有的SOC
//选择外部引脚ADCIN5连接到B5
EALLOW;
AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1; //SOC0/SOC1的同步采样使能
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; //SOC0通道选择ADCINA4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 12; //SOC1通道选择ADCINB4
AdcRegs.ADCSOC0CTL.bit.ACQPS = 23; //采样时间
AdcRegs.ADCSOC1CTL.bit.ACQPS = 23;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 2; //SOC0触发选择CPU定时器1
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //结果锁存到寄存器前的1个周期产生INT脉冲
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; //EOC0是ADCINT1的触发源
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //在用户清除ADCINT1标志后才再产生ADCINT1脉冲
AdcRegs.INTSEL1N2.bit.INT1E = 1; //ADCINT1中断使能
EDIS;
不知道你的“最高采样速度”是怎么测得的。
不过,首先,ADC如果是定时器触发的话,那么定时器的触发频率会有影响。
其次,假定你的定时器足够快,如果想要ADC采样速度更快,你的程序中,ACQPS的值可以改小些。
最后,你的程序里,是采样了2个通道。所以,如果通过ADC中断翻转IO状态的话,IO翻转频率约为是单路ADC采样转换频率的四分之一。
ADC的采样周期决定于触发源的触发周期,你的触发源是CPU Timer1,如上面的代码,那你的采样周期625K就决定于CPUtimer,另外你的ACQPS,采样窗大小会决定你最小能达到的采样周期,采样时间越长,采样精度会越高,反之越低,如果触发源的周期小于采样窗时间了,那你的采样周期才由采样窗时间+转换时间+锁存时间决定。
InitAdc(); //ADC初始化
AdcOffsetSelfCal();
//使用内部基准电源VREFLO在内部与ADC连接,用于采样,选择ADCINB5作为所有的SOC
//选择外部引脚ADCIN5连接到B5
EALLOW;
AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1; //SOC0/SOC1的同步采样使能
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; //SOC0通道选择ADCINA4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 12; //SOC1通道选择ADCINB4
AdcRegs.ADCSOC0CTL.bit.ACQPS = 23; //采样时间
AdcRegs.ADCSOC1CTL.bit.ACQPS = 23;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 2; //SOC0触发选择CPU定时器1
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //结果锁存到寄存器前的1个周期产生INT脉冲
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; //EOC0是ADCINT1的触发源
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //在用户清除ADCINT1标志后才再产生ADCINT1脉冲
AdcRegs.INTSEL1N2.bit.INT1E = 1; //ADCINT1中断使能
EDIS;