#include "VM_ADC.h" #include "delay.h" ADC_HandleTypeDef ADC2_Handler;//ADC句柄 ADC_HandleTypeDef ADC3_Handler;//ADC句柄 //初始化ADC2 //ch: ADC_channels //通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16 void ADC2_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; ADC2_Handler.Instance=ADC2; ADC2_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ ADC2_Handler.Init.Resolution=ADC_RESOLUTION_12B; //12位模式 ADC2_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右对齐 ADC2_Handler.Init.ScanConvMode=DISABLE; //非扫描模式 ADC2_Handler.Init.EOCSelection=DISABLE; //关闭EOC中断 ADC2_Handler.Init.ContinuousConvMode=DISABLE; //关闭连续转换 ADC2_Handler.Init.NbrOfConversion=1; //1个转换在规则序列中 也就是只转换规则序列1 ADC2_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式 ADC2_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为0 ADC2_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发 ADC2_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发 ADC2_Handler.Init.DMAContinuousRequests=DISABLE; //关闭DMA请求 HAL_ADC_Init(&ADC2_Handler); //初始化 sConfig.Channel = ADC_CHANNEL_11; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&ADC2_Handler, &sConfig); } //初始化ADC3 //ch: ADC_channels //通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16 void ADC3_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; ADC3_Handler.Instance=ADC3; ADC3_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ ADC3_Handler.Init.Resolution=ADC_RESOLUTION_12B; //12位模式 ADC3_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右对齐 ADC3_Handler.Init.ScanConvMode=DISABLE; //非扫描模式 ADC3_Handler.Init.EOCSelection=DISABLE; //关闭EOC中断 ADC3_Handler.Init.ContinuousConvMode=DISABLE; //关闭连续转换 ADC3_Handler.Init.NbrOfConversion=1; //1个转换在规则序列中 也就是只转换规则序列1 ADC3_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式 ADC3_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为0 ADC3_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发 ADC3_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发 ADC3_Handler.Init.DMAContinuousRequests=DISABLE; //关闭DMA请求 HAL_ADC_Init(&ADC3_Handler); //初始化 sConfig.Channel = ADC_CHANNEL_8; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&ADC3_Handler, &sConfig); } //ADC底层驱动,引脚配置,时钟使能 //此函数会被HAL_ADC_Init()调用 //hadc:ADC句柄 void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { GPIO_InitTypeDef GPIO_Initure; if(hadc == &ADC2_Handler) { __HAL_RCC_ADC2_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_Initure.Pin=GPIO_PIN_1; //PC1 GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟 GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉 HAL_GPIO_Init(GPIOC,&GPIO_Initure); } if(hadc == &ADC3_Handler) { __HAL_RCC_ADC3_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); GPIO_Initure.Pin=GPIO_PIN_10; //PF8 GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟 GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉 HAL_GPIO_Init(GPIOF,&GPIO_Initure); } } u32 Get_Adc_Value(ADC_HandleTypeDef* hadc) { u32 temp_val=0; HAL_ADC_Start(hadc); HAL_ADC_PollForConversion(hadc,10); temp_val = HAL_ADC_GetValue(hadc); return temp_val; }