ADC是指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。简单来说就是将外部检测的电压信号通过内部ADC检测为数字信号。
这里我是用的是ADC1,引脚使用PB5引脚,cube软件配置过程如下:
基本的软件编写思路:
首先开启PB口时钟和ADC1时钟,设置PB5为模拟输入模式,否则AD不能正常读数
程序开启之前复位ADC1,同时设置ADC1分频因子和ADC的位数等相关信息。
初始化ADC1参数,配置规则通道参数:
开启软件转换:
等待转换完成,读取ADC值
其中初始化部分由CUBE软件自动生成,这里就不做过多的介绍,简单的介绍一下,在主程序中如何编写;
ADC初始化部分如下:
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ConversionType = ADC_CONVERSION_WITH_DS;
hadc1.Init.SequenceLength = 1;
hadc1.Init.SamplingMode = ADC_SAMPLING_AT_START;
hadc1.Init.SampleRate = ADC_SAMPLE_RATE_16;
hadc1.Init.InvertOutputMode = ADC_DATA_INVERT_NONE;
hadc1.Init.Overrun = ADC_NEW_DATA_IS_LOST;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_12_BIT;
hadc1.Init.DownSamplerConfig.DataRatio = ADC_DS_RATIO_1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
ConfigChannel.Channel = ADC_CHANNEL_VINP3;
ConfigChannel.Rank = ADC_RANK_1;
ConfigChannel.VoltRange = ADC_VIN_RANGE_1V2;
ConfigChannel.CalibrationPoint.Number = ADC_CALIB_NONE;
ConfigChannel.CalibrationPoint.Gain = 0x00;
ConfigChannel.CalibrationPoint.Offset = 0x00;
if (HAL_ADC_ConfigChannel(&hadc1, &ConfigChannel) != HAL_OK)
{
Error_Handler();
}
主程序代码如下:
if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
{
Error_Handler();
}
uiADCVALUE = HAL_ADC_GetValue(&hadc1);
uiADCVOLTAGE = __HAL_ADC_CALC_DIFF_DATA_TO_VOLTAGE(3300, uiADCVALUE, ADC_RESOLUTION_12B);
// HAL_UART_Transmit(&huart2, (uint8_t *)&uhADCxConvertedData, 1, 0xFFFF);
printf("\r\nADC CH1 uiADCVALUE: = %4d \t\r\n", uiADCVALUE);
printf("\r\nADC CH1 uiADCVOLTAGE: = %4d \t\r\n", uiADCVOLTAGE);
HAL_Delay(500) ; 实物测试图片如下:
|