|
Ë«ÖØADC½»Ìæ²É¼¯£¬ÎҲɵ½µÄADC1ºÍADC2µÄÖµÊÇÒ»ÑùµÄ£¬ÕâÊÇΪʲô£¬ÎÒÒѾÅäÖóɽ»ÌæÄ£Ê½ÁË¡£
ALIGN_32BYTES (__attribute__ ((at(0x24000000))) __IO uint32_t ADC_ConvertedValue = 0);
extern float ADC_vol;
ADC_HandleTypeDef ADC1_Handle;
ADC_HandleTypeDef ADC2_Handle;
DMA_HandleTypeDef hdma_adc;
ADC_MultiModeTypeDef ADC_multimode;
static void ADC_GPIO_Mode_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__GPIOB_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = GPIO_PIN_1;
/* ÅäÖÃΪģÄâÊäÈ룬²»ÐèÒªÉÏÀµç×è */
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
static void ADC_Mode_Config(void)
{
ADC_ChannelConfTypeDef ADC_Config;
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
/* ÅäÖÃADC3ʱÖÓÔ´ */
/* HSE Frequency(Hz) = 25000000 */
/* PLL_M = 5 */
/* PLL_N = 160 */
/* PLL_P = 25 */
/* PLL_Q = 2 */
/* PLL_R = 2 */
/* ADC_ker_clk = 32000000 */
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
RCC_PeriphClkInit.PLL2.PLL2M = 5;
RCC_PeriphClkInit.PLL2.PLL2N = 180;
RCC_PeriphClkInit.PLL2.PLL2P = 8;
RCC_PeriphClkInit.PLL2.PLL2Q = 2;
RCC_PeriphClkInit.PLL2.PLL2R = 2;
RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
RCC_PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
__HAL_RCC_ADC12_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
//Ñ¡ÔñDMA1µÄStream1
hdma_adc.Instance = DMA1_Stream0;
//ADC1µÄDMAÇëÇó
hdma_adc.Init.Request = DMA_REQUEST_ADC1;
//´«Êä·½Ïò£ºÍâÉè-¡·ÄÚ´æ
hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
//ÍâÉèµØÖ·²»×ÔÔö
hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
//ÄÚ´æµØÖ·²»×ÔÔö
hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
//DMAÑ»·´«Êä
hdma_adc.Init.Mode = DMA_CIRCULAR;
//DMAµÄÈí¼þÓÅÏȼ¶£ºµÍ
hdma_adc.Init.Priority = DMA_PRIORITY_LOW;
//FIFOģʽ¹Ø±Õ
hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
//DMA³õʼ»¯
HAL_DMA_Init(&hdma_adc);
//hdma_adcºÍADC_Handle.DMA_HandleÁ´½Ó
__HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc);
ADC1_Handle.Instance = ADC1;
//ʹÄÜBoostģʽ
ADC1_Handle.Init.BoostMode = ENABLE;
//ADCʱÖÓ1·ÖƵ
ADC1_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
//ʹÄÜÁ¬Ðø×ª»»Ä£Ê½
ADC1_Handle.Init.ContinuousConvMode = DISABLE;
//Êý¾Ý´æ·ÅÔÚÊý¾Ý¼Ä´æÆ÷ÖÐ
ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
//¹Ø±Õ²»Á¬Ðø×ª»»Ä£Ê½
ADC1_Handle.Init.DiscontinuousConvMode = DISABLE;
// ADC1_Handle.Init.NbrOfDiscConversion = 0;
// ADC1_Handle.Init.NbrOfConversion = 1;
//µ¥´Îת»»
ADC1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
ADC1_Handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;
ADC1_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
//¹Ø±ÕµÍ¹¦ºÄ×Ô¶¯µÈ´ý
ADC1_Handle.Init.LowPowerAutoWait = DISABLE;
//Êý¾ÝÒç³öʱ£¬¸²¸ÇдÈë
ADC1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
ADC1_Handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
//²»Ê¹Äܹý²ÉÑùģʽ
ADC1_Handle.Init.OversamplingMode = DISABLE;
//·Ö±æÂÊΪ£º16bit
ADC1_Handle.Init.Resolution = ADC_RESOLUTION_12B;
//²»Ê¹ÄܶàͨµÀɨÃè
ADC1_Handle.Init.ScanConvMode = DISABLE;
//³õʼ»¯ ADC_MASTER
HAL_ADC_Init(&ADC1_Handle);
ADC2_Handle.Instance = ADC2;
ADC2_Handle.Init.BoostMode = ENABLE;
//ADCʱÖÓ1·ÖƵ
ADC2_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
//ʹÄÜÁ¬Ðø×ª»»Ä£Ê½
ADC2_Handle.Init.ContinuousConvMode = DISABLE;
//Êý¾Ý´æ·ÅÔÚÊý¾Ý¼Ä´æÆ÷ÖÐ
ADC2_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
//¹Ø±Õ²»Á¬Ðø×ª»»Ä£Ê½
ADC2_Handle.Init.DiscontinuousConvMode = DISABLE;
// ADC2_Handle.Init.NbrOfDiscConversion = 0;
// ADC2_Handle.Init.NbrOfConversion = 1;
//µ¥´Îת»»
ADC2_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
ADC2_Handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;
ADC2_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
//¹Ø±ÕµÍ¹¦ºÄ×Ô¶¯µÈ´ý
ADC2_Handle.Init.LowPowerAutoWait = DISABLE;
//Êý¾ÝÒç³öʱ£¬¸²¸ÇдÈë
ADC2_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
ADC2_Handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
//²»Ê¹Äܹý²ÉÑùģʽ
ADC2_Handle.Init.OversamplingMode = DISABLE;
//·Ö±æÂÊΪ£º16bit
ADC2_Handle.Init.Resolution = ADC_RESOLUTION_12B;
//²»Ê¹ÄܶàͨµÀɨÃè
ADC2_Handle.Init.ScanConvMode = DISABLE;
HAL_ADC_Init(&ADC2_Handle);
ADC_Config.Channel = ADC_CHANNEL_5;
//ת»»Ë³ÐòΪ1
ADC_Config.Rank = ADC_REGULAR_RANK_1;
ADC_Config.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
//²»Ê¹Óòî·ÖÊäÈëµÄ¹¦ÄÜ
ADC_Config.SingleDiff = ADC_SINGLE_ENDED;
//ÅäÖÃADC_MASTERͨµÀ
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);
ADC_Config.Channel = ADC_CHANNEL_5;
//ת»»Ë³ÐòΪ1
ADC_Config.Rank = ADC_REGULAR_RANK_1;
ADC_Config.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
//²»Ê¹Óòî·ÖÊäÈëµÄ¹¦ÄÜ
ADC_Config.SingleDiff = ADC_SINGLE_ENDED;
//ÅäÖÃADC_SLAVEͨµÀ
HAL_ADC_ConfigChannel(&ADC2_Handle, &ADC_Config);
//ʹÄÜADC1¡¢2
ADC_Enable(&ADC1_Handle);
ADC_Enable(&ADC2_Handle);
ADC_multimode.Mode = ADC_DUALMODE_INTERL;
//Êý¾Ý¸ñʽ
ADC_multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;
//ADC_MASTERºÍADC_SLAVE²ÉÑù¼ä¸ô3¸öADCʱÖÓ
ADC_multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_4CYCLES;
//ADCË«ÖØÄ£Ê½ÅäÖóõʼ»¯
HAL_ADCEx_MultiModeConfigChannel(&ADC1_Handle, &ADC_multimode);
//ʹÄÜDMA,´Ëº¯Êý»á¿ªÆôDMAÖжϣ¬ÐèÒªÓû§×ÔÐÐÅäÖÃDMAÖжÏÓÅÏȼ¶
HAL_ADCEx_MultiModeStart_DMA(&ADC1_Handle, (uint32_t*)&ADC_ConvertedValue, 2);
}
void Rheostat_DMA_NVIC_Config(void)
{
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
}
void ADC_Init(void)
{
ADC_GPIO_Mode_Config();
ADC_Mode_Config();
Rheostat_DMA_NVIC_Config();
HAL_ADC_Start(&ADC1_Handle);
HAL_ADC_Start(&ADC2_Handle);
}
ÏÂÃæÊǻص÷º¯Êý»ñÈ¡ADÖµ
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle) //ADC»Øµ÷º¯Êý£¬ÓÃÓÚ¶ÁÈ¡ADÖµ
{
ADC_ConvertedValue = HAL_ADCEx_MultiModeGetValue(&ADC1_Handle);
static int j=0;
//ADC_convol1²ÉÑùÖµ´æ·ÅÔÚµÍ16λ£»ADC_convol2²ÉÑùÖµ´æ·ÅÔÚ¸ß16λ£»
ADC_convol1[2*j] = (uint16_t)(ADC_ConvertedValue&0x0000ffff);
ADC_convol1[2*j+1] = (uint16_t)((ADC_ConvertedValue&0xffff0000)>>16);
j++;
if(j>=2000)
{
j=0;
__HAL_RCC_TIM3_CLK_DISABLE();
DMA_finsh=1;
}
}
Á½¸öADC²Éµ½µÄÖµÊÇÒ»ÑùµÄ |
|