雙重ADC模式
獨(dú)立模式的ADC采集需要在一個(gè)通道采集并且轉(zhuǎn)換完成后才會(huì)進(jìn)行下一個(gè)通道的采集。而雙重ADC的機(jī)制就是使用兩個(gè)ADC同時(shí)采樣一個(gè)或者多個(gè)通道。雙重ADC模式較獨(dú)立模式一個(gè)最大的優(yōu)勢就是提高了采樣率,彌補(bǔ)了單個(gè)ADC 采樣不夠快的缺點(diǎn)。在有2個(gè)或以上ADC模塊的產(chǎn)品中,可以使用雙ADC模式。
在使用雙ADC模式時(shí),當(dāng)轉(zhuǎn)換配置成由外部事件觸發(fā)時(shí),用戶必須將其設(shè)置成僅觸發(fā)主ADC,從ADC設(shè)置成軟件觸發(fā),這樣可以防止意外的觸發(fā)從轉(zhuǎn)換。但是,主和從ADC的外部觸發(fā)必須同時(shí)被激活。同時(shí),在雙ADC模式里,為了在主數(shù)據(jù)寄存器上讀取從轉(zhuǎn)換數(shù)據(jù),
即使不使用DMA傳輸規(guī)則通道數(shù)據(jù),也必須使能DMA位。
啟用雙ADC模式的時(shí)候,通過配置ADC_CR1寄存器的DUALMOD[3:0]位,可以有幾種不同的模式,具體見如下表格:
這里我們選取同步規(guī)則模式來作為實(shí)驗(yàn)講解。同步規(guī)則模式是ADC1和 ADC2 同時(shí)轉(zhuǎn)換一個(gè)規(guī)則通道組,ADC1是主,ADC2是從,ADC1轉(zhuǎn)換的結(jié)果放在ADC1_DR 的低16位,ADC2轉(zhuǎn)換的結(jié)果放在ADC1_DR的高十六位。并且必須開啟DMA功能。外部觸發(fā)來自ADC1的規(guī)則組多路開關(guān)(由ADC1_CR2寄存器的EXTSEL[2:0]選擇),它同時(shí)給ADC2提供同步觸發(fā)。在同步規(guī)則模式中,必須轉(zhuǎn)換具有相同時(shí)間長度的序列,或保證觸發(fā)的間隔比2個(gè)序列中較長的序列長,否則當(dāng)較長序列的轉(zhuǎn)換還未完成時(shí),具有較短序列的ADC轉(zhuǎn)換可能會(huì)被重啟。
為了簡單起見,ADC1 我們選擇軟件觸發(fā),ADC2必須選擇外部觸發(fā),這個(gè)外部觸發(fā)來自于ADC1的規(guī)則組多路開關(guān)。例程中我們選取ADC1和ADC2各采集一個(gè)通道。
配置雙重ADC規(guī)則同步模式代碼如下:
/* ------------------DMA模式配置---------------- */
// 配置 DMA 初始化結(jié)構(gòu)體
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規(guī)則模式和獨(dú)立模式多通道的配置基本一樣,只是有幾點(diǎn)需要注意:
DMA緩沖區(qū)數(shù)據(jù)的大小為1,數(shù)組存放的數(shù)據(jù)類型為32位的;ADC工作模式要設(shè)置為同步規(guī)則模式;兩個(gè)ADC的通道的采樣時(shí)間需要一致;ADC1設(shè)置為軟件觸發(fā);ADC2 設(shè)置為外部觸發(fā)。
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120348 -
adc
+關(guān)注
關(guān)注
98文章
6498瀏覽量
544629 -
dma
+關(guān)注
關(guān)注
3文章
561瀏覽量
100583
原文標(biāo)題:MCU微課堂|CKS32F107xx ADC(三)
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論