ch32v307vct6 adc dma方式獲取數(shù)據(jù)互相干擾問題

用dma的方式獲取adc的值,adc1,11個通道,取到的值相互干擾怎么解決,代碼下面這樣



int? length=11;

u16 ADC_ConvertedValue[11]={0,0,0,0,0,0,0,0,0,0,0};


//ADC對應(yīng)GPIO初始化配置以及ADC初始化配置

void adc_Init(void)

{

? ? GPIO_InitTypeDef GPIO_InitStructure;

? ? ADC_InitTypeDef ADC_InitStructure;

? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE ); //使能GPIO時鐘和ADC

? ? RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ADC時鐘分頻為6分頻

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //GPIO模式為模擬輸入

? ? GPIO_Init(GPIOA, &GPIO_InitStructure);

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOB, &GPIO_InitStructure);

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOC, &GPIO_InitStructure);


? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;? //配置ADC為獨(dú)立模式

? ? ADC_InitStructure.ADC_ScanConvMode = ENABLE;? ? ? ? //多通道模式下開啟掃描模式

? ? ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;? //設(shè)置開啟連續(xù)轉(zhuǎn)換模式

? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //設(shè)置轉(zhuǎn)換不是由外部觸發(fā)啟動,軟件觸發(fā)啟動

? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //設(shè)置ADC數(shù)據(jù)右對齊

? ? ADC_InitStructure.ADC_NbrOfChannel = length;? ? ? ? ? ?//規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目

? ? ADC_Init(ADC1, &ADC_InitStructure);? ? ? ? ? ? ? ? ? ? //根據(jù)ADC_InitStructure中指定的參數(shù)初始化ADC1寄存器


? ? ADC_Cmd(ADC1, ENABLE);? ? ? //使能ADC1


? ? ADC_ResetCalibration(ADC1); //重置ADC1校準(zhǔn)寄存器。

? ? while(ADC_GetResetCalibrationStatus(ADC1)); //等待復(fù)位校準(zhǔn)結(jié)束

? ? ADC_StartCalibration(ADC1); //開啟AD校準(zhǔn)

? ? while(ADC_GetCalibrationStatus(ADC1));? ? ? //等待校準(zhǔn)結(jié)束

}


//ADC DMA模式配置

void DMA_Tx_Init( void )

{

? ? DMA_InitTypeDef DMA_InitStructure;

? ? RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1, ENABLE ); //使能開啟DMA時鐘

? ? DMA_DeInit(DMA1_Channel1); //復(fù)位DMA控制器


? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->RDATAR;? //配置外設(shè)地址為ADC數(shù)據(jù)寄存器地址

? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; //配置存儲器地址為讀取ADC值地址

? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;? ? ? ? ? ? ? //配置數(shù)據(jù)源為外設(shè),即DMA傳輸方式為外設(shè)到存儲器

? ? DMA_InitStructure.DMA_BufferSize = length;? ? ? ? ? ? ? ? ? ? ? //設(shè)置DMA數(shù)據(jù)緩沖區(qū)大小,此處設(shè)置為length

? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//設(shè)置DMA外設(shè)遞增模式關(guān)閉

? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ? ? ? ?//設(shè)置DMA存儲器遞增模式開啟

? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //設(shè)置外設(shè)數(shù)據(jù)大小為半字,即兩個字節(jié)

? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;? ? ? ? ?//設(shè)置存儲器數(shù)據(jù)大小為半字,即兩個字節(jié)

? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;? ? ?//設(shè)置DMA模式為循環(huán)傳輸模式

? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High; //設(shè)置DMA傳輸通道優(yōu)先級為高,當(dāng)使用一 DMA通道時,優(yōu)先級設(shè)置不影響

? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? //因?yàn)榇薉MA傳輸方式為外設(shè)到存儲器,因此禁用存儲器到存儲器傳輸方式

? ? DMA_Init( DMA1_Channel1, &DMA_InitStructure );? ? ? //初始化DMA

? ? DMA_Cmd(DMA1_Channel1 , ENABLE);? //使能DMA


}




void ADC_DMA_CONF(void)

{


? ? adc_Init();

? ? DMA_Tx_Init();

? ? /// PA0->ADC0

? ? /// PA1->ADC1

? ? /// PA2->ADC2

? ? /// PA3->ADC3

? ? /// PA4->ADC4

? ? /// PA5->ADC5

? ? /// PA6->ADC6

? ? /// PA7->ADC7

? ? /// PB0->ADC8

? ? /// PB1->ADC9

? ? /// PC0->ADC10

? ? /// PC1->ADC11

? ? /// PC2->ADC12

? ? /// PC3->ADC13

? ? // 配置 ADC 通道轉(zhuǎn)換順序?yàn)?,第一個轉(zhuǎn)換,采樣時間為55.5個時鐘周期

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10, ADC_SampleTime_55Cycles5);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 11, ADC_SampleTime_55Cycles5);


? ? // 使能ADC DMA 請求

? ? ADC_DMACmd(ADC1, ENABLE);


? ? // 由于沒有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換

? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);


}


你好可以將主頻調(diào)到72M,ADC分頻改成8分頻,因?yàn)锳DC的時鐘不能超過14M,后續(xù)還有問題請郵箱聯(lián)系我zdg@wch.cn。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频