MCU微课堂|CKS32F107xx ADC(三)

cathy的头像
cathy 发布于:周一, 07/22/2024 - 09:46 ,关键词:

双重ADC模式

独立模式的ADC采集需要在一个通道采集并且转换完成后才会进行下一个通道的采集。而双重ADC的机制就是使用两个ADC同时采样一个或者多个通道。双重ADC模式较独立模式一个最大的优势就是提高了采样率,弥补了单个ADC 采样不够快的缺点。在有2个或以上ADC模块的产品中,可以使用双ADC模式。

在使用双ADC模式时,当转换配置成由外部事件触发时,用户必须将其设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。但是,主和从ADC的外部触发必须同时被激活。同时,在双ADC模式里,为了在主数据寄存器上读取从转换数据,

即使不使用DMA传输规则通道数据,也必须使能DMA位。

启用双ADC模式的时候,通过配置ADC_CR1寄存器的DUALMOD[3:0]位,可以有几种不同的模式,具体见如下表格:

1.png

这里我们选取同步规则模式来作为实验讲解。同步规则模式是ADC1和 ADC2 同时转换一个规则通道组,ADC1是主,ADC2是从,ADC1转换的结果放在ADC1_DR 的低16位,ADC2转换的结果放在ADC1_DR的高十六位。并且必须开启DMA功能。外部触发来自ADC1的规则组多路开关(由ADC1_CR2寄存器的EXTSEL[2:0]选择),它同时给ADC2提供同步触发。在同步规则模式中,必须转换具有相同时间长度的序列,或保证触发的间隔比2个序列中较长的序列长,否则当较长序列的转换还未完成时,具有较短序列的ADC转换可能会被重启。

为了简单起见,ADC1 我们选择软件触发,ADC2必须选择外部触发,这个外部触发来自于ADC1的规则组多路开关。例程中我们选取ADC1和ADC2各采集一个通道。

配置双重ADC规则同步模式代码如下:

/* ------------------DMA模式配置---------------- */
// 配置 DMA 初始化结构体
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&( ADCx_1->DR ));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize =                                  
                  DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure);

/* ----------------ADCx_1 模式配置--------------------- */
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;  
ADC_Init(ADCx_1, &ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
ADC_RegularChannelConfig(ADCx_1, ADCx_1_CHANNEL, 1,                         
                ADC_SampleTime_239Cycles5);ADC_DMACmd(ADCx_1, ENABLE);
/* ----------------ADCx_2 模式配置--------------------- */
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv =                           
                  ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = NOFCHANEL;  
ADC_Init(ADCx_2, &ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
ADC_RegularChannelConfig(ADCx_2, ADCx_2_CHANNEL, 1,ADC_SampleTime_239Cycles5);
ADC_ExternalTrigConvCmd(ADC2, ENABLE);

双重ADC规则模式和独立模式多通道的配置基本一样,只是有几点需要注意:

DMA缓冲区数据的大小为1,数组存放的数据类型为32位的;ADC工作模式要设置为同步规则模式;两个ADC的通道的采样时间需要一致;ADC1设置为软件触发;ADC2 设置为外部触发。

相关阅读:

CKS32F107xx系列 ADC(一)

CKS32F107xx系列 ADC(二)

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 8