首先呢。还是以我用的2806X系列为例子。AD口分为两组。A和B。这两组就可以用来做差分AD的两个双入端了。2806X只有一个AD内核。但是有两个S/H模块,于是乎他的对策就是同步采样+分时转换来处理。我们首先来看看手册中8.1.6Simultaneous Sampling Mode。部分截取下来方便大家看。
大意就是说。有些时候两个通道之间的采样时间延迟要求比较严格的时候就会需要同步采样的方法,选取了偶数的SOC和之后的奇数SOC(如SOC0&SOC1)偶合在一起并且由SIMULEN位来决定进行同步采样。他们有如下特点:
任何一个SOC的触发信号都能触发这一对的转换
一对转换包含了相应的A通道和B通道的转换。他们有对应的通道选择和触发选择选项。例如选择了CHSEL=2,则表示选中了A2/B2通道
同步采样
A通道先转换
每个SOC转换完之后都会触发相应的EOC信号。但让如果是想让两个通道都转换完了再来处理这两个数据,就可以选取后一个EOC信号。
A通道的转换结果保存在偶RESULT寄存器中,B通道的信号存放在奇RESULT寄存器中。
如果看不懂再看看下面的时序图就很明了了。
A/B SAMPLE&HOLD后CHANNEL A先转换,然后B转换,每个转换完后都会提起对应的EOC信号。当然如果要用CLA的提前产生中断信号,也可以看手册中的另一个时序图。
附上一小段我的初始化代码供参考
- AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//INT pulse generation occurs 1 cycle prior to ADC result latching into its result register
- AdcRegs.ADCSOC0CTL.bit.CHSEL = ChSel[0];
- AdcRegs.ADCSOC0CTL.bit.TRIGSEL = Trigsel[0];
- AdcRegs.ADCSOC0CTL.bit.ACQPS = ACQPS[0];
- AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1; // simultaneous sampling
复制代码然后呢中断信号上我选择的是
- AdcRegs.INTSEL1N2.bit.INT2SEL = IntChSel; // IntChSel causes ADCInterrupt 2
复制代码其中IntChsel值为1,代表EOC1也就是后一个数据转换完的结束信号。
本人英文能力有限,如果有误欢迎指正谢谢~~