ADC采样基准电压3.3V 3个通道采集数据
采集数据存放位置
ADC_ConvertedValue[0]
ADC_ConvertedValue[1]
ADC_ConvertedValue[2]
三个值对应ADC三个通道采集出来的值
实际使用过程中如果电压过大 可以分压 之后传给ADC 这时计算实际电压时也要乘以分压时的倍数 基准电压要稳定 不稳定的时候会出现计算误差。
ADC通道17内部基准值会更稳 ADC_CHANNEL_17,基准电压使用通道17会更准确,这个就是用来做ADC的基准值的,不然用稳压芯片稳定外部电压,来做参考。
ADC多通道采集时,采集转换之后数据会自动赋给我们传进去的参数ADC_ConvertedValue,然后进行下一个通道或者下一次的数据采集转换。
采集周期太快会出现采集数据失败的情况,所以在不影响使用的情况下ADC采样周期加长一点(ADC_SAMPLETIME_160CYCLES_5)
采集数据尽量多一点 做一下数据处理 比如:平均值求法
STM32L051c8T6ADC配置如下:
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
GPIO_InitTypeDef GPIO_InitStruct;
static DMA_HandleTypeDef DmaHandle;
/*##-1- 打开时钟#################################*/
/* Enable GPIO clock ****************************************/
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* ADC1 Periph clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
/* Enable DMA1 clock */
__HAL_RCC_DMA1_CLK_ENABLE();
/*##- 2-配置GPIO引脚 #########################################*/
/* ADC3 Channel8 GPIO pin configuration */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*##- 3- Configure DMA #####################################################*/
/*********************** 配置DMA参数***************************/
DmaHandle.Instance = DMA1_Channel1; DMA通道1
DmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY;
DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;
DmaHandle.Init.MemInc = DMA_MINC_ENABLE;
DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
DmaHandle.Init.Mode = DMA_CIRCULAR;
DmaHandle.Init.Priority = DMA_PRIORITY_MEDIUM;
DmaHandle.Init.Request = DMA_REQUEST_0;
/* 初始化新的DMA传输工具 */
HAL_DMA_DeInit(&DmaHandle);
HAL_DMA_Init(&DmaHandle);
/* 关联DMA句柄 */
__HAL_LINKDMA(hadc, DMA_Handle, DmaHandle);
/* NVIC配置DMA输入数据中断 */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}
void ADC_init(void)
{
/* ### - 1 -ADC外部初始化 #################################### */
AdcHandle.Instance = ADC1;
AdcHandle.Init.OversamplingMode = DISABLE; //过采样特性失能
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;//ADC时钟源选择
AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
AdcHandle.Init.LowPowerAutoWait = DISABLE;
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; //12位ADC采样值
AdcHandle.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_5; //ADC采样时间
AdcHandle.Init.ScanConvMode = ADC_SCAN_ENABLE;//
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
AdcHandle.Init.ContinuousConvMode = ENABLE;
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
AdcHandle.Init.DMAContinuousRequests = ENABLE; //连续转换使能
HAL_ADC_Init(&AdcHandle) ;
//2ADC 校准 使用之前尽量校准
HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);
/* ### - 3 - ADC通道初始化 ######################################## *
sConfig.Channel = ADC_CHANNEL_0; //ADC通道
sConfig.Rank = 1; //转换次序编号
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = 2;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = 3;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
HAL_ADC_Start_DMA(&AdcHandle,ADC_ConvertedValue, 3) ; //ADC采样开启
//ADC_ConvertedValue存放ADC采样的值
}
使用是什么时候用到采样值就直接获取ADC_ConvertedValue数组里面的值。