目前DSP28335 需要在ADCA上采集8路ADC值,使用DMA搬运数据,代码如下
static void adc_config(void)
{
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // 150 / (2*3) = 20M
EDIS;
InitAdc();
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 0 Non-Cascaded Mode
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //选择管脚ADCINA0
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; //ADCINA1
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; //ADCINB0
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; //ADCINB1
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 7; // Set up ADC to perform 4 conversions for every SOC
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //连续运行模式
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // Enable Sequencer override feature
}
static void adc_dmaconfig(void)
{
volatile unsigned int *dmadest;
volatile unsigned int *dmasource;
DMAInitialize();
memset((void *)dma_adcbuf, 0, sizeof(dma_adcbuf));
memset((void *)dma_adcbuf_end, 0, sizeof(dma_adcbuf_end));
dmadest = dma_adcbuf;
dmasource = &AdcMirror.ADCRESULT0; //Point DMA source to ADC result register base
DMACH1AddrConfig(dmadest, dmasource);
DMACH1BurstConfig(7, 1, 10);
DMACH1TransferConfig(9, 1, 0);
DMACH1WrapConfig(0, 0, 0, 1);
DMACH1ModeConfig(DMA_SEQ1INT, PERINT_ENABLE,
ONESHOT_DISABLE, CONT_DISABLE,
SYNC_DISABLE, SYNC_SRC,
OVRFLOW_DISABLE, SIXTEEN_BIT,
CHINT_END, CHINT_ENABLE);
StartDMACH1();
}
请问我是否可以控制ADC采集的是哪一路,也就是我现在需要第一路的数据时采集第一路,需要第二路的时候发一条指令采集第二路
Green Deng:
你好,我觉得你得先考虑一下怎么判断需要第几路数据。如果能判断第几路的话即使采样还是8路同时进行,你也可以只提取其中的某一路数据。
当然,你说的方式肯定也是可以的,F28335的SOC还是比较灵活的。
,
user5197967:
因为我现在每一路外面都接了一个多路开关,也就是一个ADC通道可能需要采集四路模拟量,然后每个多路开关都需要写地址,所以我需要知道我现在采集的是哪一路,根据对应的路去切多路开关
,
Green Deng:
ADC的触发源可以设置为外部引脚信号触发。如果你的多路开关可以输出信号的话可以用这个信号作为触发源去触发需要转换的那一路ADC通道。