在STM32WBA55微控制器上执行ADC模数转换器采集电池电压的任务我分了几个步骤进行。
ADC理解、配置ADC模块、选择正确的通道、启动转换、读取转换结果以及可能需要的滤波或处理步骤。
一、ADC理解
STM32WBA55包含一个12位ADC模数转换器。
ADC具有多个通道,可以测量来自不同信号源的模拟信号,并将其转换为数字信号以供微控制器处理。
STM32WBA55的ADC还支持多种特性和功能,高精度、低功耗、硬件过采样等,可以满足多种应用场景的需求。
STM32WBA55的MCU供电电压为3.3V,且VREF+与VDDA相连,VREF-与地相连,ADC的输入电压范围通常为0V至3.3V,ADC模块的参考电压与MCU的供电电压一致,所以ADC的参考电压为3.3V。
ADC的特性:

ADC精度:

ADC连接示意
工作原理: ADC在模拟信号转化为数字信号需要经过采样、保持、量化和编码。采样和保持在采样保持电路中完成,而量化和编码步骤则在ADC中完成。

二、 配置ADC与硬件连接

连接引脚:

连接实物图:

使用STM32CubeMX通过调用HAL库来完成。主要的功能配置是选择ADC的通道号,端口,分辨率、采样时间、扫描模式等。
三.代码:
if (HAL_ADC_Start(&hadc4) != HAL_OK)
{
/* ADC conversion start error */
Error_Handler();
}
/* Wait for ADC conversion completed */
if (HAL_ADC_PollForConversion(&hadc4, 10) != HAL_OK)
{
/* End Of Conversion flag not set on time */
Error_Handler();
}
ADC_Data = HAL_ADC_GetValue(&hadc4);
voltage=ADC_Data*3.3/4096;
HAL_Delay(1000);
printf(" Hello, World! \r\n");
printf(" www.cazqn.com\r\n");
printf(" ADC_Data = %5d\r\n",ADC_Data);
printf(" voltage = %1.3fv\r\n",voltage);
}
初始化:
void MX_ADC4_Init(void)
{
/* USER CODE BEGIN ADC4_Init 0 */
/* USER CODE END ADC4_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC4_Init 1 */
/* USER CODE END ADC4_Init 1 */
/** Common config
*/
hadc4.Instance = ADC4;
hadc4.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
hadc4.Init.Resolution = ADC_RESOLUTION_12B;
hadc4.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc4.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc4.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc4.Init.LowPowerAutoPowerOff = DISABLE;
hadc4.Init.LowPowerAutonomousDPD = ADC_LP_AUTONOMOUS_DPD_DISABLE;
hadc4.Init.LowPowerAutoWait = DISABLE;
hadc4.Init.ContinuousConvMode = DISABLE;
hadc4.Init.NbrOfConversion = 1;
hadc4.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc4.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc4.Init.DMAContinuousRequests = DISABLE;
hadc4.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_LOW;
hadc4.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc4.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_79CYCLES_5;
hadc4.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_79CYCLES_5;
hadc4.Init.OversamplingMode = ENABLE;
hadc4.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16;
hadc4.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
hadc4.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
if (HAL_ADC_Init(&hadc4) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
if (HAL_ADC_ConfigChannel(&hadc4, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC4_Init 2 */
/* USER CODE END ADC4_Init 2 */
}四、 输出结果:
