多通道adc

由于目前手頭的開發(fā)板剛剛燒掉,無法驗證如下程序,請官方查看如下程序,看是否有問題,003芯片,三通道,使用dma adc采集,開啟轉換后使用?while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))判斷轉換完畢,后期會將while中的程序放置在TIM中斷中,周期采集

#include "debug.h"


u16 TxBuf[10];

void ADC_Function_Init(void)

{

? ? ADC_InitTypeDef? ADC_InitStructure = {0};

? ? GPIO_InitTypeDef GPIO_InitStructure = {0};


? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

? ? RCC_ADCCLKConfig(RCC_PCLK2_Div8);


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOC, &GPIO_InitStructure);


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOD, &GPIO_InitStructure);


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOD, &GPIO_InitStructure);


? ? ADC_DeInit(ADC1);

? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

? ? ADC_InitStructure.ADC_ScanConvMode = ENABLE;//多通道需要使能,掃描模式

? ? ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續(xù)轉換

? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//沒有外部觸發(fā)

? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

? ? ADC_InitStructure.ADC_NbrOfChannel = 3;//轉換三個通道

? ? ADC_Init(ADC1, &ADC_InitStructure);


? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_241Cycles);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 2, ADC_SampleTime_241Cycles);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_241Cycles);


? ? ADC_Calibration_Vol(ADC1, ADC_CALVOL_50PERCENT);

? ? ADC_DMACmd(ADC1, ENABLE);

? ? ADC_Cmd(ADC1, ENABLE);


? ? ADC_ResetCalibration(ADC1);

? ? while(ADC_GetResetCalibrationStatus(ADC1));

? ? ADC_StartCalibration(ADC1);

? ? while(ADC_GetCalibrationStatus(ADC1));

}

u16 Get_ADC_Val(u8 ch)

{

? ? u16 val;


? ? ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_241Cycles);

? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);


? ? while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

? ? val = ADC_GetConversionValue(ADC1);


? ? return val;

}


void DMA_Tx_Init(DMA_Channel_TypeDef *DMA_CHx, u32 ppadr, u32 memadr, u16 bufsize)

{

? ? DMA_InitTypeDef DMA_InitStructure = {0};


? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);


? ? DMA_DeInit(DMA_CHx);

? ? DMA_InitStructure.DMA_PeripheralBaseAddr = ppadr;

? ? DMA_InitStructure.DMA_MemoryBaseAddr = memadr;

? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

? ? DMA_InitStructure.DMA_BufferSize = bufsize;

? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

? ? DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

? ? DMA_Init(DMA_CHx, &DMA_InitStructure);

}


int main(void)

{

? ? u16 i;

? ? SystemCoreClockUpdate();

? ? Delay_Init();

#if (SDI_PRINT == SDI_PR_OPEN)

? ? SDI_Printf_Enable();

#else

? ? USART_Printf_Init(115200);

#endif

? ? printf("SystemClk:%d\r\n", SystemCoreClock);

? ? printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

? ? ADC_Function_Init();

? ? DMA_Tx_Init(DMA1_Channel1, (u32)&ADC1->RDATAR, (u32)TxBuf,3);

? ? while(1)

? ? {



? ? ? ? DMA_Cmd(DMA1_Channel1, ENABLE);

? ? ? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);

? ? ? ? while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

? ? ? ? ADC_SoftwareStartConvCmd(ADC1, DISABLE);

? ? ? ? DMA_Cmd(DMA1_Channel1, DISABLE);

? ? ? ? for(i = 0; i < 3; i++)

? ? ? ? {

? ? ? ? ? ? printf("%04d\r\n", TxBuf[i]);

? ? ? ? ? ? Delay_Ms(10);

? ? ? ? }

? ? }

}


您好,針對你的例程做了一下修改,參考附件例程,測試應該是沒問題的

icon_rar.gifADC DMA.zip



嗯,如果我想在需要時才開始轉換,不用就停止,只轉換一次,那么可以用while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));判斷轉換是否完成?


您好,可以的,若只轉換一次,這種情況下不用DMA也可以,ADC可以關閉連續(xù)轉換。


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

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