">
开始时候使用的是stdlib的库,最近发现cube库用的越来越广泛了,遂开始使用cube库来完成ADC的多通道采集实验。
ADC 的driver 在STM32F0XX_HAL_DRIVER当中,有stm32f0xx_hal_adc.c文件中,我们可以在stm32f0xx_hal_conf.h中开启 宏定义 ADC 模块。
ADC有三种工作模式,polling\ interrupt\DMA
我这里使用了polling的方式来获取多通道的数据。
首先是要声明两个参数设置的结构体
ADC_HandleTypeDef AdcHandle;
ADC_ChannelConfTypeDef sConfig;
[cpp] view plain copy
AdcHandle.Instance = ADC1;
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
AdcHandle.Init.LowPowerAutoWait = DISABLE;
AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
AdcHandle.Init.ScanConvMode = ADC_SCAN_ENABLE;
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
AdcHandle.Init.ContinuousConvMode = ENABLE;
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
AdcHandle.Init.DMAContinuousRequests = DISABLE;//
AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
/* Initialize ADC peripheral according to the passed parameters */
if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
{
Error_Handler();
}
/* ### - 2 - Start calibration ############################################ */
if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK)
{
Error_Handler();
}
基本的参数设置
比较重要的参数有ADC clock设置,sample cycle,ADC分辨率,多通道 scan mode设置。
ADC clock 有两个时钟源可以选择,一个是内部的14MHZ的时钟,,另一个为APB的时钟 最大为14MHZ.
get_ADC_value 为读取AD值的模块,形参为通道,输入通道名称得到该通道对应的AD值。
float get_ADC_value(uint32_t channel)
{
// uint32_t nResultDMA;
float temp;
start_adc();
config_channel(channel);
HAL_ADC_Start(&AdcHandle);
HAL_ADC_PollForConversion(&AdcHandle,1);
temp=HAL_ADC_GetValue(&AdcHandle);
HAL_ADC_Stop(&AdcHandle);
//temp=temp*3/4096;
return temp;
}
上海紫卓电子科技有限公司
地址:上海市嘉定工业区叶城路925号B区4幢J
电话:021-31007998
传真:021-31007998
邮件:569998567@qq.com
在线咨询:
569998567
致力成为优秀的IC供应配单专家及IC代理商
竭力为客户提供一站式电子元器件采购及IC配套服务
上海紫卓电子科技有限公司 版权所有 未经授权禁止复制或镜像
CopyRight 2020-2025 www.ic-ixys.com All rights reserved