从问题出发:
第一,在F28335内核中,通过多路复用后有16个模拟转换输入通道,多路复用实际是用时间换资源, 16个通道肯定是不能并行转换的,这时候DSP是怎么处理的?
第二,AD模块转换的时候,实际采用2个采样保持器,2个采样保持器的结果肯定也不能同时转换,都是分时转换,而实际应用中,经常会需要同时读取两个信号,这个时候DSP是怎么实现同时采到数据的?
这16个输入通道,2路采样保持器,如何组合,先后转换顺序如何确定,如何响应触发源就成了需要解决的问题。
实际应用中,DSP是通过两个8通道排序寄存器(SEQ1和SEQ2)来完成的。
下面就详细的介绍它的排序原理和过程:
1 ADC排序器操作
SEQ1,SEQ2,是两个8状态排序其,能够分别完成8个通道的A/D转换通道的排序管理。A/D模块每次收到触发源的开始转换请求(SOC)之后,就会通过排序器来自动完成多路转换,将模拟信号引入采样保持器,并且在转换完成之后,将转换的结果存入结果寄存器。简而言之,他们的作用就相当于掌权者,分配了所有通道的优先级,决定那个通道先转换先存储。
其工作方式分为两种,
- 级联工作方式
- 双排序器工作方式。
这两种工作方式最大的区别:
- 级联方式相当于串行模式,将两个8路串联成了一个16路,只能一个一个来,而双排序器的工作方式就多了一条通道,相当于并行模式,能够保证信号的同时性。
- 初始化最多通道数时,级联方式有效通道数为16,而双排序的有效通道数为8
- 级联方式只用一个触发源,双排序需要两个
所以级联的方式比较简单,而双排序的就比较复杂一些。
补充:采样方式介绍
顺序采样:0-7或者0-15都是同一时间只转换一路信号
同步采样:0-7的一个通道和9-15的一个通道同时转换信号,但是必须要有相同的偏移量,比如ADCINA4和ADCINB4就可以,但是ADCINA7和ADCINB6就不能同一时刻转换。
2 级联工作方式的配置过程
在级联工作方式下,2个8状态的排序器构成一个16状态的排序器,
第一步:设置ADC时钟 ,运行模式和采样模式,一般为12.5M,非连续运行模式和顺序采样
第二步:设置级联的工作方式
第三步:设置最大通道数
第四步:使能SEQ1中断,通过ADCCHSELSEQx来排转换顺序。
代码例子+注释: 级联方式下的16通道打开操作
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //设置ADC时钟
AdcRegs.ADCTRL3.bit.SMODE_SEL= 0; //设置为顺序采样
AdcRegs.ADCTRL1.bit.CONT_RUN= 0; //设置为非连续运行方式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //设置为级联工作方式
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 15; //设置最大通道数
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //SEQ1对应CONV00-03
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; //SEQ2对应CONV04-07
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8; //SEQ3对应CONV08-11
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9;
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA;
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB;
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC; //SEQ4对应CONV012-05
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD;
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE;
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; //打开SEQ1中断
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 0x1; //使能 PWMA SOC触发
看到以上代码,肯定会想几个问题:
1,为什么只有SEQ1和SEQ2两个排序器,却出现ADCCHSELSEQ3和ADCCHSELSEQ4出来?
这是因为这是另外一个寄存器,这是两个概念的,DSP本身硬件上是有SEQ1和SEQ2的,而ADCCHSELSEQx时管理多通道的4个寄存器.
2,为什么只用开SEQ1中断而不开SEQ2中断?
这是因为在级联模式下,SEQ1的8状态排序和SEQ2的8状态排序公用一个触发源,所以只用开SEQ1的中断就够了。
3,级联方式下是按照什么顺序存放在结果寄存器里面的呢?
说个简单的解释,结果寄存器的顺序是不动的,而你的1-16时可以改变顺序的,如果你的1通道的排序为1,你的结果存放在结果寄存器1,如果你的16通道排序为1,你的结果存放在结果寄存器1,结果寄存器只和你的排列顺序一一对应。
3 双排序方式的配置过程
双排序的工作方式下,SEQ1和SEQ2彼此独立,同时触发源也是独立的。并且SEQ1的优先级是高于SEQ2的优先级的
第一步:设置ADC时钟 ,运行模式和采样模式,一般为12.5M,非连续运行模式和顺序采样
第二步:设置双排序的工作方式
第三步:设置最大通道数
第四步:使能SEQ1中断,通过ADCCHSELSEQx来排转换顺序。
代码例子+注释: 双排序方式下的SEQ1的0-3通道和SEQ2的8-11打开操作
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //设置ADC时钟
AdcRegs.ADCTRL3.bit.SMODE_SEL= 1; //设置为同步采样
AdcRegs.ADCTRL1.bit.CONT_RUN= 0; //设置为非连续运行方式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; //设置为级联工作方式
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x3; //设置最大通道数
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x3; //设置最大通道数
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //SEQ1对应CONV00-03
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8; //SEQ3对应CONV08-11
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9;
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA;
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; //打开SEQ1中断
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 0x1; //使能 PWMA SOC触发
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 0x1; //打开SEQ1中断
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2 = 0x1; //使能 PWMB SOC触发